Emulando a Dik T. Winter

propuesto por josejuan

Un número de N dígitos es narcisista si la suma de las potencias N-ésimas de sus dígitos es él mismo.

Enunciado
Un número de N dígitos es narcisista si la suma de las potencias N-ésimas de sus dígitos es él mismo.

Por ejemplo, 153 tiene tres dígitos y las potencias terceras de sus dígitos son 1, 125 y 27 que suman 153.

Escribir una función (o programa) que obtenga los narcisistas de N dígitos en el menor tiempo posible.

(La leyenda cuenta, que en 1985, Dik T. Winter revisó todos los números hasta N=60 [no es posible que los haya mayores] en 33 minutos en una máquina Vax de la época).

http://en.wikipedia.org/wiki/Narcissistic_number
Preguntas sobre el desafío

¿Tienes dudas sobre el desafío? plantéala aquí

Plantea tu pregunta

18 Soluciones

Dar mi solución

0votos
Emulando a Dik T. Winter en Ruby
por

MrReplay

hace 3 años

la entrada del intervalo se concodera de 1 a n, donde se itera para cada numero que es convertido posteriormete a cadena y la suma es elevada a la cantidad de sus digitos la suma es acumulada y una vez terminado el intervalo se verifica si la suma es igual al numero, en 0.3s

0votos
Emulando a Dik T. Winter en C#
por

josejuan

hace 5 años

Traslación directa de la de javascript. En C# corre mucho más rápido (x29) que la de F# (algo debe haber mal ahí). Ésta corre mejor con x64 que `Any CPU` (debería, puesto que se usan longs). En un Athlon a 2Ghz, n=9 toma 62mS.

1voto
Emulando a Dik T. Winter en F#
por

josejuan

hace 5 años

Ésta va para juan ;) Una traslación de la de javascript, corriendo bajo mono va notablemente más lenta que la de javascript. Corriendo en .Net de MS probablemente vaya mejor y seguro que depurando se puede mejorar.

1voto
Emulando a Dik T. Winter en JavaScript
por

Pedro-vk

hace 5 años

Con WebWorkers, usando paralelización y con buffer para las potencias (inspirado por la solución de Jose Juan en C). Pese a ser JavaScript se pasa desde el primer algoritmo sin paralelizar de unos 9 segundos para ejecutar los 7 dígitos, ha 2.5 con paralelizado y 0.9 con paralelizado y buffer.

0votos
Emulando a Dik T. Winter en C
por

josejuan

hace 6 años

Un speedup que se puede hacer fácilmente es mirar si con la suma parcial que llevamos acumulada es suficiente para, con el resto de dígitos a 9999, da para alcanzar el tamaño en bits que se pide. Con ésto, conseguimos una mejora del 50% sobre el algoritmo anterior.

0votos
Emulando a Dik T. Winter en C
por

josejuan

hace 6 años

No he encontrado ninguna propiedad mejor que la invarianza de las posiciones de los dígitos. Dik debía de saber una propiedad muy interesante de los Narcisistas. XD XD He basado mi solución en una optimización agresiva del código en C y una implementación a mano de operaciones en base 10. No arroja malos tiempos.

Dar mi solución