Desenhe o caminho da formiga de Langton .
Descrição
Os quadrados de um avião são coloridos de várias formas em preto ou branco. Arbitrariamente identificamos um quadrado como a "formiga". A formiga pode viajar em qualquer uma das quatro direções cardeais a cada passo que der. A formiga se move de acordo com as regras abaixo:
- Em um quadrado branco, vire 90 ° para a direita, vire a cor do quadrado, avance uma unidade
- Em um quadrado preto, vire 90 ° para a esquerda, vire a cor do quadrado, avance uma unidade
Especificações
- Entrada: um número inteiro N entre 0 e 725 (inclusive).
- Saída: uma grade 17 por 17 representando o "caminho" da formiga no passo N.
Regras
- A formiga começa voltada para a direita (3 horas).
- A formiga começa no centro da grade.
- Use
_#@
para quadrados brancos, quadrados pretos e a formiga, respectivamente. - A grade é inicialmente completamente branca.
- Você pode criar um programa completo ou uma função em um idioma interpretado.
- Entrada por stdin ou argumento.
Exemplos
Atualização: a saída N = 450 do gabinete estava incorreta.
N = 0
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 1
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________#________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
N = 450
_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
Respostas:
GolfScript - 67 caracteres
A solução Python do hallvabo é a mais semelhante a isso, então vou descrever apenas as principais diferenças.
O quadro é armazenado como uma sequência em vez de uma matriz. Isso é para que possamos atualizar um valor no quadro com menos caracteres (como as strings sempre são planas) e, portanto, é fácil obtê-lo no formato de saída desejado.
A posição da formiga é incrementada pela fórmula
((d&1)*17+1)*((d&2)-1)
(ie.1&17*)\2&(*
), onde d é a direção. Usamos a variável6
para que possamos pular a inicialização.fonte
:6
- tão hipster. Eu odiaria depuração do código :-)Ruby 1.9, 104 caracteres
Entrada via argumento de função.
m
r*r>1
vez der.abs>1
String#scan
para gerar a saída. Alterou um==
para>
String#tr
por um condicionalfonte
Python, 123
Apenas uma pequena reformulação da minha solução Python em http://golf.shinh.org/p.rb?Langtons+Ant .
fonte
GolfScript
969489Minha linguagem de ódio favorita está de volta com outro grupo de semi-legível bytavode.
Na versão 89, finalmente consegui integrar o @ ao loop de saída.
Versão 94:
Comentado:
Editar, eu também poderia fazer uma versão grande, aqui vão 59 * 59 e 10500 iterações:
.
fonte
Windows PowerShell,
119118fonte
PHP,
350309307312174161166159151149147144143Ungolfed
350 -> 309: Várias técnicas de compactação com os loops for (), também atualizadas para mostrar a saída correta.
309 -> 307: Loop principal for () convertido em um loop while ().
307 -> 312: Esqueceu de alterá-lo para usar o argv.
312 -> 174: Recodificado com base em outra resposta.
174 -> 161: não padroniza mais a matriz inteira.
161 -> 166: Argv vence novamente.
166 -> 159: Não há necessidade de redefinir argv [1].
159 -> 151: Não padroniza mais nada, o PHP faz isso automaticamente.
151 -> 149: Removido um conjunto de parênteses, a ordem das operações remove a necessidade.
149 -> 147: encurtado o último loop for (), chaves não necessárias.
147 -> 144:O último loop for () agora é um loop while ().
144 -> 143: Usou uma variável temporária para salvar um caractere.
fonte
C,
166162Aqui está uma tradução da minha abordagem Delphi para C, mostrando como o C pode ser compacto. Peguei emprestado o truque condicional de nova linha de fR0DDY (obrigado, companheiro!):
A versão comentada e recuada tem a seguinte aparência:
fonte
"_@#"[g[i]]
ea+=(1-(d&2))*(1+(16*(d&1)))
(1+d%2*16)
salva alguns caracteres.Delphi, 217
O código recuado e comentado é assim:
Entrada:
Saída:
fonte
C 195 Caracteres
http://www.ideone.com/Dw3xW
Eu recebo isso por 725.
fonte
p+=t+4;x+=a[p%4];
vez dep=(p+t+4)%4;x+=a[p];
salva três caracteres.sed, 481 caracteres
Pode ser reduzido para 478 caracteres removendo a primeira linha e executando com
-n
Requer N linhas para entrada, por exemplo. quando executado como
saídas:
fonte
Perl, 110 caracteres
O número é lido a partir da primeira linha do STDIN. O restante da entrada é ignorado.
Um pouco mais legível:
Edições
(112 → 111) Não é necessário atualizar
$d
com o valor do módulo-4.(111 → 110) Agora pode alinhar o
$d
incrementoAdendo (109 caracteres)
Podemos ter um caractere menor se você estiver feliz por ter um caso especial de
N=0
falha (ele não gera o@
caractere para a formiga). Todas as outras entradas funcionam corretamente:As diferenças são as que agora usamos em
%f
vez de,@f
para que possamos usar índices negativos e iteramos em-144..144
vez de0..288
. Economiza ter que inicializar$p
.fonte
Mathematica, 94 caracteres
fonte
> <>, 122 bytes
Correndo o risco de uma pequena necromancia do segmento, pensei que escrever uma resposta em> <> seria um desafio interessante ...
Este programa espera que o número de etapas a serem computadas esteja presente na pilha antes da execução.
fonte