Socorro! Parece que tenho um eco irritante em algumas das minhas matrizes e gostaria de me livrar dele. Quando isso ocorre, a matriz original se repete em algum lugar no meio, fazendo com que os valores sejam adicionados um ao outro.
Por exemplo, a matriz [ 422, 375, 527, 375, 859, 451, 754, 451 ]
contém um eco de si mesmo assim:
[ 422, 375, 527, 375, 859, 451, 754, 451 ] <-- array with echo (input)
[ 422, 375, 105, 0, 754, 451 ] <-- original array (output)
[ 422, 375, 105, 0, 754, 451 ] <-- echo of original array
Exemplo 2:
[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ] <-- input
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ] <-- output
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]
Também é possível que não haja eco na matriz; nesse caso, retorne a matriz original:
Exemplo 3:
[ 623, 533, 494, 382 ] <-- input
[ 623, 533, 494, 382 ] <-- output
Desafio:
Dada uma matriz que pode conter um eco, remova-a e retorne a matriz sem um eco.
Entrada:
- Uma matriz, lista, sequência delimitada, cartões perfurados ou seu equivalente adequado à plataforma, contendo três ou mais números inteiros, no intervalo de com pelo menos um elemento .
- O eco não pode começar no primeiro ou após o último elemento.
- O eco ocorrerá apenas uma vez ou não dentro da entrada.
Saída:
- Uma matriz, lista etc. de números inteiros , com o eco removido.
- Se não houver eco, retorne a matriz original.
Regras e pontuação:
- Isso é código-golfe , então a resposta mais curta em bytes para cada idioma vence.
- Regras padrão e regras de E / S padrão se aplicam.
- Lacunas proibidas (é claro).
- Forneça o link com um teste para o seu código ( TIO.run , etc).
- Uma explicação clara para sua resposta é altamente recomendada.
Casos de teste:
Com eco:
[ 422, 375, 527, 375, 859, 451, 754, 451 ]
[ 422, 375, 105, 0, 754, 451 ]
[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ]
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 7109, 4171, 5349, 2675, 3056, 4702, 4229, 1726, 5423, 6039, 8076, 6047, 7088, 9437, 4894, 1946, 7501, 5331, 3625, 5810, 6289, 2858, 6610, 4063, 5565, 2200, 3493, 4573, 4906, 3585, 4147, 3748, 3488, 5625, 6173, 3842, 5671, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 2779, 423, 4986, 2540, 298, 1403, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 49, 382, 53, 911, 166, 18, 635, 213, 113, 718, 56, 811, 67, 94, 80, 241, 343, 548, 68, 481, 96, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 25, 370, 1, 786, 12, 15, 68, 15, 88, 348, 55, 25, 55, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 1, 3, 2 ]
[ 1, 2 ]
[ 0, 1, 3, 2, 0 ]
[ 0, 1, 2, 0 ]
Sem eco:
[ 623, 533, 494, 382 ]
[ 623, 533, 494, 382 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 1, 1, 1, 1, 1 ]
[ 1, 1, 1, 1, 1 ]
[1, 2, 2, 2, 1]
; Saída:[1, 1, 1, 1]
vs.[1, 2, 1]
[1, 2, 3, 1, 2, 3]
,[1, 2, 3, 0, 1, 2, 3]
,[0, 1, 3, 2, 0]
? As respostas atuais não concordam com todas essas entradas.[1, 1, 1, 1]
vs.[1, 2, 1]
) é aceitável. Originalmente, eu tinha uma regra sobre qual escolher, mas a tirei na sandbox porque parecia se aplicar apenas a um pequeno número de casos extremos.[0, 1, 3, 2, 0]
deveria ser[0, 1, 2, 0]
- eu adicionei aos casos de teste. Uma resposta esperada nos outros dois poderia ser[1, 2, 3]
que eu não consideraria esses casos de teste válidos, pois de acordo com as regrasthe original array repeats itself somewhere in the middle
.[0,0,0]
(ou qualquer0
matriz de todos os tamanhos ) representa um eco de qualquer coisa ou se[0,0,0]
(sem eco) também seria uma resposta válida para este caso especial, pois simplesmente não há informações suficientes para determinar qual isto é. Atualizarei as regras para impedir que isso seja uma entrada válida, pois isso não invalidará ou alterará nenhuma resposta existente.Respostas:
MATL , 16 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Divisão polinomial para a vitória!
fonte
Haskell , 167 bytes
Primeiro, é importante notar que, se houver um eco presente, a matriz de entrada é uma convolução de outra matriz com alguma matriz do formulário
[1,1],[1,0,1],[1,0,0,1],...
.Isso significa que precisamos verificar isso para todas essas matrizes. Mas convolução / deconvolução discreta é o mesmo que multiplicação polinomial / divisão longa, portanto, essa é apenas uma implementação usando polinômios, retornando sempre o quociente, se possível.
Um truque que encurtou um pouco a coisa toda, além das matrizes acima, também foi verificado
[1]
como um caso base, porque se nenhuma outra matriz funcionar, a desconvolução com[1]
funcionará e retornará o polinômio original.Experimente online!
fonte
JavaScript ,
211171145 bytesExperimente online
40 bytes de Kevin Cruijssen
Outros 26 bytes de Arnauld
Minha primeira resposta ao código de golfe invalida as compensações potenciais e retorna a matriz original ou a nova, dependendo do que encontrar. Se alguém souber como torná-lo mais curto pls me avise, parece um jogo divertido.
fonte
++
, alterando&&
para&
na primeira verificação, alterando ambos.toString()
para+''
etc.), reduzi seu código para 181 bytes . Se você ainda não os viu, pode ser interessante ler dicas de golfe em JavaScript e dicas de golfe em todos os idiomas . :)function q(s)
pode sers=>
): 171 bytes . Aproveite sua estadia! :)Haskell,
112111110 bytesExperimente online!
fonte
Wolfram Language (Mathematica) ,
13112912011910298979695 bytesExperimente online!
-1 byte graças ao attinat : podemos escrever
L=Tr[1^#]
vez deL=Length@#
quando o argumento é uma lista de números.Explicação do código: Itere através da contração
d
(diferença entre os comprimentos de entrada e saída). Para cada comprimento da lista de saída, construa uma lista de incógnitasv={x[1],x[2],...,x[L-d]}
e adicione-a à esquerda e à direita para o comprimentoL
(PadLeft[v,L]+PadRight[v,L]
), depois defina essa soma igual à lista de entrada e resolva as incógnitasx[1]...x[L-d]
. Escolha a solução mais curta, que é a última gerada: apenas substitua a variávelw
toda vez que uma solução for encontrada.Versão sem golfe:
fonte
Tr[1^#]
vez deLength@#
Geléia ,
2524 bytesExperimente online!
Um link monádico que pega e retorna uma lista de números inteiros. Tecnicamente, os resultados bem-sucedidos são aninhados em duas listas adicionais, mas quando executados como um programa completo, a saída implícita para stdout ignora as listas redundantes.
fonte
Python 2 ,
113123128127123122 bytesExperimente online!
1 byte thx para TFeld ; e 1 byte thx para Sebastian Kreft .
Em cada chamada para
f
, construímos um eco potencial de duraçãolen(a)-i
. A primeira parte é apenas os primeirosi
bytes de a; o restante é calculado para que a 'soma ecoada' esteja correta para a seção 'sobreposta' da soma eco (ou seja, a soma eco está correta atéa[:-i]
).Então a comparação muito curta, sem golfe, fornece:
fonte
e+=[v-e[-i]]
pode sere+=v-e[-i],
i<=len(a)/2
Wolfram Language (Mathematica) , 93 bytes
Experimente online!
Retorna o menor eco presente na lista.
fonte
{1,1,1}
e sobre{1,0,1}
.{1,1,1}
não há eco, é necessário retornar a matriz original. Pois{1,0,1}
eu diria que o eco é,{1}
mas admito que não é claro quais são as regras.PHP , 124 bytes
Experimente online!
Explicação:
Crie uma cópia da matriz de entrada e faça um loop em cada deslocamento possível do eco. Para cada coluna, subtraia o valor na posição de deslocamento do valor correspondente na posição original para determinar o valor necessário para adicionar a entrada. Se for válido (> 0 ), substitua o conteúdo dessa coluna por esse valor. Continue até o fim e, se nenhum valor for inválido, é uma resposta correta.
fonte
Python 3 , 111 bytes
Experimente online!
A solução usa algumas idéias da solução do @Chas Brown , como a estrutura recursiva e a construção da matriz de saída. Enquanto isso, também faz algumas alterações nos critérios de julgamento, além de colocar o loop for em uma expressão de gerador para permitir uma solução de linha única. A versão ungolfed é mostrada a seguir. Aqui, a matriz
out
é calculada até o final da matriz de entrada e, em seguida, verificamos se os últimosl
elementos são zero. Nesse caso, os primeiroslen(arr)-l
elementos serão retornados como resposta se todos eles não forem negativos.Versão não-gasta e não recursiva
Experimente online!
fonte
Carvão , 62 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Suponha que não haja eco.
Tente todos os possíveis pontos de início de eco. Nota: Talvez eu tenha interpretado mal a pergunta e talvez não esteja tentando tamanhos suficientes de eco. Nesse caso,
⊘
isso não seria necessário.Comece com uma matriz de zeros do mesmo tamanho que o ponto inicial do eco.
Para cada elemento da matriz original, subtraia o elemento da matriz de eco ciclicamente. Cada elemento na matriz de eco constrói assim a soma alternada dos elementos que se afastam.
Se todas as somas alternadas forem zero, salve-o como um possível ponto de partida. (Portanto, se houver mais de uma possibilidade, será utilizado o maior ponto de partida possível.)
Crie a matriz de eco subtraindo elementos após o ponto inicial do elemento calculado anteriormente apropriado.
Transmitir para string para saída implícita em linhas separadas.
fonte