Tengo un mostrador Es un dispositivo pequeño que se ve así:
La pantalla va de 0000
a 9999
. Tiene un pequeño botón en la parte superior que aumenta el recuento en 1, y una pequeña perilla a la derecha cuyo propósito es restablecer el contador a 0.
Ahora, lo que pasa con la pequeña perilla es que si la gira hacia atrás, puede hacer que aumente cualquier dígito que desee una vez que la vuelva a girar hacia adelante. Entonces, si presiono el botón del contador 10 veces para que se muestre el contador 0010
, puedo girar la perilla hacia atrás hasta que escuche un pequeño clic, luego girarla hacia adelante nuevamente y hacer que vaya directamente a 0090
.
Pero, la perilla siempre aumentará todas las ocurrencias del mismo dígito en 1 cada vez que empuje los números hacia adelante. Entonces, si el contador se muestra 6060
, solo puede hacer que aumente a 7070
, no a 6070
o 7060
. Además, el mando rodará 9
s a 0
sin necesidad de llevar, por lo que 0990
avanzará al 0000
lugar de 1000
o 1100
.
Quiero saber la forma más eficiente de configurar el contador en un número determinado. Su tarea es escribir un programa o función que determine la secuencia más corta de presionar un botón y avanzar la perilla para hacerlo.
Su programa tomará como entrada un número de 4 dígitos a partir 0000
de 9999
, y devolver una serie de pasos en el siguiente formato:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Donde C
significa "presione el botón del contador" y cualquier dígito D
del 0 al 9 significa "use la perilla para avanzar todas las apariciones de D
1".
Su programa debe producir una secuencia válida de pasos para todas las combinaciones posibles de cuatro dígitos, y se puntuará por el número total de pasos necesarios para los 10,000 casos. En el caso de un empate (muy probablemente cuando se encuentre el algoritmo óptimo), el código más corto ganará.
fuente
0010
en0020
en ese caso? ¿O solo puedes girar la perilla hacia atrás? Y también, ¿cada "D" cuenta como el número "D" de avances de la perilla (por ejemplo,1234567
significa girar la perilla 1 vez, luego 2 veces, luego 3 veces, etc.)? ¿O solo significa cada giro de la perilla por separado (por ejemplo,1234567
solo significa girar la perilla 7 veces)?Respuestas:
Lua, 327763 pasos (óptimo, 276 bytes)
Versión de golf:
Versión mejorada de los ejemplos en cuestión (solo
1000
se ha mejorado):Versión sin golf:
fuente
Mathematica, puntaje 512710
Corrige un error con
StringRepeat
(se comporta incorrectamente paraStringRepeat[x_String,0]
)fuente
StringRepeat[x_String, 0]:=""
?Pyth, 327763 pasos (óptimo, 130 bytes)
Desde el compilador en línea es inepto en el manejo de dicha tarea enorme, me he dado menos trabajo, por lo que sólo se genera
0
,1
y1111
. Sin embargo, teóricamente puede resolver el problema, ya que utiliza el mismo algoritmo que el Lua en la parte superior.Pruébalo en línea!
Cómo funciona:
fuente
JavaScript (ES6), 327763 pasos (óptimo, 184 bytes)
A Breadth First Search, no tan inteligente ni tan rápido.
Menos golf
Prueba
fuente