O cenário
Depois de um longo dia de trabalho andando no escritório e navegando pelo stackexchange.com , finalmente saio pela porta às 16:58, já cansada com o dia. Como ainda sou apenas estagiário, meu modo de transporte atual é de bicicleta. Dirijo-me ao meu fiel Peugeot Reynolds 501 , mas antes que possa navegar nele, preciso desbloqueá-lo. A trava é uma trava combinada padrão de quatro dígitos (0-9), através do quadro e da roda dianteira. Enquanto tento ficar acordada, levanto minha mão para entrar na combinação.
O desafio
Como meus dedos estão cansados, quero girar a trava para a combinação correta com o menor número de movimentos. Um movimento é definido como uma rotação em uma posição (36 graus); por exemplo, há um movimento de 5737
para 5738
. No entanto, sou capaz de pegar até três toques consecutivos ao mesmo tempo e girá-los como um , o que conta apenas como um único movimento. Por exemplo, há também apenas um movimento de 5737
para 6837
ou para 5626
. Mover de 5737
para 6838
não é um movimento, pois os dígitos 1,2 e 4 se moveram na mesma direção, mas independentemente do número 3.
Portanto, para uma determinada combinação que posso ver no bloqueio da bicicleta (qualquer número inteiro de 4 dígitos), qual é o menor número de movimentos que posso fazer para desbloqueá-lo e, sim, posso girar em qualquer direção a qualquer momento. Com isso, quero dizer que posso girar alguns dígitos em uma direção e outros dígitos na outra direção: nem todos os meus movimentos serão no sentido anti-horário ou horário para cada desbloqueio.
Por ser preguiçoso, meu código de desbloqueio é 0000.
Este é um código de golfe. Não posso me incomodar em escrever muito código; portanto, o programa mais curto em número de bytes vence.
A entrada é de stdin, e seu código deve gerar as combinações que posso ver em cada etapa após cada movimento, incluindo o 0000 no final. Cada uma das combinações de saída deve ser separada por um espaço / nova linha / vírgula / ponto / e comercial.
Exemplos
Input: 1210
0100
0000
Input: 9871
9870
0980
0090
0000
Input: 5555
4445&3335&2225&1115&0005&0006&0007&0008&0009&0000
Input: 1234
0124 0013 0002 0001 0000
Tentei postar isso em http://bicycles.stackexchange.com , mas eles não gostaram ...
Isenção de responsabilidade: primeiro golfe, então qualquer coisa que esteja quebrada / qualquer informação faltante me avise! Também fiz todos os exemplos à mão, para que haja soluções que envolvam menos movimentos!
EDIT: Para respostas que possuem vários caminhos de solução com número igual de movimentos (praticamente todos), não há solução preferida.
Respostas:
Matlab,
412327 bytesGolfe (Graças a @AndrasDeak por jogar golfe
s
!):Este código usa alguma programação dinâmica para encontrar o 'caminho' mais curto do número fornecido e
0000
usar apenas as etapas possíveis. O desafio é basicamente o prioblem de caminho mais curto (como alternativa, você pode considerar as etapas como um grupo de comutadores.), Mas a dificuldade estava em implantar uma implementação eficiente . As estruturas básicas são duas matrizes de 10000 elementos, uma para armazenar o número de etapas para chegar a esse índice e a outra para armazenar um ponteiro para o 'nó' anterior em nosso gráfico. Ele calcula simultaneamente os 'caminhos' para todos os outros números possíveis.Exemplos:
Código completo (incluindo alguns comentários):
fonte
6444
seu código fornece 6444 7554 8664 9774 0884 0994 0004 0003 0002 0001 0000, enquanto eu acho que a resposta é 6444 6333 6222 6111 6000 7000 8000 9000 0000. Minha resposta é 8 etapas, a sua é 10. Não consigo ver o problema, e parece existir tanto na versão com golf quanto na versão sem golf. Isso foi corrigido na sua edição mais recente.s
última linha deve ser[0,1,1,1]
. Então você também tem uma solução de 8 etapas! Sinto muito pela inconveniência =)Lote - 288 bytes
Mesmo se você disser que eles têm que ser consecutivos (os anéis), eu assumo pela lógica (seguindo o exemplo) que posso pular o do meio, a partir de1234
até0224
.Esta é a minha solução de lote: 236 bytes.Edit: solução corrigida
A nova solução (corrigida de acordo com os comentários subjacentes) tem 288 bytes pesados.
fonte
1234
para não0224
é um movimento. A idéia é que, usando apenas dois dedos, eu possa agarrar até três anéis consecutivos com um único aperto.Haskell - 310 bytes
Isso funciona criando repetidamente uma nova lista de combinações aplicando cada turno possível a cada combinação já alcançada até que uma delas seja a combinação certa. Duplicatas são removidas da lista em cada iteração para impedir que o uso da memória cresça exponencialmente.
Como solução de força bruta, isso é muito ineficiente e pode levar alguns minutos para ser executado.
Eu não tenho muita experiência com Haskell, então algo provavelmente poderia ser feito melhor.
fonte