Instrucciones
Eres un bot, en una cuadrícula 2D que se extiende infinitamente en las cuatro direcciones, norte, sur, este y oeste. Cuando se le da un número, debe mover el bot para llegar al número objetivo.
Así es como funciona la cuadrícula:
Puede moverse en 4 direcciones: norte, sur, este u oeste. Una vez que se muda de una celda, no se le permite volver a esa celda nuevamente (de manera efectiva, se ha borrado del mapa).
Hay un "contador", que va 1234567890
(lo que va de 1
a 2
... todo el camino hasta 9
, a continuación, a 0
, a continuación, volver a 1
otra vez), que cambia cada vez que se mueve.
También tiene un "valor", que comienza en 0.
Una vez que te mueves en cualquier dirección, se produce una operación matemática, según la dirección en la que te muevas:
- Norte: su valor se incrementa en counter (
value += counter
). - Este: su valor se reduce por counter (
value -= counter
). - Sur: su valor se multiplica por el contador (
value *= counter
). - Oeste: su valor se divide por contador (
value /= counter
).- La división es una división entera, entonces
5/2 -> 2
. - No está permitido dividir por
0
.
- La división es una división entera, entonces
Ejemplo:
Si el bot se mueve hacia el norte 3 veces:
- El primer movimiento "norte" incrementa el contador
1
y lo agrega al valor (que ahora es1
). - El segundo movimiento "norte" incrementa el contador
2
y lo agrega al valor (que ahora es3
). - El tercer movimiento "norte" incrementa el contador
3
y lo agrega al valor (que ahora es6
).
El valor final es 6
.
Muévete al norte, luego al sur nuevamente:
- El primer movimiento "norte" incrementa el contador
1
y lo agrega al valor (que ahora es1
). - El segundo error de movimiento "sur", porque la celda en la que el robot intenta moverse se elimina (del primer movimiento).
No hay un valor final, ya que el bot erró.
Desafío
Su desafío es escribir un programa cuando, dado un número, produce las instrucciones adecuadas para que el bot ingrese de modo que el valor final del bot sea igual a ese número.
Entonces, si el número es 6
, una solución válida sería:
nnn
(El bot se mueve hacia el norte 3 veces seguidas).
Sus valores de prueba son:
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
(Estos son 50 números aleatorios de 1 a 1 billón).
Su puntaje es la cantidad total de movimientos realizados para los 50 números: cuantos menos movimientos, mejor. En caso de empate, la persona que envió su código anteriormente gana.
Especificaciones
- Le garantizamos que recibirá un entero positivo para la entrada.
- Su
value
variable no debe ir arriba2^31-1
o abajo-2^31
en ningún punto para sus rutas generadas. - Su programa final debe caber en una respuesta (entonces,
< 30,000
bytes). - Solo puede codificar 10 números.
- Su programa debe ejecutarse dentro de los 5 minutos en una computadora portátil razonable para cualquier caso de prueba.
- Los resultados DEBEN ser los mismos cada vez que se ejecuta el programa para cada número.
fuente
value
, ¿sí? Al menos para mí, parece una restricción impuesta a la implementación, no el algoritmo real.Respuestas:
C ++: puntaje = 453,324,048
OK, necesitaba algo de tiempo para volver a trabajar esto, pero así es como lo resolví.
Después de estudiar el espacio de solución, decidí que mi estrategia sería:
Aquí está mi resultado: la puntuación total es 453324048
Y los caminos:
Estoy seguro de que hay una manera de mejorar esto haciendo algunos movimientos "sur / oeste" (dividiendo por 4 y multiplicando por 5; por ejemplo); pero codificarlo, y asegurarse de que no te pases de largo o te quedes atrapado, es complicado.
Otra ruta de solución puede ser tratar de bajar del objetivo a un número "razonable", y luego, simplemente encontrar una ruta a ese número menor; pero tendrá que "apuntar" correctamente, para que el número de paso coincida. complicado, pero podría ser la mejor manera de resolver esto.
De todos modos, aquí está mi código de código:
fuente
Python, Puntuación = 56068747912
Solo imprime
nenenenenenenen...
para cada número.Agregará una explicación más tarde.
fuente
nen
es 2Óxido , puntaje = 1758 (óptimo entre caminos sin oeste)
Se ejecuta en aproximadamente 7 segundos en total para 50 números, utilizando una búsqueda bidireccional .
Pruébalo en línea!
Salida
fuente
ns
,sn
,ew
ywe
es inmediatamente ilegal, además de cualquier bucles en el caminow
,ns
ysn
, que deja solo rutas legales a expensas de ignorarlasw
.PHP, Puntuación = 1391462099
Un intento rápido, nunca va al oeste para simplificar la verificación de ruta y tiene pocas reglas para decidir la dirección en cada paso.
fuente