Para referência sobre o que é a torre de Hanói, pesquise no Google ou consulte a página da Wikipedia .
Seu código deve ser capaz de fazer duas coisas e são as seguintes:
- Aceitar entrada do usuário que especifique o número de discos no ponto de partida da torre de Hanói
- Crie a saída da maneira que você escolher (desde que seja lógico) para mostrar a solução para o quebra-cabeça da torre.
Um exemplo de saída lógica seria o seguinte (usando uma inicialização de 4 discos):
L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1
L
representa o pino esquerdo, C
representa o pino central e R
representa o pino direito e os números estão a que distância mover o disco nesse pino e em que direção. Os números positivos representam o número de estacas que se movem na direção da estaca mais à direita (porque os discos começam na estaca mais à esquerda).
As regras para a torre de Hanói são simples:
- Somente um disco pode ser movido por vez.
- Cada movimento consiste em pegar o disco superior de um dos pinos e deslizá-lo para outro, em cima dos outros discos que já podem estar presentes nesse pinos.
- Nenhum disco pode ser colocado em cima de um disco menor.
Os discos começam no pino mais à esquerda, maior na parte inferior, menor na parte superior, naturalmente.
Respostas:
Casca , 5 bytes
Experimente online!
Cada um
n
na saída representa mover o discon
para o próximo peg disponível (encapsular ciclicamente).Explicação
fonte
Python, 76 caracteres
Por exemplo, para N = 3, ele retorna:
fonte
Perl - 54 caracteres
Corra com
perl -M5.010
e digite o número de discos no stdin.Formato de saída:
Uma linha por movimento, o primeiro dígito é do peg, o segundo dígito é o peg (a partir de 0)
Exemplo:
fonte
$x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
GolfScript (
31 2524 caracteres)Agradeço a Ilmari Karonen por apontar que minhas
tr
permutações originais poderiam ser reduzidas em 6 caracteres. Decompondo-as como um produto de duas permutações, consegui salvar mais uma.Observe que fatorando o
3%
comprimento dos aumentos em um caractere:Algumas pessoas têm formatos de saída realmente complicados. Isso gera o peg movido de (numerado 0, 1, 2) e o peg movido para. A especificação não diz para qual pino se mover, então se move para o pino 1.
Por exemplo
fonte
])~{.{3^3%}%2,@{2\-}%++}*
Perl, 75
79caracteresRoubando totalmente o formato de saída de Keith Randall:
Invoque com
-M5.010
para osay
.(Acho que isso pode ser melhorado se você encontrar uma maneira de usar o valor de retorno da função em vez de apenas suprimi-lo.)
fonte
say
" recomendação]]SML, 63
função de chamada
f(n,s,t)
com:fonte
Bash (64 caracteres)
A publicação desta, apesar de ter mais que o dobro do tamanho da GolfScript, porque eu gosto da reutilização
t
para servir comoecho $s
.fonte
Scala,
928887 caracteresFormato de saída
Diga o número do disco = 3 e, em seguida,
fonte
C,
989287 caracteresImplementa o algoritmo mais trivial.
A saída está na forma em
ab ab ab
que cada par significa "mover o disco superior do pino a para o pino b".EDIT : Os movimentos agora são codificados em hexadecimal - 0x12 significa mover do pino 1 para o pino 2. Salve alguns caracteres.
EDIT : Lê o número de stdin, em vez de parâmetro. Mais curta.
Exemplo:
% echo 3 | ./hanoi
13 12 32 13 21 23 13
fonte
h(x,printf(...))
é simplesmente uma maneira de ligarprintf
antes deh
ser chamado. O últimon++
é feito após osh
retornos internos . É usado para desfazer a inicialn--
.;
seria o mesmo aqui.,
geralmente é útil (por exemplo,if(x)a,b;
substituiif(x){a;b;}
), mas não tem vantagem aqui.Gelatina , 5 bytes
Experimente online!
0
mova o menor disco um espaço para a direita (retornando ao início, se necessário)1
mova o segundo menor disco para a única outra coluna legal2
mova o terceiro menor disco para a única outra coluna legaletc.
Algoritmo
Podemos ver a solução do problema das Torres de Hanói recursivamente; a mover-se uma pilha de tamanho n a partir de um a B , mover-se de uma pilha de tamanho n -1 a partir de um de C , em seguida, o disco de tamanho n a partir de um a B , em seguida, mover uma pilha de tamanho n -1 de B para C . Isso produz um padrão do seguinte formato (no formato de saída usado por este programa):
Podemos observar que essa sequência é A007814 no OEIS. Outra definição possível da sequência é "o k ésimo elemento (com base em 1) da sequência é o número de zeros no final do número k quando ele é escrito em binário". E é isso que o programa aqui está calculando.
Explicação
Primeiro, calculamos o número de movimentos na solução, 2 n -1. Acontece ser o mais curto para realmente calcular um movimento extra e descartá-lo mais tarde, então isso é
2*
, ou seja, 2 ao poder de algo. (A única entrada que levamos até agora é o argumento da linha de comando, que é usado por padrão.)Em seguida, usamos o Jelly's embutido para calcular o número de zeros no final de um número na base b ; é isso . Como estamos calculando em binário, é . Tudo o que precisamos fazer é aplicar esse built-in aos números de 1 a 2 n -1, inclusive.
ọb
ọ2
Existem duas maneiras simples de iterar em uma série de números no Jelly
€
eR
, e minhas tentativas anteriores para solucionar esse problema usaram uma delas. Entretanto, nesse caso, é possível ficar um pouco mais curto:Ṗ
quando um número é fornecido como entrada, você pode fazer uma iteração que interrompe um elemento curto (em geral,Ṗ
é um componente interno usado para processar todos os elementos, exceto um). É exatamente isso que queremos neste caso (porque2*
gera muitos elementos), portanto, usá-lo para vincular2*
eọ2
nos2*Ṗọ2
fornece uma solução de 5 bytes para o problema.fonte
Awk, 72 caracteres
O formato de saída é o mesmo de Keith Randall .
fonte
Script Bash,
10096 caracteresO formato de saída é o mesmo de Keith Randall .
Editar : salvou 4 caracteres pelo comentário de peter .
fonte
$@
J, 23 bytes
solução de números binários
Esta solução usa o método de contagem binária descrito neste vídeo .
Ou seja, eu giro os dígitos binários de
1
até2^n
, depois pego infixes de comprimento 2 e comparo cada bit com o bit correspondente do número anterior e verifico se são desiguais. O número de bits desiguais é a saída para esse movimento.Saída, por exemplo, para 3 discos, onde o menor disco é identificado como 1:
1
significa "mover o menor disco de um pino para a direita, retornando ao primeiro pino, se necessário"n
, para todos os outrosn
, significa "mover o discon
para uma estaca legal" (sempre haverá exatamente uma)Experimente online!
solução recursiva
A mesma saída da solução acima, mas a lógica aqui torna a natureza recursiva do problema mais clara.
A visualização como uma árvore também enfatiza este ponto:
Experimente online!
fonte
APL (Dyalog Classic) , 19 bytes
Experimente online!
output é uma matriz de duas colunas de ints em {0,1,2} - do peg, ao peg
fonte
K (ngn / k) , 23 bytes
Experimente online!
fonte
R , 73 bytes
Colocando R no mapa. Inspirado na [resposta de Keith Randall] [1] com entrada simplificada, imprima apenas final e inicie o peg para economizar 2 bytes. Também pinos indexados a 0.
Experimente online!
fonte
JavaScript (ES6), 45b
por exemplo, chamada
h(4, 'A', 'B', 'C')
(mova 4 discos do pino A para o pino C usando o pino auxiliar B)retornos
'ABACBCABCACBABACBCBACABCABACBC'
(mova um disco do pino A para o pino B, mova um disco do pino A para o pino C, mova um disco do pino B para o pino C, etc.)fonte