Todos los números de Armstrong


11

Un número de Armstrong (AKA Plus Perfect number, o número narcisista) es un número que es igual a la suma de la nenésima potencia de los dígitos, donde nes el número de dígitos del número.

Por ejemplo, 153tiene 3dígitos y 153 = 1^3 + 5^3 + 3^3, por 153lo tanto, es un número de Armstrong.

Por ejemplo, 8208tiene 4dígitos y 8208 = 8^4 + 2^4 + 0^4 + 8^4, por 8208lo tanto, es un número de Armstrong.

El 14 de noviembre de 2013 , probamos si un número es un número de Armstrong.

Ahora, nos gustaría enumerar todos los números de Armstrong. Hay exactamente 88números de Armstrong:

1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
24678050
24678051
88593477
146511208
472335975
534494836
912985153
4679307774
32164049650
32164049651
40028394225
42678290603
44708635679
49388550606
82693916578
94204591914
28116440335967
4338281769391370
4338281769391371
21897142587612075
35641594208964132
35875699062250035
1517841543307505039
3289582984443187032
4498128791164624869
4929273885928088826
63105425988599693916
128468643043731391252
449177399146038697307
21887696841122916288858
27879694893054074471405
27907865009977052567814
28361281321319229463398
35452590104031691935943
174088005938065293023722
188451485447897896036875
239313664430041569350093
1550475334214501539088894
1553242162893771850669378
3706907995955475988644380
3706907995955475988644381
4422095118095899619457938
121204998563613372405438066
121270696006801314328439376
128851796696487777842012787
174650464499531377631639254
177265453171792792366489765
14607640612971980372614873089
19008174136254279995012734740
19008174136254279995012734741
23866716435523975980390369295
1145037275765491025924292050346
1927890457142960697580636236639
2309092682616190307509695338915
17333509997782249308725103962772
186709961001538790100634132976990
186709961001538790100634132976991
1122763285329372541592822900204593
12639369517103790328947807201478392
12679937780272278566303885594196922
1219167219625434121569735803609966019
12815792078366059955099770545296129367
115132219018763992565095597973971522400
115132219018763992565095597973971522401

Su tarea es generar exactamente la lista anterior.

Flexibilidad

El separador no tiene que ser un salto de línea, pero el separador no debe contener ningún dígito.

Un separador final al final de la salida es opcional.

Además, su código debe finalizar antes de la muerte por calor del universo en un período de tiempo razonable (digamos, menos de un día ).

Usted puede código el resultado o cualquier parte del mismo.

Referencias



¿Se pueden imprimir separadores múltiples entre elementos sucesivos?
Mego

@Mego siempre que el separador no contenga ningún dígito.
Leaky Nun

Solo por curiosidad, ¿está formalmente probado que solo hay 88 de ellos, o es solo cuántos se han confirmado hasta ahora?
Patrick Roberts

Lineal no es una opción aquí a menos que su idioma pueda ejecutar 10e33instrucciones por segundo.
Magic Octopus Urn

Respuestas:


13

CJam, 626 397 325 218 168 134 93 55 54 53 bytes

8A#{[_8b3394241224Ab?A0e[A,]ze~__,f#:+s_$@s=*~}%$1>N*

La ejecución lleva aproximadamente cuatro horas y media en mi máquina. Un número de Armstrong está codificado, los restantes se calculan.

Calcular todos los números de Armstrong es teóricamente posible en 24 horas, pero el enfoque

9A#{_9b8 9erA0e[A,]ze~__,f#:+s_$@s=*~}%$1>N*

conduce las tuercas del recolector de basura. Hasta ahora, todas las configuraciones que he probado dan como resultado un mensaje de error de GC o demasiado consumo de memoria.

Cómo funciona

8A#              e# Compute 8¹⁰ = 1,073,741,824.
{                e# Map the following block over all I in [0 ... 1,073,741,824].
  [              e#   Begin an array.
    _8b          e#     Copy I and convert the copy to base 8.
    3394241224Ab e#     Push [3 3 9 4 2 4 1 2 2 4], the representation of the
                 e#     Armstrong number 1122763285329372541592822900204593.
    ?            e#     If I is non-zero, select the array of base 8 digits.
                 e#     Otherwise, select the hardcoded representation.
    A0e[         e#     Left-pad the digit array with 0's to length 10.
    A,           e#     Push [0 1 2 3 4 5 6 7 8 9].
  ]              e#   End the array.
  ze~            e#   Transpose and perform run-length decoding, repeating the
                 e#   digit n k times, where k in the n-th entry of the repr.
                 e#   This is a potential Armstrong number, with sorted digits.
  _              e#   Push a copy.
  _,             e#   Compute the length of yet another copy.
  f#             e#   Elevate all digits to that power.
  :+s            e#   Add the results and cast to string.
  _$             e#   Push a sorted copy.
  @s             e#   Stringify the sorted digits.
  =*             e#   Compare for equality and repeat the string that many times.
                 e#   This pushes either the representation of an Armstong number
                 e#   or an empty string.
  ~              e#   Evaluate, pushing the number or doing nothing.
}%               e#
$1>              e# Sort and remove the lowest number (0).
N*               e# Join, separating by linefeeds.

2
Es muy impresionante que haya hecho esto 85%más corto de lo que comenzó.
James

3
@DrGreen Bueno, el límite de tiempo seguía relajándose. Dijo menos de un minuto cuando comencé a agrietarme, por lo que la codificación era prácticamente la única opción. Ahora que tenemos un día, espero obtener menos de 50 bytes.
Dennis

1

Pyth, 330 bytes

0000000: 6a 6d 73 2e 65 2a 73 62 5e 6b 73 73 4d 64 64 63 jms.e*sb^kssMddc
0000010: 2e 5a 22 78 da ad 50 51 76 03 30 08 ba 52 04 4d .Z"x..PQv.0..R.M
0000020: de ee 7f b1 81 26 dd f6 bf f6 35 35 28 08 59 b1 .....&....55(.Y.
0000030: 3e 9f 7f 2e e7 3b 68 ac f7 8b 3f c0 c5 e2 57 73 >....;h...?...Ws
0000040: 2d bc f3 02 e8 89 8b a3 eb be cf a1 ae 3b 33 84 -............;3.
0000050: 01 66 1a 23 d7 40 8c 06 d0 eb e6 fa aa 96 12 17 .f.#.@..........
0000060: 11 bc f8 d0 e0 6d 96 e2 d0 f1 b3 41 c7 8a 74 19 .....m.....A..t.
0000070: 3d b8 fc 77 2b 2c ce 88 05 86 d6 9e d5 f5 4c 37 =..w+,........L7
0000080: b0 9e ab 46 75 a1 37 f1 5d 5b 36 dd 86 e5 6e 15 ...Fu.7.][6...n.
0000090: a4 09 b4 0c 40 a7 01 1d 2a 8d a8 49 e4 ac 23 1d ....@...*..I..#.
00000a0: 25 c5 55 53 02 be 66 c7 dd bd c3 4a 28 9d 39 57 %.US..f....J(.9W
00000b0: 6f 11 92 ca 94 8a a5 87 38 4e 1d 25 17 60 3a 2d o.......8N.%.`:-
00000c0: 51 5a 96 55 7e 04 7a 41 aa b1 84 c4 88 10 fd 28 QZ.U~.zA.......(
00000d0: 04 37 64 68 ab 58 1e 0c 66 99 de a6 4c 34 2e 51 .7dh.X..f...L4.Q
00000e0: 19 96 fc a7 ea 01 6d de b4 2b 59 01 52 1b 1c 6e ......m..+Y.R..n
00000f0: 92 eb 38 5c 22 68 6f 69 60 e9 ab 17 60 6e e9 6b ..8\"hoi`...`n.k
0000100: 44 d6 52 44 33 fd 72 c9 7a 95 28 b2 a8 91 12 88 D.RD3.r.z.(.....
0000110: 74 0a 7b 10 59 16 ab 44 5a 4e d8 17 e5 d8 a8 a3 t.{.Y..DZN......
0000120: 97 09 27 d9 7b bf 8a fc ca 6b 2a a5 11 28 89 09 ..'.{....k*..(..
0000130: 76 3a 19 3a 93 3b b6 2d eb 2c 9c dc 45 a9 65 1c v:.:.;.-.,..E.e.
0000140: f9 be d5 37 27 6e aa cf 22 54                   ...7'n.."T

Codifica el recuento del número de 0-9 en cada número.

Pruébalo en línea!


0

Python 2 , 358204 bytes

-6 bytes gracias a @JonathanFrech

from itertools import*
R=range
S=sorted
A=[]
for i in R(40):
 B=(i>31)*10
 for c in combinations_with_replacement(R(10),i-B):t=sum(d**i for d in c);A+=[t]*(S(map(int,str(t)))==S(S(c)+R(B)))
print S(A)[1:]

En mi computadora, funcionó en 11 horas y media.

¿Cómo funciona?

Solo una cosa está codificada, el hecho de que a partir de 32 dígitos en adelante, todos los números de Armstrong tienen los dígitos del 0 al 9. Esto se maneja mediante el uso de la variable Ben el código. Su velocidad disminuye significativamente ya que la cantidad de combinaciones se reduce mucho.


1
Pitón de +operador para las listas se define al trabajo con otras secuencias, para que pueda reemplazar A+=[t]con A+=t,Para guardar un byte.
Jonathan Frech

1
sortedaparece tres veces, por lo que puede reemplazar todas las ocurrencias con Zy definir Z=sorted.
Jonathan Frech

Como es Python 2, puede reemplazar su sangría for-loop (4 espacios) con una pestaña y guardar otros seis bytes.
Jonathan Frech

@JonathanFrech tno es una secuencia, así que no puedo hacerlo A+=t, estaba usando pestañas y espacios para guardar bytes, debe haber cambiado cuando copié el código anteriormente, gracias
Felipe Nardi Batista

@ JonathanFrech leí mal tu comentario sobre el A+t,. no vi la coma allí
Felipe Nardi Batista
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.