Questão
Somos capturados pelo exército de robôs em sua estação espacial. Nosso piloto de nave espacial está na prisão, no nível 1. Há apenas uma maneira de escapar e resgatar seu piloto de nave espacial. Isso significa passar do nível N para o nível 1. No entanto, como é muito arriscado, você precisa chegar à prisão no menor número de etapas possível.
Condições
Existem 4 maneiras de mover:
- Mover do nível N para o nível N - 1
e.g. from 12 to 11
- Mover do nível N para o nível N + 1
e.g. from 12 to 13
- Use o teleporte do nível 2k para o nível k
e.g. from 12 to 6
- Use o teleporte do nível 3k para o nível k
e.g. from 12 to 4
- Mover do nível N para o nível N - 1
O teleporte é apenas de mão única (você pode ir de 12 a 4, mas é impossível ir de 4 a 12)
- Toda ação dá um passo
Entrada
A entrada deve ser lida em STDIN, ou a alternativa mais próxima em sua linguagem de programação. A entrada consiste em um número inteiro n
onde 1 <= n <= 10^8
.
Resultado
A saída deve ser o número mínimo de etapas necessárias para ir n
para o nível 1.
Exemplos
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Tente codificar um programa que nos ajudará a salvar o piloto da nave espacial da prisão no menor tempo possível e voltar para casa!
O código mais curto vencerá!
Respostas:
Pitão, 32 bytes
Experimente on-line: Demonstration or Test Suite
Explicação:
Transformei o problema um pouco. Eu defino 4 novas operações, que substituem as 4 operações da questão.
level / 2
(conta como(level % 2) + 1
etapas, porque você pode precisar descer um nível primeiro para se teletransportar)(level + 1) / 2
(conta como(level % 2) + 1
etapas)level / 3
(conta como(level % 3) + 1
etapas)(level + 1) / 3
(conta como(-level % 3) + 1
etapas)Pelo projeto estas operações podem ser aplicados a cada número, se o número for
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
ou2 mod 3
.Você pode pensar facilmente sobre por que isso funciona. A idéia principal é que exista pelo menos uma solução ideal, que não tenha dois movimentos (descer) ou dois (subir) movimentos consecutivos. Prova: se você tiver uma solução com dois movimentos seguidos, poderá substituí-los e tornar a solução menor ou igual em comprimento. Por exemplo, você pode substituir (subir, subir, teleportar de 2k para k) por (teleportar de 2k para k, subir) e similar em todos os outros casos.
A função
y
usa memorização implicitamente e, portanto, o tempo de execução não explode.fonte
Python, 176 bytes
Força bruta por todo o caminho; uma lista de todos os números
1 to 100,000,000
em um computador de 64 bits é de ~ 800Mb de memória.O índice da lista representa os números, os valores representam a distância de 1 nas etapas de resgate permitidas.
1
)0,2,2,3
)O tempo de execução é um pouco superior a 10 minutos. * ahem *.
Comentários de código
De outros
fonte
Python 2 ... 1050
mal escrito, não-destruído, não ótimo.
Lê o nível inicial no stdin, imprime o número mínimo de etapas no stdout.
fonte
Código de máquina x86 de 32 bits, 59 bytes
Em hexadecimal:
A linguagem da máquina em si não tem conceito de entrada padrão. Como o desafio é puramente computacional, optei por escrever uma função utilizando o parâmetro de entrada
EAX
e retornando o resultadoAL
.A matemática por trás do código é bem explicada por @Jakube: a pesquisa é conduzida apenas entre os caminhos com teleporte intercalado com não mais que um movimento de nível único. O desempenho é de cerca de 12.000 casos de teste por segundo na extremidade inferior do intervalo de entrada e 50 casos por segundo na extremidade superior. O consumo de memória é de 12 bytes de espaço na pilha por nível de recursão.
fonte