Inspirado por esta cuestión en Math.SE .
Comenzando con 1
usted, puede realizar repetidamente una de las siguientes dos operaciones:
Duplica el número.
o
Reorganice sus dígitos de la forma que desee, excepto que no debe haber ceros a la izquierda.
Tomando un ejemplo de la publicación vinculada Math.SE, podemos llegar a 1000
través de los siguientes pasos:
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 125, 250, 500, 1000
¿Qué números puede alcanzar con este proceso y cuál es la solución más corta?
El reto
Dado un número entero positivo N
, determine la secuencia más corta posible de números enteros para alcanzar N
con el proceso anterior, si es posible. Si hay varias soluciones óptimas, envíe cualquiera de ellas. Si no existe tal secuencia, debe generar una lista vacía.
La secuencia puede estar en cualquier formato de cadena o lista conveniente y sin ambigüedades.
Puede escribir un programa o función, tomando entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), valor de retorno de función o parámetro de función (out).
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Aquí hay una lista de todos los números alcanzables hasta 256. La primera columna es el número (su entrada), la segunda columna es el número óptimo de pasos (que puede usar para verificar la validez de su solución) y la tercera La columna es una secuencia óptima para llegar allí:
1 1 {1}
2 2 {1,2}
4 3 {1,2,4}
8 4 {1,2,4,8}
16 5 {1,2,4,8,16}
23 7 {1,2,4,8,16,32,23}
29 10 {1,2,4,8,16,32,23,46,92,29}
32 6 {1,2,4,8,16,32}
46 8 {1,2,4,8,16,32,23,46}
58 11 {1,2,4,8,16,32,23,46,92,29,58}
61 6 {1,2,4,8,16,61}
64 7 {1,2,4,8,16,32,64}
85 12 {1,2,4,8,16,32,23,46,92,29,58,85}
92 9 {1,2,4,8,16,32,23,46,92}
104 15 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104}
106 14 {1,2,4,8,16,32,64,128,256,265,530,305,610,106}
107 14 {1,2,4,8,16,32,23,46,92,29,58,85,170,107}
109 18 {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,109}
116 12 {1,2,4,8,16,32,23,46,92,29,58,116}
122 7 {1,2,4,8,16,61,122}
124 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124}
125 11 {1,2,4,8,16,32,64,128,256,512,125}
128 8 {1,2,4,8,16,32,64,128}
136 18 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,136}
140 15 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,140}
142 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,142}
145 17 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145}
146 18 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,146}
148 11 {1,2,4,8,16,32,23,46,92,184,148}
149 16 {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,149}
152 11 {1,2,4,8,16,32,64,128,256,512,152}
154 17 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154}
158 16 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158}
160 14 {1,2,4,8,16,32,64,128,256,265,530,305,610,160}
161 13 {1,2,4,8,16,32,23,46,92,29,58,116,161}
163 18 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,163}
164 18 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,164}
166 20 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166}
167 17 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,167}
169 23 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,169}
170 13 {1,2,4,8,16,32,23,46,92,29,58,85,170}
176 17 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176}
182 9 {1,2,4,8,16,32,64,128,182}
184 10 {1,2,4,8,16,32,23,46,92,184}
185 16 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185}
188 23 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185,370,740,470,940,409,818,188}
190 18 {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,190}
194 16 {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,194}
196 23 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,196}
203 16 {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,203}
205 13 {1,2,4,8,16,32,64,128,256,512,125,250,205}
208 16 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208}
209 19 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145,290,209}
212 8 {1,2,4,8,16,61,122,212}
214 15 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214}
215 11 {1,2,4,8,16,32,64,128,256,512,215}
218 9 {1,2,4,8,16,32,64,128,218}
221 8 {1,2,4,8,16,61,122,221}
223 14 {1,2,4,8,16,32,23,46,92,29,58,116,232,223}
227 20 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,361,722,227}
229 20 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229}
230 16 {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,230}
232 13 {1,2,4,8,16,32,23,46,92,29,58,116,232}
233 22 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233}
235 19 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,235}
236 19 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,236}
238 19 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,832,238}
239 25 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233,466,932,239}
241 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,241}
244 8 {1,2,4,8,16,61,122,244}
247 21 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,362,724,247}
248 17 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124,248}
250 12 {1,2,4,8,16,32,64,128,256,512,125,250}
251 11 {1,2,4,8,16,32,64,128,256,512,251}
253 19 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,253}
256 9 {1,2,4,8,16,32,64,128,256}
Si desea aún más datos de prueba, aquí está la misma tabla hasta 1,000 inclusive .
Cualquier número que no aparezca en estas tablas debería generar una lista vacía (siempre que el número esté en el rango de la tabla).
fuente
Respuestas:
Pyth, 43 bytes
Demostración.
Esto comienza generando todas las posibles secuencias dobles o de reordenamiento. Sin embargo, como realmente quería verlo terminar, agregué un corto circuito.
Se ejecuta hasta que encuentra una solución, o para un número de iteraciones igual a la entrada, en cuyo punto se da por vencido y regresa
[]
.Esto garantiza que haya suficientes iteraciones. Primero, sabemos que esta cantidad de iteraciones es suficiente para todos n <= 1000, gracias a los resultados del ejemplo. Para números más grandes, el siguiente argumento es válido:
Primero, cada paso del proceso debe mantener o aumentar el número de dígitos.
Segundo, tres números que son todos reordenamientos uno del otro nunca pueden aparecer en una secuencia más corta, porque hubiera sido más rápido hacer un solo reordenamiento desde el primero hasta el último.
Tercero, todos los múltiplos de 3 son inalcanzables, ya que ni la duplicación ni la reorganización pueden producir un múltiplo de 3 a partir de un no múltiplo de 3.
Por lo tanto, la secuencia más larga posible que termina en un número dado es igual a la suma de dos veces el número de conjuntos de dígitos con menos o igual a tantos dígitos como la entrada, y donde los dígitos no suman un múltiplo de 3.
El número de tales conjuntos de dígitos para cada número de dígitos:
Además, sabemos por los ejemplos que la secuencia más corta que termina con un número de 3 dígitos tiene una longitud mayor que 26. Por lo tanto, un límite superior de las longitudes de secuencia es:
En cada caso, el límite superior es más bajo que cualquier número con el número de dígitos
El número de conjuntos de dígitos no puede crecer en más de un factor de 10 cuando el número de dígitos se incrementa en uno, porque los nuevos números se pueden separar en grupos por el último dígito, cada uno de los cuales no puede tener más conjuntos de los que había con uno menos dígito.
Por lo tanto, el límite superior será menor que cualquier número con tantos dígitos para todos los números posibles de dígitos mayores o iguales a 4, lo que completa la prueba de que un número de iteraciones igual a la entrada siempre es suficiente.
fuente
SWI-Prolog, 252 bytes
Ejemplo:
a(92,Z).
salidasZ = [1, 2, 4, 8, 16, 32, 64, 46, 92]
Todavía no he comprobado que esto funciona para N> 99 debido al tiempo que lleva, pero no veo ninguna razón por la que no funcionaría.
fuente
Julia,
306245218 bytesTodavía estoy trabajando en esto. Proporcionará una versión sin golf una vez que haya terminado.
fuente
Haskell, 246 bytes
No estoy completamente seguro de si esto funciona, si la secuencia que primero diverge más abajo (como para ser ordenada más abajo) siempre es más corta, como por ejemplo
[1,2,4,8,16,32,64,128,256,512,125,250,500,1000]
es más corto que
[1,2,4,8,16,32,64,128,256,512,251,502,250,500,1000]
que probé para ser verdad hasta 1000.
fuente
C # 655 bytes
Llamar con (LinqPad):
No he probado números superiores a 99. Si tienes tiempo -> buena suerte ;-)
editar: versión sin golf:
fuente
CJam, 83
Pruébalo en línea
He estado sentado en esto durante mucho tiempo, no es muy corto ni rápido, y no estoy seguro de tener la energía / motivación para mejorarlo, así que solo lo estoy publicando.
fuente