Deltas reversos de uma matriz

23

Deltas reversos de uma matriz

Uma continuação de deltas inversos de uma matriz

Sua tarefa é pegar uma matriz de números inteiros de 32 bits assinados e recompilar com os deltas invertidos.

Exemplo

A lista,

18  19  17  20  16

tem os deltas:

   1  -2   3  -4

que, quando revertido, produz:

  -4   3  -2   1

quando recompilado, usando rendimentos:

18  14  17  15  16

qual deve ser o seu valor de retorno.

A recompilação consiste em pegar o C, que é o primeiro valor da matriz. Nesse caso 18,, e aplicando os deltas a ele em ordem. Então 18 + -414, 14 + 317, e assim por diante.

Entrada / Saída

Você receberá uma lista / matriz / tabela / tupla / pilha / etc. de números inteiros assinados como entrada por qualquer método de entrada padrão.

Você deve imprimir os dados modificados novamente de qualquer forma aceitável, seguindo o método de reversão delta acima.

Você receberá N entradas 0 < N < 10onde cada número se enquadra dentro da faixa-1000 < X < 1000

Casos de teste

1 2 3 4 5      -> 1 2 3 4 5
18 19 17 20 16 -> 18 14 17 15 16
5 9 1 3 8 7 8  -> 5 6 5 10 12 4 8
6 5 4 1 2 3    -> 6 7 8 5 4 3

Notas

  • Como mencionado acima, você sempre receberá pelo menos 1 entrada e não mais que 9.
  • O primeiro e o último número da sua saída sempre corresponderão ao da entrada.
  • Somente saída de entrada padrão é aceita
  • Aplicam-se brechas padrão
  • Isso é , então a menor contagem de bytes vence!
  • Diverta-se!

E o vencedor é...

Dennis! Quem primeiro ocupou o primeiro lugar, depois se derrotou com uma solução mais curta, dando a si mesmo o primeiro e o segundo lugar!

Menção honrosa para ais523 com sua geléia, que se não fosse Dennis entrando logo antes deles, teria ficado em segundo lugar.

ATaco
fonte
1
Esses desafios delta apenas provaram o quão desnecessários são os deltas na matemática.
ATaco
4
como deltas desnecessários estão em matemática Um dos mais importantes ramos da matemática baseia-se (infinitamente pequenas) deltas
Luis Mendo
1
Eu ainda não estou feliz chappy #
ATaco
Eu não posso C um desafio matemático em PPCG ...: P
Mukul Kumar

Respostas:

9

Geléia , 5 bytes

.ịS_Ṛ

Este utiliza o algoritmo de resposta Julia de Glen O .

Experimente online!

Como funciona

.ịS_Ṛ  Main link. Argument: A (array)

.ị     At-index 0.5; retrieve the values at the nearest indices (0 and 1). Since
       indexing is 1-based and modular, this gives the last and first element.
  S    Compute their sum.
    Ṛ  Yield A, reversed.
   _   Subtract the result to the right from the result to the left.
Dennis
fonte
7
Dennis Please
Fund Monica's Lawsuit
12

Gelatina , 6 bytes

I;ḢṚ+\

Experimente online!

Como funciona

I;ḢṚ+\  Main link. Argument: A (array)

I       Increments; compute the deltas of A.
  Ḣ     Head; yield the first element of A.
 ;      Concatenate the results to both sides.
   Ṛ    Reverse the resulting array.
    +\  Compute the cumulative sum of the reversed array.
Dennis
fonte
7
Dennis Please
ATaco
Parece que você me venceu por alguns minutos. Surpreendentemente, nossos programas nem são idênticos (você tem onde eu tenho U). Não sei se isso os torna diferentes o suficiente para não considerar duplicatas.
@ ais523 Uvetoriza enquanto não, mas seu comportamento para matrizes planas é idêntico.
Dennis
4
Acho que vou excluir minha resposta, então (apesar de estar um pouco irritado desde que consegui encontrar a resposta "certa" por conta própria, e o único problema real aqui é que alguém conseguiu encontrar a mesma resposta primeiro) .
Em que formato ASCII sai como 6 bytes? A Pluma no Xubuntu diz que são 10 bytes, e Julia armazena como 0x1e22 e como 0x1e5a, cada um dos quais requer, portanto, 3 bytes.
Glen O
8

Julia, 24 bytes

!x=x[end]+x[]-reverse(x)

Esta é a maneira "inteligente" de resolver o problema. O reverso negativo da matriz tem os "deltas" revertidos e, em seguida, você só precisa corrigir o fato de que ela inicia / termina nos lugares errados.

Glen O
fonte
6

Boneco de neve 1.0.2, 72 bytes

((}#0AaGwR#`wRaCaZ`0NdE`aN0AaG:dU,0aA|1aA,nS;aM`0wRaC|#0aA*|:#nA*#;aM*))

Experimente online!

Essa é uma sub-rotina que recebe as entradas e saídas do permavar atual.

((
  }       enable variables b, e, and g
  #       store the input in variable b
  0AaG    remove the first element (take indices > 0)
  wR      wrap the array in another array
  #`wRaC  concatenate with the original input array
  aZ      zip (transpose); we now have pairs of elements
  `0NdE   obtain the number -1 (by decrementing 0)
  `aN     reverse the zipped array
  0AaG    remove first (there is one fewer delta than array elements)
  :       map over the array of pairs:
    dU     duplicate; we now have b=[x,y] e=[x,y]
    ,0aA   move the copy and get the first element; b=x g=[x,y]
    |1aA   get the second element from the copy; b=y g=x
    ,nS    subtract; we now have b=y-x which is returned from the map
  ;aM     (map)
  `0wRaC  prepend a zero (in preparation for the next step)
  |#0aA   get the first element of the original array
  *       store this in the permavar
  |:      map over the array of deltas with 0 prepended:
    #       store the permavar in e
    nA      add the delta and the permavar
    *#      make this the new value of the permavar
  ;aM     (map)
  *       "return" the resulting array from the subroutine
))
Maçaneta da porta
fonte
6

JavaScript (ES6), 45 37 bytes

a=>a.reverse(z=a[0]).map(e=>z+a[0]-e)

Porto da resposta do Mathematica da @ JHM. (Tenho certeza de que eu próprio poderia ter derivado, mas não a essa hora da noite.) Editar: salvou 8 bytes graças a @ edc65.

Neil
fonte
Existe uma razão pela qual você precisa [...e ]?
Mama Fun Roll
1
@MamaFunRoll caso contrário ele iria alterar a, que é usado mais tarde no programa
Conor O'Brien
Ah, certo, esqueci disso: P
Mama Fun Roll
37:a=>a.reverse(z=a[0]).map(e=>z+a[0]-e)
edc65
@ edc65 Bah, eu estava acordado o suficiente ontem à noite para considerar z=a[0], mas esqueci de remover o [...]e (,i,b).
Neil
4

Mathematica, 23 bytes

#&@@#+Last@#-Reverse@#&

Função sem nome. O resultado é simplesmente: reverse ((primeiro elemento) + (último elemento) - (cada elemento)).

JungHwan Min
fonte
4

Python 2, 96 74 54 44 bytes

lambda l:[l[0]+l[-1]-j for j in l][::-1]

A entrada é fornecida como uma matriz cercada por colchetes. A saída está no mesmo formato.

Agradecemos ao @Kade por salvar 22 42 bytes usando um método muito mais simples do que eu fazia antes!

Obrigado a Sherlock9 por salvar 10 bytes, eliminando o contador de índices da compreensão da lista!

Ótimo, agora, se eu jogar mais, vou pegar o problema "riscado ainda é 44". ; _;

HyperNeutrino
fonte
Que tal lambda l:[l[0]+l[-1]-l[i]for i in range(len(l))][::-1]54 bytes? :) (créditos para Glen O. para o cálculo)
Kade 5/12
Oh uau, como eu não descobri isso? Obrigado! :)
HyperNeutrino
Alex, você pode simplesmente usar essa função lambda como a sua resposta :)
Kade
O que. Oh. Ok, obrigada! :)
HyperNeutrino
Em vez de l[i]for i in range(len(l)), você pode usar j for j in lpara salvar 14 bytes.
Sherlock9
3

05AB1E , 8 bytes

¬s¤sR(++

Experimente online!

Tradução da minha resposta MATL, segunda abordagem.

¬    % Implicit input. Head, without consuming the input
s    % Swap
¤    % Tail, without consuming the input
s    % Swap
R(   % Reverse and negate
++   % Add head and tail of input to reversed and negated input. Implicitly display
Luis Mendo
fonte
Mais esperto do que o que eu estava tentando:¬s¥Rvy)}
Magia Octopus Urna
3

R, 37 30 bytes

Edit: Agora, usando a abordagem na resposta Julia de Glen O

x=scan();x[1]+tail(x,1)-rev(x)

Velho:

x=scan();cumsum(c(x[1],rev(diff(x))))

Lê entrada, calcula deltas, concatena com o primeiro elemento e calcula a soma acumulada.

Billywob
fonte
2

MATL , 8 bytes

1)GdPhYs

Experimente online!

Esta é a aplicação direta da definição. Considere a entrada [18 19 17 20 16]como um exemplo.

1)     % Implicit input. Get its first entry
       % STACK: 18
G      % Push input again
       % STACK: 18, [18 19 17 20 16]
d      % Consecutive differences
       % STACK: 18, [1 -2 3 -4]
P      % Reverse
       % STACK: 18, [-4 3 -2 1]
h      % Concatenate
       % STACK: [18 -4 3 -2 1]
Ys     % Cumulative sum. Implicitly display
       % STACK: [18 14 17 15 16]

Abordagem diferente, mesma contagem de bytes:

P_G5L)s+

Experimente onllne!

Matriz revertida e negada mais a primeira e a última entrada da matriz original.

P_     % Implicit inut. Reverse and negate
G      % Push input again
5L)s   % Sum of first and last entries
+      % Add to reversed and negated array. Implicitly display
Luis Mendo
fonte
1

Pitão - 10 bytes

sM._+hQ_.+

Conjunto de Teste .

Maltysen
fonte
1

A (Aheui) , 3 * 21 caracteres + 2 "\ n" = 65 bytes

빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

Assume a entrada na pilha 아. A saída será armazenada na pilha 안.

Se você quiser experimentar este código:

No final da primeira linha deste código, adicione o comprimento do caractere (n) - vezes (ou seja, se a entrada for 7 inteiros, insira-a 7 vezes). Para cada prompt, digite um número inteiro:

어우
우어
빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

Experimente aqui! (copie e cole o código)

Exemplo

Para 1, 2, 3, 4, 5:

어우벙벙벙벙벙
우어
빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

e depois digitar 1, 2, 3, 4, e 5(haverá 5 solicita).

Versão alternativa (65 bytes)

빠쑥쌳터슉펴ㅇ삯씬희
뿌파파쎢싺솎
싺싹삭다뽀
JungHwan Min
fonte
Por que você não diz 65 bytes in UTF-8ou algo assim?
mbomb007
@ mbomb007 porque algumas pessoas não sabem que os caracteres coreanos têm 3 bytes cada.
JungHwan Min
1

Bytes C # 42

Pega um int[]e retorna um IEnumerable<int>.

a=>a.Select(v=>a[0]+a.Last()-v).Reverse();

(Na verdade, essa é apenas uma versão portada da versão da JHM ..)

Stefan
fonte
1

TSQL, 200 bytes

Variável de tabela usada como entrada

DECLARE @ table(a int, b int identity)

INSERT @ values(5),(9),(1),(3),(8),(7),(8);

WITH c as(SELECT*,rank()over(order by b desc)z FROM @)SELECT g+isnull(sum(-f)over(order
by b),0)FROM(SELECT sum(iif(c.b=1,c.a,0))over()g,d.a-lead(d.a)over(order by d.b)f,c.b
FROM c,c d WHERE c.b=d.z)d

Experimente

t-clausen.dk
fonte
1

PHP, 60 56 52 bytes

-4 bytes graças a @ user59178

for($a=$argv;--$argc;)echo$a[1]+end($a)-$a[$argc],_;

opera em argumentos de linha de comando, usa sublinhado como separador. Correr com
php -r '<code>' <space separated numbers>

Titus
fonte
1
Existe uma razão para você não usar apenas $ncomo variável de controle? Eu tentei uma versão como essa e era 4 bytes mais curta e parecia funcionar.
user59178
1

Perl 6 ,  48 33  30 bytes

{[\+] .[0],|.reverse.rotor(2=>-1).map({[-] @_})}
{.reverse.map: {.[0]+.[*-1]-$^a}}
{[R,] .map: {.[0]+.[*-1]-$^a}}

Tente

Expandido:

{  # bare block lambda with implicit parameter 「$_」

  [R,]               # reduce the following using the comma operator [R]eversed
                     # (short way to do the same thing as 「reverse」)

    .map:            # map the input (implicit method call on 「$_」

      {              # bare block lambda with placeholder parameter 「$a」

          .[     0 ] # the first value of 「$_」 (implicit “method” call)
        + .[ * - 1 ] # add the last value of 「$_」 (implicit “method” call)
        -     $^a    # declare the parameter and subtract it from the above
      }
}

Também *-1é uma expressão lambda do tipo WhateverCode, onde *é o único parâmetro posicional.

Brad Gilbert b2gills
fonte
Explicação para aqueles que não falam perl?
Cyoce
@Cyoce Adicionado para a versão mais curta. Isso precisaria ser explicado a alguém que também conhecia o Perl 5. Em caso você estava pensando [\+]a partir do primeiro exemplo, é triângulo reduzir [\+] 3,-1,1,-5(3,2,3,-2)e [\,] 3,-1,1,-5((3,), (3,-1), (3,-1,1), (3,-1,1,-5))
Brad Gilbert b2gills
0

BASH, 71 bytes

s=$1
echo $s
for i in `seq ${#@} -1 2`;{
echo $[s=s+${!i}-${@:i-1:1}]
}
Ipor Sircer
fonte
0

C ++ 14, 103 bytes

Como lambda não identificado, que exige a sua entrada para ter rbegin, rend, backe push_backcomo os recipientes vector, dequeou list.

Usando a abordagem da resposta de Glen O, Julia

[](auto c){decltype(c)d;for(auto i=c.rbegin()-1;++i!=c.rend();)d.push_back(c[0]+c.back()-*i);return d;}

Ungolfed e uso:

#include<iostream>
#include<vector>

//declare generic function, return is deduced automatically
auto f=[](auto c){
  //create fresh container of the same type as input
  decltype(c)d;

  //iterate through the reverse container
  for(auto i=c.rbegin()-1;++i!=c.rend();)
    //add the first and last element minus the negative reverse
    d.push_back(c[0]+c.back()-*i);
  return d;
}
;


int main(){
  std::vector<int> a={18,  19,  17,  20,  16};
  auto b = f(a);
  for(auto&x:b)
    std::cout << x << ", ";
  std::cout<<"\n";
}
Karl Napf
fonte
0

Haskell, 33 bytes

Usa a mesma lógica que JHM:

f a=map(head a+last a-)$reverse a

Muito legível também.

Renzeee
fonte
Você pode salvar 3 bytes usando (!!0)para heade usando (<$>)para map: Experimente online!
ბიმო
0

Clojure, 101 bytes

(fn[c](conj(map #(-(first c)%)(reductions +(reverse(map #(apply - %)(partition 2 1 c)))))(first c))))

Segue praticamente a descrição:

(def f (fn[c]
         (conj
           (->> c
                (partition 2 1)
                (map #(apply - %))
                reverse
                (reductions +)
                (map #(-(first c)%)))
           (first c))))
NikoNyrh
fonte
0

Java 7, 96 bytes

int[]c(int[]a){int l=a.length,i=1,r[]=a.clone();for(;i<l;r[i]=r[i-1]+a[l-i]-a[l-++i]);return r;}

Explicação:

int[] c(int[] a){     // Method with integer-array parameter and integer-array return-type
  int l=a.length,     //  Length of input array
      i=1,            //  Index (starting at 1, although Java is 0-indexed)
      r[]=a.clone();  //  Copy of input array
  for(; i<l;          //  Loop over the array
    r[i] =            //   Replace the value at the current index in the copied array with:
      r[i-1]          //    The previous value in this copied array
      + a[l - i]      //    plus the opposite value in the input array
      - a[l - ++i])   //    minus the value before the opposite value in the input array (and increase the index)
  ;                   //  End the loop (implicit / no body)
  return r;           //  Return the result array
}                     // End of method

Código do teste:

Experimente aqui.

class M{
  static int[]c(int[]a){int l=a.length,i=1,r[]=a.clone();for(;i<l;r[i]=r[i-1]+a[l-i]-a[l-++i]);return r;}

  public static void main(String[] a){
    System.out.println(java.util.Arrays.toString(c(new int[]{ 18,19,17,20,16 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 1,2,3,4,5 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 5,9,1,3,8,7,8 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 6,5,4,1,2,3 })));
  }
}

Saída:

[18, 14, 17, 15, 16]
[1, 2, 3, 4, 5]
[5, 6, 5, 10, 12, 4, 8]
[6, 7, 8, 5, 4, 3]
Kevin Cruijssen
fonte
0

APL (Dyalog Unicode) , 11 bytes SBCS

Função de prefixo tácito anônimo.

+\⊃,∘⌽2-⍨/⊢

Experimente online!

+\ soma acumulada de

 o primeiro elemento do argumento

, seguido
 pela
 reversão de

2-⍨/ a diferença pareada de

 o argumento

Adão
fonte