Este problema es bastante fácil de hacer por fuerza bruta. De hecho, será razonablemente rápido para la fuerza bruta también. ¿Pero dónde está la diversión en eso?
El problema
Produzca una lista de todos los pares de números de 5 dígitos únicos que sumen 121212
. Sin embargo, cada dígito decimal debe aparecer exactamente una vez en cualquier número. Entonces sería un par válido (98167, 23045)
. Pero un par no válido se debe a (23456, 97756)
que 7, 5, 6
se repiten más de una vez y 1, 8, 0
no se utilizan en absoluto. Hay exactamente 192 pares únicos.
Reglas
Eficiencia: puedes forzarlo con fuerza bruta. Pero eso es trivial de hacer. Entonces, en cambio, el verdadero desafío aquí es encontrar una manera de producir eficientemente la lista de números.
Requisitos del código fuente: no puede almacenar la lista de números (ni ninguna parte de ella). La secuencia numérica se debe generar sobre la marcha.
¡Que te diviertas!
fuente
Respuestas:
JavaScript
Alojado en: http://ebusiness.hopto.org/findpairs.htm
Realización matemática: si tiene un par, se pueden generar otros 15 trivialmente intercambiando dígitos entre los dos números, por lo tanto, solo busco números en los que los dígitos del primero sean todos mayores que los dígitos del segundo, y luego simplemente genere todos los permutaciones
Comienzo desde los dígitos menos significativos y genero la secuencia como un recorrido de árbol, para cada paso afirmando que el resultado intermedio es correcto y que no se gastan dígitos dos veces. Con estos métodos, la función solo necesita llamarse 50 veces en total. En mi máquina, Chrome produce resultados de tiempo de ejecución de 2 ms.
fuente
C ++
http://www.ideone.com/Lr84g
fuente
10!/2
) y luego verifica si es sumable a 121212. No está nada mal para una primera ejecución. Pero todavía tengo curiosidad si podemos ser más eficientes ...(51430, 69872)
es un par válido. Puede almacenar previamente la lista de dígitos (0123456789
) y la suma (121212
).Python 2.
Es bastante eficiente porque construye los números (el bucle más interno se ejecuta 4570 veces en total) y bastante corto porque jugué un poco (201 caracteres), pero no estoy realmente seguro de querer explicar esto :)
Sin embargo, los valores devueltos son bastante peculiares: llame
w
con una tupla vacía y obtendrá un iterador de 10 tuplas. Estas 10 tuplas son los dígitos de los dos números, por desgracia, al revés y alternativamente , es decir, la tuplarepresenta los números 51430 y 69782.
Prueba:
Aquí está la versión sin golf:
fuente
C
Esto atraviesa todos los pares de números de 5 dígitos que suman 121212 (es decir, 39393 iteraciones, o ~ 1/46 de las iteraciones utilizadas por la respuesta de fR0DDY ). Para cada par, forma una máscara de bits de los dígitos en cada número, luego ve si OR a 0b1111111111.
fuente
Javascript (481)
http://jsfiddle.net/XAYr3/4/
Idea básica: generar combinaciones de dígitos válidos que se pueden usar en la columna de la derecha. Por ejemplo, (0,2), (3,9), (4,8), (5,7). Para cada combinación, encuentre recursivamente pares que funcionen para el siguiente dígito desde la derecha, sin duplicar dígitos en el primer par. Repetir hasta que se haya generado un par de números de 5 dígitos. Combine todos esos resultados en una sola matriz, y la lista es de 192 elementos. Creo que esto debería requerir la menor cantidad de iteraciones, pero toda la asignación / desasignación de matrices lo hace en general prácticamente ineficiente.
Mis pruebas de conteo muestran que la función
f
se llama 310 veces, el bucle internoi
se ejecuta 501 veces en total (en todas las llamadas af
) y el bucle interno-internoj
se ejecuta 768 veces en total (en todo).fuente
Python, 171 caracteres
El código mantiene el invariante que
x
,y
tienenc
dígitos y que todos los dígitos no utilizados están en el conjuntod
.La rutina
R
se llama un total de 841 veces, lo cual es bastante eficiente.fuente
C ++
http://www.ideone.com/Lr84g
fuente