Os autômatos celulares são realmente fascinantes. Os que geralmente são mencionados são os binários, ou seja, os representáveis por um número. No entanto, esses, na minha opinião, foram mortos. As ACs ternárias são mais interessantes, mas temos todo o ASCII a considerar! Que divertido isso poderia ser!
Em vez de decidir um conjunto de regras para cada personagem, usarei uma regra de decisão simples da qual falarei em breve. Para decidir a próxima geração, analisamos as três células "superiores", como um autômato celular. Observe um exemplo:
QWERTY
X Y Z
O "topo" de Y
é WER
, sendo as células acima e à direita, acima e acima e à esquerda. Y será o resultado da função que estou prestes a definir, que é uma função em seqüências de três caracteres. O "top" de X
é QW
, ou um enchimento espaço no / célula falta inexistente .
Agora, para a função divertida ! Eu chamo essa sequência de sequência XOROR por um motivo. Seja A
o código da célula no canto superior esquerdo, o código B
da célula acima e o código da célula no canto C
superior direito. Em seguida, a célula resultante é o caractere cujo código é (A XOR B) OR C
, ou seja (A^B)|C
,. (Se um valor resultante for maior que 126, será definido como (CHARCODE % 127) + 32
. Nada será feito se um valor for menor que 32.) Aqui está um exemplo da semente Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
E podemos continuar por um tempo adiante. Essa modificação da string é chamada de sequência XOROR.
Objetivo Você deve escrever um programa ou função que execute uma das seguintes tarefas:
- Dada uma sequência
s
e um númeron >= 0
,n
produza a sequência th na sequência XOROR com seeds
,n = 0
sendo a primeira transformação da sequência. - Dada uma sequência
s
, produza (para programas) ou gere (para funções / geradores) um fluxo infinito da sequência XOROR com sementes
. Você pode optar por parar se a sequência se repetir, mas isso não é necessário.
s
sempre consistirá apenas em caracteres ASCII imprimíveis, do espaço ao til e mais guias (sem novas linhas).
Este é um código de golfe , portanto o programa mais curto em bytes vence.
fonte
o
eles fazem parecer uma corrida zerg .127%127+32==32
.n=0
não é a string original?(d^!)|(space)
. Quanto à sua segunda pergunta, você executa(CHAR%127)+32
após a execução do XOROR.Respostas:
MATL ,
3331 bytesIsso funciona na versão 13.1.0 do idioma / compilador, que antecede o desafio.
A primeira entrada é o número, a segunda é a string.
Experimente online!
fonte
Mathematica, 133 bytes
Seria bom fazer uma
CellularAutomaton[]
solução funcionar, mas eu continuava sendo breve. Alguém?Editar: algumas fotos bonitas (clique para ampliar)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:fonte
CellularAutomaton
sua função de atualização? (A regra número real com 127 estados válidos seria insano.)Java,
193185 bytesPorque Java.
-8 bytes, alternando para loop em vez de recorrente para torná-lo uma função anônima
Retorna a n-ésima iteração de XOROR em s.
Versão legível:
Praticamente uma implementação literal da especificação, com um loop recursivo para aplicar a operação n vezes. Alguns bytes foram salvos, no entanto, com a minha observação de que a cláusula CHARCODE> 126 só acontecerá com CHARCODE == 127, o que resulta em economia ao
SPACE
invés de emDEL
.Corri meu código por algumas seqüências escolhidas arbitrariamente e encontrei esse ciclo maravilhoso:
fonte
ok
!CJam, 38 bytes
Teste aqui.
Explicação
fonte
lri){2S*\*3ew{)\:^|}%127c' er}*
porque a operação pré-módulo de caracteres nunca excede 127Haskell, 123 bytes
Isso retorna um fluxo infinito da sequência XOROR. Exemplo de uso (imprima os 5 primeiros elementos da semente
"Hello, World!"
):Como funciona:
fonte
PHP, 186 bytes (com n) | 177 bytes (infinito)
Descobriu-se que a impressão infinita é mais curta ...
Sem jogar com n:
Infinito ungolfed:
fonte
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
tem 141 bytes (-36 bytes).C ++
Enésima sequência (212)
Un-Golfed
Nª sequência usando a sintaxe do ponteiro em vez da sintaxe da matriz para tornar isso ainda mais confuso: (231)
Un-Golfed
Função de depuração (por diversão)
fonte
JAVA 240/280 bytes
A versão popular do Java na época em que escrevi isso afirmava ser de 185 bytes, mas existem dois pontos significativos de falsificação. Primeiro, a medição é presumivelmente apenas para a função, não para a fonte de trabalho completa. Talvez não seja um problema. Segundo, ele usa o BiFunction sem um nome importado ou totalmente qualificado. Adicionar os bits necessários para executá-lo como está (depois minimizá-lo de maneira justa) elevou-o para 348 bytes. Adicionar apenas o nome completo da classe BiFunction leva a 248 bytes.
Por outro lado, acredito que os meus são 240 bytes ao jogar pelas mesmas regras (nenhuma classe, nenhuma saída real, apenas a carne). A classe executável completa é de 280 bytes e tem a seguinte aparência (não minificada):
Ou minificado:
fonte
Perl, 47 bytes
Inclui +2 para
-lp
Corra com a entrada no STDIN, por exemplo
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Isso funciona como está, mas substitua o
\x7f
pelo valor binário correspondente para obter a pontuação fornecidafonte
Swift: 273 caracteres
Uau, Swift é pior que Java! (Todas essas APIs com nomes longos!: P)
Ungolfed:
Graças a @ CAD97 por mencionar que (A ^ B) | C só pode ser maior que 126 quando é 127.
Eu também percebi que você não precisa de parênteses em torno de A ^ B | C porque o XORing é feito antes do ORing, o que me salvou alguns bytes.
fonte