Tengo un mostrador Es un dispositivo pequeño que se ve así:
La pantalla va de 0000a 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 6070o 7060. Además, el mando rodará 9s a 0sin necesidad de llevar, por lo que 0990avanzará al 0000lugar de 1000o 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 0000de 9999, y devolver una serie de pasos en el siguiente formato:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Donde Csignifica "presione el botón del contador" y cualquier dígito Ddel 0 al 9 significa "use la perilla para avanzar todas las apariciones de D1".
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


0010en0020en 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,1234567significa girar la perilla 1 vez, luego 2 veces, luego 3 veces, etc.)? ¿O solo significa cada giro de la perilla por separado (por ejemplo,1234567solo 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
1000se 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,1y1111. 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