Escreva um programa ou função que obtenha um número inteiro positivo ímpar N e uma sequência de dígitos decimais ( 0123456789
). A string representa um autômato celular unidimensional de dez estados . Cada dígito ocupa uma célula e a regra de atualização de uma geração para a seguinte é que cada célula se torna o dígito resultante da soma das N células centralizadas na célula, módulo 10.
A primeira e a última célula envolvem-se como se fossem vizinhas, para que as células sempre possam ter N células centradas nelas. Observe que N pode ser maior que o comprimento da string, o que significa que ela pode quebrar várias vezes e alguns dígitos estarão na soma várias vezes.
Por exemplo, se N é 7 e a string é 038
, para visualizar as células para somar, podemos escrever 038
repetindo infinitamente nas duas direções
...038038038038038...
então o dígito em que a 0
alteração será convertida é a soma dos 7 dígitos centralizados em qualquer 0
módulo 10:
...038038038038038...
^_____^
|
sum all these
Isto é (0+3+8+0+3+8+0)%10
, o que é 2
.
Da mesma forma, os dígitos 3
e os números 8
são alterados por (3+8+0+3+8+0+3)%10
= 5
e (8+0+3+8+0+3+8)%10
= 0
respectivamente.
Assim, a geração seguinte 038
é 250
quando N é 7.
Seu programa ou função precisa imprimir ou retornar a sequência de dígitos da próxima geração da sequência de dígitos de entrada. ou seja, aplique a regra de atualização uma vez a cada célula e forneça a saída. O código mais curto em bytes vence.
Casos de teste
[digit string] -> [N = 1], [N = 3], [N = 5], [N = 7], [N = 9], [N = 43]
0 -> 0, 0, 0, 0, 0, 0
1 -> 1, 3, 5, 7, 9, 3
2 -> 2, 6, 0, 4, 8, 6
3 -> 3, 9, 5, 1, 7, 9
4 -> 4, 2, 0, 8, 6, 2
5 -> 5, 5, 5, 5, 5, 5
6 -> 6, 8, 0, 2, 4, 8
7 -> 7, 1, 5, 9, 3, 1
8 -> 8, 4, 0, 6, 2, 4
9 -> 9, 7, 5, 3, 1, 7
00 -> 00, 00, 00, 00, 00, 00
07 -> 07, 47, 41, 81, 85, 47
10 -> 10, 12, 32, 34, 54, 12
11 -> 11, 33, 55, 77, 99, 33
12 -> 12, 54, 78, 10, 34, 54
34 -> 34, 10, 78, 54, 12, 10
66 -> 66, 88, 00, 22, 44, 88
80 -> 80, 86, 46, 42, 02, 86
038 -> 038, 111, 294, 250, 333, 472
101 -> 101, 222, 343, 545, 666, 989
987 -> 987, 444, 901, 765, 222, 543
1234 -> 1234, 7698, 3412, 9876, 1234, 7698
26697 -> 26697, 54128, 00000, 56982, 84413, 54128
001002 -> 001002, 211122, 331332, 335334, 455544, 113112
129577020 -> 129577020, 326194923, 474081605, 961120291, 333333333, 183342413
6023845292173530 -> 6023845292173530, 6853571632015189, 1197228291289874, 9238433109901549, 0110956118726779, 1982123699138828
fonte
Respostas:
Pitão,
2019 bytes1 byte graças a @FryAmTheEggman.
Experimente online . Conjunto de teste .
fonte
e<num>
é equivalente a%<num>T
CJam, 21 bytes
Teste aqui.
Explicação
fonte
Mathematica, 85 bytes
fonte
.5
vez de1/2
?Python 3,
114928680 bytesDecolou 6 bytes graças ao Sp3000 e outros 6 bytes graças ao xnor !
Define uma função nomeada
a
que assumeN
eD
como parâmetros, a cadeia de caracteres N e dígito definida no desafio.Explicação
No Python 3,
and
entre duas strings acabará sendo a última. Portanto, osD[i:]and ...
curtos-circuitos, uma vez que todas as posições centrais foram iteradas,D[i:]
serão uma string vazia e, portanto, falsas.(D*N)[(i-N//2)%len(D):][:N]
duplica a sequência de dígitos várias vezes e as corta nos lugares certos para fornecer a substring que tem o dígito correto como o centro. Lembre-se por um momento que a soma dos dígitos do módulo 9 do número base 10 é igual ao módulo 9 em si.str(int(...,10)%10)
Trata a sequência numérica resultante como se fosse a base 11 e obtém o restante módulo 10 e depois converte novamente em corda. Finalmente,a(N,D,i+1)
passa para a próxima posição central. Por causa disso+
, uma vez que a recursão é feita, todos os dígitos resultantes são agrupados e retornados.fonte
Haskell, 92 bytes
Conversão de string é muito cara em Haskell ...
Isso define uma função infix
!
, usada da seguinte maneira:Explicação
À direita, temos
[div(1-n)2`mod`length x..]
, que é apenas a lista infinita de números inteiros começando com o(1-n)/2
módulolength(x)
(pegamos o módulo, pois queremos que o primeiro elemento seja não negativo). Eles correspondem aos índices iniciais dos bairros da CA. Nós o compactamosx
apenas para obter uma lista do comprimento correto.A função
<$>
é a versão infix demap
e seu argumento esquerdo é uma composição de função lida da direita para a esquerda. Assim, para cada número inteiro na lista acima (extraído comfst
), eliminamos muitos caracteres decycle x
(que é a concatenação de infinitas cópias dex
), pegamosn
caracteres do restante, os convertemos em strings e, em seguida, números inteiros comread.pure
, pegamos sua soma, converta isso em string comshow
e pegue o último caractere dele, que corresponde ao restante mod 10.fonte
NARS2000 APL, 37 caracteres (72 bytes)
Explicação:
fonte
..
primitivo não é padrão e, portanto, não é "portátil".Oitava, 64 bytes
fonte
J, 41 bytes
Acabou por mais tempo do que eu esperava. Deve ser jogável.
Geramos uma matriz com elementos em uma linha mostrando as posições cujos valores devem ser adicionados (mod 10) para obter soma para uma posição.
Uso:
Experimente online aqui.
fonte