Briefing
Você é um bot, em uma grade 2D que se estende infinitamente em todas as quatro direções, norte, sul, leste e oeste. Quando receber um número, você deve mover o bot para chegar ao número de destino.
Veja como a grade funciona:
Você pode se mover em 4 direções: norte, sul, leste ou oeste. Depois que você sai de uma célula, você não tem permissão para voltar a ela novamente (de maneira eficaz, ela foi apagada do mapa).
Existe um "contador", que vai 1234567890
(então vai de ... 1
até 2
todo o caminho 9
, depois para 0
e depois 1
novamente), que muda toda vez que você se move.
Você também tem um "valor", que começa em 0.
Depois que você se move em qualquer direção, ocorre uma operação matemática, dependendo da direção que você se move:
- Norte: seu valor é aumentado por counter (
value += counter
). - Leste: seu valor é diminuído pelo contador (
value -= counter
). - Sul: seu valor é multiplicado pelo contador (
value *= counter
). - Oeste: seu valor é dividido por contador (
value /= counter
).- Divisão é divisão inteira, então
5/2 -> 2
. - Você não tem permissão para dividir por
0
.
- Divisão é divisão inteira, então
Exemplo:
Se o bot se mover para o norte 3 vezes:
- O primeiro movimento "norte" incrementa o contador para
1
e adiciona isso ao valor (que é agora1
). - O segundo movimento "norte" incrementa o contador para
2
e adiciona isso ao valor (que é agora3
). - O terceiro movimento "norte" incrementa o contador para
3
e adiciona isso ao valor (que é agora6
).
O valor final é 6
.
Vá para o norte e depois para o sul novamente:
- O primeiro movimento "norte" incrementa o contador para
1
e adiciona isso ao valor (que é agora1
). - O segundo "sul" move erros, porque a célula que o bot está tentando seguir em frente é removida (do primeiro movimento).
Não há valor final, porque o bot errou.
Desafio
Seu desafio é escrever um programa quando, dado um número, produza as instruções adequadas para o bot entrar, de modo que o valor final do bot seja igual a esse número.
Portanto, se o número for 6
, uma solução válida seria:
nnn
(O bot se move para o norte 3 vezes seguidas).
Seus valores de teste são:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Estes são 50 números aleatórios de 1 a 1 bilhão.)
Sua pontuação é a quantidade total de movimentos feitos para todos os 50 números - quanto menos movimentos, melhor. Em caso de empate, a pessoa que enviou seu código anteriormente vence.
Especificações
- Você está garantido para receber um número inteiro positivo para entrada.
- Sua
value
variável não deve ficar acima2^31-1
ou abaixo-2^31
em nenhum momento dos caminhos gerados. - Seu programa final deve caber em uma resposta (portanto,
< 30,000
bytes). - Você pode codificar apenas 10 números.
- Seu programa deve ser executado dentro de 5 minutos em um laptop razoável para qualquer caso de teste.
- Os resultados devem ser os mesmos sempre que o programa for executado para cada número.
fonte
value
, sim? Pelo menos para mim, parece uma restrição imposta à implementação, não o algoritmo real.Respostas:
C ++: pontuação = 453.324.048
OK, precisava de algum tempo para refazer isso, mas aqui está a maneira que eu resolvi.
Depois de estudar o espaço da solução, decidi que minha estratégia seria:
Aqui está o meu resultado: a pontuação total é 453324048
E os caminhos:
Tenho certeza de que há uma maneira de melhorar isso, fazendo alguns movimentos "sul / oeste" do cutelo (dividindo por 4 e multiplicando por 5; por exemplo); mas codificá-lo e garantir que você não caia ou fique preso é complicado.
Outro caminho da solução pode ser tentar voltar do destino para um número "razoável" e, em seguida, encontrar um caminho para esse número menor; mas você terá que "apontar" corretamente, para que o número da etapa corresponda. complicado, mas pode ser a melhor maneira de resolver isso.
Enfim, aqui está o meu código de código:
fonte
Python, Pontuação = 56068747912
Apenas imprime
nenenenenenenen...
para cada número.Irá adicionar uma explicação mais tarde.
fonte
nen
é 2Ferrugem , pontuação = 1758 (ideal entre caminhos sem oeste)
É executado em cerca de 7 segundos no total para 50 números, usando uma pesquisa bidirecional .
Experimente online!
Resultado
fonte
ns
,sn
,ew
ewe
é imediatamente ilegal, além de quaisquer laços no caminhow
,ns
esn
, o que deixa apenas caminhos legais à custa de ignorar caminhos legais comw
.PHP, Pontuação = 1391462099
Uma tentativa rápida, nunca vai para o oeste para simplificar a verificação do caminho e possui poucas regras para decidir a direção a cada passo.
fonte