Deltas inversos de uma matriz
Sua tarefa é, dada uma matriz de números inteiros de 32 bits assinados, recompilar com seus deltas inversos. Por exemplo, a lista
1 3 4 2 8
mantém os deltas:
2 1 -2 6
que são então negados, produzindo:
-2 -1 2 -6
e recompilado, produzindo:
1 -1 -2 0 -6
como o resultado final.
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 inversão delta acima.
Você receberá N entradas 0 < N < 10
onde cada número se enquadra dentro da faixa-1000 < X < 1000
Casos de teste
5 6 7 8 -> 5 4 3 2
1 3 4 2 8 -> 1 -1 -2 0 -6
32 18 25 192 199 -> 32 46 39 -128 -135
Notas
- Você não está restrito ao método baseado em delta: se você puder descobrir o método mais fácil (que não deve ser muito difícil) , estará livre para usá-lo.
- Conforme mencionado acima, você sempre receberá pelo menos 1 entrada e não mais que 9.
- O primeiro número da saída deve sempre ser o primeiro número da entrada; se esse não for o caso, seu método está incorreto.
- Somente saída de entrada padrão é aceita
- Aplicam-se brechas padrão
- Isso é código-golfe , então a menor contagem de bytes vence!
- Diverta-se!
Temos um vencedor.
A resposta da geléia de Dennis em um minúsculo 3 bytes levou para casa o ouro, devido ao fato de que tenho a impressão de que não pode ser derrotado.
Fiquei levemente decepcionado por não ter conseguido ver uma resposta com base nas especificações originais; no entanto, mais tarde posso dar uma recompensa precisamente por isso.
Respostas:
Geléia ,
73 bytesExperimente online!
fundo
Os deltas de (a, b, c, d) são b - a , c - b e d - c . A redução cumulativa (a, b - a, c - b, d - c) pela subtraçãog produz a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c , e 2a - c - (d - c) = 2a - d , então o resultado correto é (2a - a, 2a - b, 2a - c, 2a - d) .
Como funciona
fonte
Python 2, 30 bytes
Teste em Ideone .
Como funciona
Os deltas de (a, b, c, d) são b - a , c - b e d - c . A redução cumulativa (a, b - a, c - b, d - c) pela subtraçãog produz a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c , e 2a - c - (d - c) = 2a - d , então o resultado correto é (2a - a, 2a - b, 2a - c, 2a - d) .
fonte
Mathematica, 8 bytes
Função sem nome, levando um número indeterminado de argumentos. Isso usa uma maneira "fácil": nega toda a lista e adiciona o dobro do primeiro elemento (original).
Chamado, por exemplo, como
2#-{##}&[1,3,4,2,8]
; retorna uma lista como{1,-1,-2,0,-6}
.fonte
JavaScript (ES6), 21
Thx @Dennis
fonte
05AB1E , 4 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
Python, 44 bytes
Isso usa o "método mais fácil".
fonte
Pitão, 5 bytes
Intérprete Online!
fonte
R,
231817 bytesauto-vetorização e impressão padrão para o resgate!
fonte
2*x[1]-x
?Ruby, 23 bytes
Não é particularmente original.
fonte
Perl 6 ,
4016 bytesExpandido:
fonte
Brain-Flak , 76 bytes
Experimente Online!
Explicação:
fonte
Haskell,
2019 bytesMesma solução que Dennis, obrigado pela sua idéia
2a - x
.Guardou um byte graças a Christian Severs.
fonte
f(x:r)=x:map(2*x-)r
x
na frente.Pyke,
54 bytesExperimente aqui!
fonte
PHP, 48 bytes
Usando a técnica de Dennis. Use como:
Versão não de Dennis 55 bytes:
fonte
a&
vez de''<
e dois bytes em_
vez de' '
.APL, 8 bytes
Explicação:
Casos de teste:
fonte
Labirinto , 34 bytes
Experimente online!
Usa a abordagem do @Dennis
(2a - a, 2a - b, 2a - c, 2a - d)
.Os ladrilhos amarelos são para controle de fluxo. Nesta linguagem de programação 2D, o programa inicia no canto superior esquerdo, movendo-se para o leste para iniciar. Nas junções, a direção é determinada pelo sinal do topo da pilha principal. Azulejos em branco são paredes.
Verde
Esta seção salva 2a na pilha auxiliar.
?
Obtenha o primeiro número e empurre-o para o topo da pilha principal:
Duplique a parte superior da pilha_2
Empurre dois para o topo da pilha*
Estourary
, estourarx
, empurrarx*y
}
Mova o topo da pilha principal para o topo da pilha auxiliar._
Empurre zero para o topo da pilhalaranja
Esta seção subtrai 2a do número atual, nega o resultado, gera o resultado, obtém o próximo caractere (o delímetro), sai se EOF, gera uma nova linha, obtém o próximo número.
"
Noop. Se vier do norte, o topo da pilha será zero e o programa continuará para o sul. Se vier do oeste, o topo da pilha será um e o programa girará para a direita (continuando para o sul);
Descarte a parte superior da pilha. Como o zero ou um é usado apenas para controle de fluxo, precisamos descartar esses{
Mova o topo da pilha auxiliar (2a) para o topo da pilha principal:
Duplique a parte superior da pilha principal}
Mova a parte superior da pilha principal para a parte superior da pilha auxiliar-
Estourary
, estourarx
, empurrarx-y
\`` Negate the top of the stack. This and the previous three operations have the effect of
- (x-2a) = 2a-x`!
Coloque a parte superior da pilha e a produza como um número,
Empurre o próximo caractere (que será o delimitador) ou negativo se EOF)
Incremente o topo da pilha. Se o último caractere for EOF, a parte superior da pilha agora será zero e o programa continuará direto para a@
saída. Se o último caractere for um delimitador, a parte superior da pilha será positiva, fazendo com que o programa vire à direita e continue para o leste até o\
\
Saída de uma nova linha?
Obter o próximo número_1
Empurre um para o topo da pilha para virar à direita no cruzamentofonte
Labirinto , 24 bytes
O formato de entrada e saída são listas separadas por alimentação de linha (embora o formato de entrada seja realmente muito mais flexível). O programa termina com um erro.
Experimente online!
Eu tenho duas outras soluções nessa contagem de bytes, que funcionam basicamente da mesma forma, mas usam um fluxo de controle um pouco diferente.
Explicação
O ponteiro de instrução (IP) começa a se mover para o leste ao longo da primeira linha, mas todos os comandos anteriores
?
são basicamente não operacionais no estado global, já que não estamos usando comandos de profundidade da pilha em lugar algum. Então o código realmente começa no?
oeste, já que o IP muda quando atinge o beco sem saída.O código, portanto, começa com o seguinte bit linear de código:
Isso simplesmente nos configura com uma cópia
2a
para usar a[2a - a, 2a - b, 2a - c, ...]
fórmula.Agora entramos no loop principal do programa, usando um truque bastante padrão para percorrer uma única linha de código:
Observe que a pilha estará vazia sempre que pressionarmos o
<
botão, então sabemos que obteremos zeros lá. Em<
seguida, ele gira a linha inteira para a esquerda, levando o IP com ela, então obtemos o seguinte:O IP deve então se mover para a esquerda, onde a
>
linha muda de volta para o seu local original (para prepará-lo para a próxima iteração). Então a linha é simplesmente executada da direita para a esquerda, para uma iteração de loop único:O problema ao trabalhar com um loop desse tipo é que você não pode trabalhar com nenhuma forma de execução condicional, pois o Labyrinth não tem como ignorar o código. Portanto, encerraremos o programa com uma divisão por zero quando atingirmos o EOF. Aqui está um detalhamento de cada iteração do loop.
fonte
C ++ 14, 36 bytes
Como lambda sem nome, modificando sua entrada:
Usando a técnica de Dennis. Funciona para qualquer contêiner como
int[]
ouvector<int>
.Uso:
fonte
CJam, 16 bytes
Formato de entrada:
[1 2 3 4]
. Usa a fórmula fácil.Explicação:
Desculpe por nenhum link de teste. Eu acho que o SE não gosta de links com colchetes dentro.
fonte
Pushy , 9 bytes
Dar argumentos como valores separados por vírgulas na linha cmd:
$ pushy invdeltas.pshy 1,3,4,2,8
. Aqui está o detalhamento, com a pilha de exemplo:Nota: isso pode ter 8 bytes se a saída reversa for permitida:
@&2*K~-_
fonte
Perl, 26 + 3 (
-pla
sinalizador) = 29 bytesou
Usando:
fonte
Dyalog APL , 5 bytes
-+2×⊃
este é um trem de cinco, analisa como dois trens aninhados ("garfos"):
-+(2×⊃)
lê assim: a negação (
-
) de toda a matriz mais (+
) duas vezes (2×
) o primeiro elemento (⊃
)fonte
11 bytes
Invocação:
ised --l 'file with input.txt' '2*$1_0-$1
(editar: corrigido roubando a álgebra de Dennis)
fonte
Maravilha , 17 bytes
Não sei por que não postei isso antes. Uso:
Mais legível:
fonte