É sabido que uma pessoa em uma grade sob a influência de álcool tem a mesma chance de seguir as direções disponíveis. No entanto, essa afirmação de bom senso não se aplica ao reino dos bêbados muito pequenos , cujo comportamento é como se eles seguissem todos os caminhos disponíveis ao mesmo tempo, e os possíveis caminhos que eles seguiam podem interferir um no outro. Sua tarefa é exibir as posições possíveis de um bêbado quântico após as n
etapas.
Especificação
O bêbado em questão ocupa uma grade quadrada e pode ser considerado um autômato celular de três estados usando uma vizinhança de Von Neumann (em forma de mais) que segue estas regras simples:
Empty
vai paraAwake
se for adjacente a exatamente umAwake
e, caso contrário, vai paraEmpty
Awake
vai paraSleeping
Sleeping
vai paraSleeping
O estado inicial do quadro é um único Awake
cercado por um campo infinito de Empty
s.
Desafio
Dado um número inteiro não negativo n
, crie uma representação ASCII do bêbado após as n
etapas. Cada estado deve ser representado por um caractere diferente, e as soluções devem indicar qual caractere significa qual estado. Se você usar espaços para Empty
, não precisará incluir uma execução deles no final de uma linha.
Isso é código-golfe , então a resposta mais curta vence. Aplicam-se brechas padrão , são permitidos espaços em branco à esquerda e à direita, saída de matriz de caracteres / matriz de caracteres 2D, etc.
Exemplos
Esses exemplos usam para
Empty
, @
para Awake
e #
para Sleeping
.
n=0
@
n = 1
@
@#@
@
n = 2
@
#
@###@
#
@
n = 3
@
@#@
@ # @
@#####@
@ # @
@#@
@
n=6
@
#
@###@
@#@
@ ### @
#@# # #@#
@###########@
#@# # #@#
@ ### @
@#@
@###@
#
@
n=10
@
#
@###@
@#@
###
# # #
#######
# ### #
@ ## ### ## @
#@# ### # ### #@#
@###################@
#@# ### # ### #@#
@ ## ### ## @
# ### #
#######
# # #
###
@#@
@###@
#
@
Nota interessante
Observando a sequência do número de células ocupadas no OEIS, descobri que o bêbado quântico é isomórfico para a sequência de palitos de dente muito mais estudada . Se você puder incorporar esse conhecimento em um golfe melhor, ficarei impressionado.
fonte
n=10
está correto? Eu tentei algumas abordagens e todas obtiveram a mesma resposta (errada), então só quero ter certeza. Parece um pouco errado, mas eu não sei.Respostas:
Wolfram Language (Mathematica) ,
9291 bytesUm desafio perfeito para usar o built-in do Mathematica
CellularAutomaton
!Experimente online!
Vazio = 0, Despertado = 1, Dormindo = 2
Animação das primeiras 256 iterações (branco = vazio, cinza = acordado, preto = adormecido):
Explicação
Executar
CellularAutomaton
com especificações ...Aplique a regra totalística de três cores 7049487784884, com a vizinhança de Von Neumann ...
Em uma placa com um único 1 no meio, com um fundo de 0s ...
Repita os
<input>
tempos ({j#}
avalia para{{{#}}}
). A matriz se expande automaticamente se uma célula fora da borda não for a mesma que o plano de fundoEssa regra vem do número base 3
220221220221220221220221220
, que significa "alterar tudo1
ou2
para2
, e mudar0
para1
se e somente se houver um número ímpar de1
s ao seu redor".Imprima a matriz.
A semi-prova de "'ímpares
1
' é equivalente a 'exatamente um1
'":Considere essa grade de pixels 5x5. Branco é um
0
ou uma2
célula (pixels não-acordado), e cinza é uma1
célula.Se uma
1
célula foi gerada em torno de três0
células, a grade deve ficar assim: possui três1
s organizados em forma de U (ou uma versão rotacionada) da seguinte maneira:Devido à auto-similaridade desse autômato celular, qualquer padrão que apareça no autômato celular deve aparecer na diagonal (por indução). No entanto, esse padrão não é diagonalmente simétrico. isto é, não pode ocorrer na diagonal e não pode aparecer em nenhum lugar do autômato celular.
Despertar / Dormir são equivalentes
Observe que uma
0
célula não pode ser cercada por exatamente uma ou três2
células e células de repouso0
, pois isso implicaria que, em alguns passos anteriores, a célula tinha um vizinho de uma ou três1
células - e já deve ter se transformado em uma1
(contradição). Portanto, não há problema em ignorar a distinção entre1
and2
e state 'altere tudo1
para1
e a0
para a1
se e somente se tiver um número ímpar de vizinhos diferentes de zero.'O autômato celular resultante é realmente idêntico ao original, a única diferença é que não há distinção entre bêbados "acordados" e "adormecidos". Esse padrão é descrito em OEIS A169707 .
Experimente online!
Comparação lado a lado das 16 primeiras iterações:
A adição de duas iterações consecutivas fornece um resultado que segue as especificações do desafio (94 bytes):
Experimente online!
fonte
Python 2 , 192 bytes
Experimente online!
-17 bytes graças ao Sr. Xcoder
-9 bytes usando o formato de saída de Jonathan
-11 bytes graças ao Lynn
-3 bytes graças ao ovs
fonte
exec
salva 9 bytes e…for k in 0,1,2,3for…
salva mais um: Linkn=[C+k for k in-1j,1j,-1,1for C in c]
economiza mais um byte!X+Y*1jin
é algo que eu realmente não pensei que fosse possível: PC,
360354343319As novas
#define
linhas depois das não- linhas são apenas para apresentação aqui, portanto não são contadas. Eu incluí uma função wrapper, então é -6 (313) se a função não é contada e você assume quen
vem de outro lugar.q(10)
saídas:Usando
para vazio,
"
para dormir e!
para acordado.Isso funciona assim:
A(i,b,e)
é “∀i∈ [b, e).”,B(b,e)
é “∀r∈ [b, e) .∀c∈ [b, e).”Observe que, após n gerações, o quadro é 2 n + 1 quadrado.
Devido à simetria do quadro, isso só precisa simular o quadrante inferior direito, portanto, alocamos uma matriz quadrada n + 1 com 1 linha e coluna de preenchimento para a pesquisa posterior do vizinho (então n + 2).
Alocar com
calloc
permite multiplicar simultaneamente a largura pela altura e limpar o quadro para0
(vazio).Ao procurar uma célula por suas coordenadas (
C
eD
), ela usa o valor absoluto da linha e coluna (W
) para espelhar automaticamente as coordenadas.A placa é armazenada como uma matriz de pares de números inteiros que representam a geração atual e a anterior. Os números inteiros em questão são
char
para que possamos evitarsizeof
.A geração pesquisada com mais frequência (pelo teste vizinho) é a geração anterior, portanto é colocada no índice 0 no par para que possa ser acessada
*
.A cada geração (
g
), a geração atual é copiada sobre a geração anterior usando umB
loop, e a nova geração é gerada a partir da antiga.Cada célula é representada usando
0
para vazio,1
para acordado e2
para dormir. A contagem de vizinhos era originalmente um cálculo do número de bits definido nos 4 bits inferiores da célula quando os 4 vizinhos eram deslocados e OR juntos como sinalizadores (N
), usados16
para dormir. Mas com a observação de que um número ímpar de vizinhos é equivalente a exatamente 1 vizinho, podemos salvar vários caracteres usando uma máscara com 1.No final, o quadro é impresso por inteiro, iterando sobre o quadrante inferior direito, usando o mesmo truque de coordenadas de valor absoluto, menos o preenchimento para que não imprimamos o preenchimento externo no quadro. É também por isso que o
B
loop inclui um colchete de abertura, porque temos a instrução extra de nova linha no loop externo.Os códigos ASCII mapeiam convenientemente 0 + 32 (vazio) para um espaço, 2 + 32 (adormecido) para
"
e 1 + 32 (acordado) para!
.Em suma, acho que este é um golfe surpreendentemente legível por causa da boa estrutura do problema.
fonte
putchar(10)
computs("")
&~
não é um NAND, eu quis dizer que, às vezes, penso!(a &~ b)
em termos dea NAND (NOT b)
, embora neste caso a lógica!
não seja a mesma que a bit a bit,~
porque estamos confiando no resultado0
ou1
no!
.MATL , 39 bytes
Isso exibe
Empty
como(espaço)
Awake
Como#
Sleeping
como!
.Experimente online! Você também pode observar o padrão crescer na arte ASCII ou graficamente (código modificado).
Explicação
O código utiliza números complexos
0
,1
,j
para representar os três estados: vazio, acordar, dormir, respectivamente.fonte
Befunge,
384304 bytesExperimente online!
O problema de tentar implementar esse tipo de coisa no Befunge é o tamanho limitado da memória (2000 bytes para dados e código). Então, eu tive que usar um algoritmo que calcula o caractere correto para qualquer coordenada, sem referência aos cálculos anteriores. Consegue isso olhando recursivamente no tempo em todos os caminhos possíveis que o bêbado pode ter seguido para chegar a esse ponto.
Infelizmente, essa não é uma solução eficiente específica. Funciona, mas é incrivelmente lento e se torna exponencialmente mais lento quanto maior o valor de n . Portanto, embora possa funcionar para n até 127 (limite de células de memória de 7 bits da Befunge), na prática, você inevitavelmente perderá o interesse aguardando o resultado. No TIO, atingirá o tempo limite de 60 segundos em algo maior que cerca de 6 (no máximo). Um compilador terá um desempenho muito melhor, mas mesmo assim você provavelmente não gostaria de ir muito acima de 10.
Ainda assim, achei que valeu a pena enviar, porque na verdade é uma demonstração bastante agradável de uma "função" recursiva no Befunge.
fonte
Python 2 , 214 bytes
Experimente online!
Explicação
Usa
0
paraempty
,1
parasleeping
e2
paraawake
. Imprime uma lista de caracteres bidimensionais (seqüências de um comprimento).Define uma função que recebe um número inteiro não negativo
n
. Avança sucessivamente o autômato celular até que o estado desejado seja alcançado. Por fim, é aplicada uma conversão entre os valores inteiros internos e os caracteres reais.fonte
Lua ,
251242239238 bytes-8 bytes, simplificando o inicializador de matriz ao custo de alguns espaços em branco iniciais adicionais.
-1 byte mudando
c=i==2+...and print(s)
parac=i~=2+...or print(s)
.-3 bytes, construindo uma sequência completa primeiro e imprimindo uma vez no final.
-1 byte, graças a Jonathan Frech , reescrevendo
or(g(...)==1 and
comoor(1==g(...)and
.Experimente online!
Vazio = Espaço
Despertado =
1
Dormindo =
0
Pega a entrada da linha de comando e imprime em stdout.
Representando os estados como
false
/nil
,1
e0
internamente, a detecção de "vazio" não precisa de nenhum código eo "exatamente um acordado" cheque pode ser feito com apenas uma adição.fonte
or(g(...)==1 and
pode seror(1==g(...)and
.APL (Dyalog) , 38 bytes
Experimente online!
-4 graças a Adám .
-8 graças a ngn .
fonte
Geléia ,
3929 bytesExperimente online!
Usos
0
,1
e2
para vazio acordado e dormindo. O rodapé no link converte isso em,
@
e#
.ṬŒḄ
vez deḤḶ=¹
.-
vez de1N
. Também torna¤
desnecessário.S
vez de+/
.Ḃ+Ḃ+
vez de%3=1+=1Ḥ$+
. Agora usa2
para dormir em vez de3
.Explicação chegando ...
fonte
APL (Dyalog Classic) , 38 bytes
Experimente online!
com base na solução de Erik the Outgolfer
⍪1
é uma matriz 1x1 contendo 1⎕
entrada avaliada( )⍣⎕
aplique isso muitas vezes(⌽0,⍉)⍣4
cercar com 0s, ou seja, 4 vezes: transpose (⍉
), adicione 0s à esquerda (0,
), inverta horizontalmente (⌽
)g←3+/0,,∘0
uma função que soma triplos horizontais, chame-ag
⍉∘g∘⍉
uma função que soma triplos verticais - que estág
em transposição2 | ⍉∘g∘⍉ + g←3+/0,,∘0
soma das duas somas módulo 2⌈
quanto maior entre isso e ...2∘∧
o LCM de 2 e a matriz original - isso transforma 1s em 2s, preservando 0s e 2sfonte
Perl 5 , 192 + 1 (
-n
) = 193 bytesExperimente online!
Usa 0 para vazio, 1 para acordado e 2 para adormecido.
fonte
Ruby ,
164153 bytesExperimente online!
Usa "" para Vazio, "@" para Desperta e "#" para Dormir (como no exemplo). Eu poderia salvar 6 bytes usando números, suponho, mas parece melhor assim.
fonte
Pip ,
6961 bytes60 bytes de código, +1 para
-l
sinalizador.Toma
n
como argumento da linha de comando. Usa0
para vazio,1
para acordado e2
para dormir. (Para obter uma melhor arte ASCII, como nos exemplos do desafio, substitua a finaly
por" @#"@y
.)Experimente online!
Explicação
Configuração:
Laço principal:
onde o corpo da função é:
Após o loop, simplesmente imprimimos automaticamente
y
. O-l
sinalizador significa que a lista aninhada é impressa concatenando o conteúdo de cada linha e separando as linhas com novas linhas.fonte
Java (OpenJDK 8) , 220 bytes
Experimente online!
Nota: a matriz retornada contém uma borda ou
'\0'
caracteres. Como o plano deve ser infinito, apenas não-borda é usada.Mapeamento de caracteres:
(espaço)
=
0
Economizar
fonte
@
cheque e você encontrou a chave! Agradável. Achar
transmissão foi uma supervisão total minha.Python,
199192 bytesEsse código é executado no Python 2 e no Python 3, mas usa a popular biblioteca Numpy de terceiros para manipular a matriz.
print(f(6))
saídasSe você deseja uma impressão mais bonita, pode chamá-lo desta maneira:
que imprime usando os mesmos caracteres indicados na pergunta.
fonte
[e]ach state should be represented by a different character
(eu interpretocharacter
como um caractere ASCII real, em vez de um número inteiro).