A regra 110 é um autômato celular com algumas propriedades interessantes. Seu objetivo é simular uma regra 110 no menor número de caracteres possível.
Para quem não sabe, a regra 110 é simulada linha por linha em uma grade. Cada quadrado em uma linha da grade olha para os quadrados acima, acima da esquerda e acima da direita para determinar qual célula deve ser.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Entrada: números de 0 a 39 representando a linha superior do enésimo quadrado de entrada, em qualquer formato razoável (sequência separada por vírgula, lista, argumentos de função). Para acomodar idiomas indexados em 1, os números também podem ser indexados em 1 e variam de 1 a 40.
Exemplo de entrada:
38,39
Saída: Uma grade de 40 x 40 representando os autômatos em execução, incluindo a primeira linha. Você deve deixar 0 em branco e 1 como qualquer caractere de impressão visível. Os espaços à direita são permitidos, desde que a grade real possa ser razoavelmente distinguida. A parte inferior da grade pode ter uma nova linha, mas não deve haver linhas em branco entre as linhas da grade.
Exemplo de saída:
XX
XXX
XX X
XXXXX
XX X
XXX XX
XX X XXX
XXXXXXX X
XX XXX
XXX XX X
XX X XXXXX
XXXXX XX X
XX X XXX XX
XXX XXXX X XXX
etc.
Nota: Uma pergunta semelhante sobre autômatos celulares 1D já foi feita, mas espero que, usando apenas uma regra, respostas mais curtas possam ser escritas.
Respostas:
CJam - 47
Ele usa
!
para células "1".Experimente em http://cjam.aditsu.net/
Explicação:
S40*
faz uma string (matriz) de 40 espaçosl',/
lê uma linha e divide por vírgula{…}/
executa o bloco para cada item (os números em forma de string)-
i'!t
converte o número em número inteiro e define o item nessa posição na string anterior (inicialmente 40 espaços ) para '!'Neste ponto, obtivemos a primeira linha.
{…}39*
executa os blocos 39 vezes-
N
acrescenta uma nova linha-
40,
faz com que a matriz [0 1 ... 39]-
S3$S++
cópias da linha anterior (posição 3 na pilha) e almofadas de TI com um espaço de cada lado-
f{…}
executa o bloco para a {cada número de 0 para 39} e {linha preenchida}-
>3<
pega uma fatia de 3 itens da linha preenchida, começando no número atual-
2b
converte da base 2; os itens que cortamos não têm dígitos de base 2, mas os caracteres são convertidos em seus valores ASCII e '' mod 8 é 0 e '!' o mod 8 é 1-
137Yb
converte 137 na base 2 (Y
= 2), obtendo [1 0 0 0 1 0 0 1], que é 110 invertido e negado (em 8 bits)-
='!^
obtém o dígito base-2 correspondente (o array envolve para que o índice seja modificado 8) e xor com o '!' caractere, resultando em '!' para 0 e '' para 1fonte
Ruby, 113 caracteres
Recebe entrada em stdin. Para usar uma regra diferente, substitua simplesmente
110
a última linha pela regra que você deseja tentar.Exemplo:
fonte
Mathematica, 122 bytes
Sim, você pode ver isso abusando dessa brecha , mas a) essa brecha é bastante contestada, b) uma pergunta do Autômato Celular precisa de uma resposta do Mathematica (especialmente uma sobre a Regra 110) ec) a resposta Ruby de Ventero é mais curta, então eu não acho que algum mal está feito.
A maioria dos caracteres é usada para análise de entrada e formatação de saída. O autômato real é simulado usando
Isso usa condições de contorno periódicas (para que a grade se envolva).
fonte
Python - 141
Executar como por exemplo
python 110.py <<< 38,39
fonte
['X',' ']
pode ser alterado'X '
para salvar 5 caracteres.o=range()
q,
676258 bytesAssume que não há envolvimento:
Versão antiga
fonte
Python, 186
Decente, mas provavelmente não ideal.
Você não especificou como a entrada é obtida, então eu apenas fiz uma função.
Use exemplo:
Saída:
fonte
Mathematica, 113 caracteres
Outra resposta do Mathematica usando
CellularAutomaton
.fonte
" "["X"][[#]]&
funciona?" "["X"][[1]]
é"X"
." "["X"][[0]]
retorna a cabeça de" "["X"]
, a saber" "
.C - 178
Esse código depende do fato de que cada linha de uma matriz é armazenada na memória contígua. Além disso, ele não imprime a primeira linha, mas imprime as próximas 40, pois as regras especificam apenas uma grade de 40x40.
Recuado apenas para legibilidade, a contagem de bytes inclui apenas o código necessário.
fonte
Lua - 351
Não é o idioma ideal para jogar golfe.
fonte
do u(n,i,'x')
isso é intencional, não é?Haskell ,
175 170 169 136 136 127124 bytes−9 bytes graças a @bmo
Experimente online!
fonte
Haskell ,
135 131130 bytes-1 byte graças a Ørjan Johansen (reorganização
take 40
)Abordagem completamente diferente da resposta do FrownyFrog, mas aproximadamente do mesmo tamanho:
Explicação
r
zipWith3
(?)
O
(?)
operador é a parte mais interessante da solução: Anteriormente , usei uma regra booleana gerada com um mapa de Karnaugh, mas acontece que existe uma maneira ainda mais concisa:fonte
take 40$
antesmap(" o"!!)<$>
.Casca ,
3128 bytesHah, Husk está batendo Jelly!
Experimente online!
Explicação e Não Goleado
Antes de adicionar uma explicação, deixe-me refazer um pouco isso. Vamos primeiro remover as várias composições, adicionar parênteses explícitos e descompactar a
¨↑¨
string. Também vamos substituir40
com4
uma explicação mais legível:fonte
Java, 321 caracteres
Entrada passada como argumento na linha de comando, por exemplo
java R 38,39
Eu nunca escrevi código java mais ofuscado :-)
fonte
Atualização: Exemplo de saída correto aqui (com 40 linhas e não 50): Nova saída abaixo (removida a anterior por questões de brevidade):
Fazendo outro quebra-cabeça, aprendi algo interessante sobre como aninhar declarações em loops no php e, de repente, elas são muito mais complexas do que eu pensava. Quando tenho tempo, acho que posso superar essa pontuação consideravelmente. Por enquanto, embora permaneça inalterado em um 408 não competitivo.
Minha versão php 408 caracteres:
Este foi um ótimo quebra-cabeça. Também passei anos brincando com as entradas, pois essas são coisas fascinantes que devem ser ditas. Enfim, aqui está a minha versão do PHP (que nem chega a ser boa como algumas das respostas postadas, mas está completa. Na 0ª posição, pegue apenas acima e acima da direita, na 39ª posição, pegue apenas acima e acima da esquerda, ou seja, sem quebra. é a minha versão:
Você pode vê-lo e executá-lo aqui: http://codepad.org/3905T8i8
Input é uma string de entrada no início como $ a = '38, 39 ';
A saída é a seguinte:
Espero que você goste!!!
PS: Eu tive que adicionar algumas quebras de linha ao código para que você pudesse ver tudo e não esticar ao longo da página com uma barra de rolagem.
fonte
Stax , 24 bytes CP437
Execute e depure online!
Usa o ponto de código 1 no CP437 para células "1".
Excelente caso para mostrar o poder desse idioma.
Explicação
Usa a versão descompactada (29 bytes) para explicar.
fonte
K (ngn / k) ,
4435 bytesExperimente online!
{
}
função com argumentox
!40
lista de ints de 0 a 39x?
encontre seus índicesx
, use0N
(o "número inteiro nulo") para não encontrado^
quais deles são nulos? isso nos dá a entrada, negada39{
}\
aplicar 39 vezes, coletando resultados intermediários em uma lista1,x,1
rode a lista com 1s (0s negado)3'
triplos de itens consecutivos2/'
decodificação binária cada@
use como índices em ...2\145
codificação binária 145 (bits negativos de 110)"X "
finalmente, use a matriz 40x40 como índices na sequência"X "
(o@
aqui está implícito)fonte
Gelatina , 29 bytes
Experimente online!
fonte