Semua angka Armstrong

11

Angka Armstrong (angka AKA Plus Perfect, atau angka narsis) adalah angka yang sama dengan jumlah nkekuatan ke-digitnya, di mana nadalah jumlah digit dari angka tersebut.

Misalnya, 153memiliki 3angka, dan 153 = 1^3 + 5^3 + 3^3begitu 153juga angka Armstrong.

Misalnya, 8208memiliki 4angka, dan 8208 = 8^4 + 2^4 + 0^4 + 8^4begitu 8208juga angka Armstrong.

Pada 14 November 2013 , kami menguji apakah suatu angka adalah angka Armstrong.

Sekarang, kami ingin mendaftar semua nomor Armstrong. Tepatnya ada 88nomor 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

Tugas Anda adalah menampilkan persis daftar di atas.

Fleksibilitas

Pemisah tidak harus berupa pemisah baris, tetapi pemisah tidak boleh mengandung digit apa pun.

Pemisah trailing di akhir output adalah opsional.

Juga, kode Anda harus berakhir sebelum kematian panas alam semesta dalam jumlah waktu yang wajar (katakanlah, kurang dari sehari ).

Anda dapat membuat hard-code hasil atau bagiannya.

Referensi

Biarawati Bocor
sumber
Terkait: angka 4-sempurna
Sp3000
Bisakah beberapa pemisah dicetak antara elemen-elemen yang berurutan?
Mego
@Mego selama pemisah tidak mengandung digit apa pun.
Leaky Nun
Hanya karena penasaran, apakah secara resmi terbukti hanya ada 88, atau hanya berapa banyak yang sudah dikonfirmasi sejauh ini?
Patrick Roberts
Linear bukan pilihan di sini kecuali bahasa Anda dapat menjalankan 10e33instruksi per detik.
Magic Octopus Mm

Jawaban:

13

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

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

Eksekusi memakan waktu sekitar empat setengah jam di mesin saya. Satu nomor Armstrong di-hardcode, yang lainnya dihitung.

Menghitung semua angka Armstrong secara teori dimungkinkan dalam 24 jam, tetapi pendekatannya

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

menggerakkan kacang pengumpul sampah. Sejauh ini, semua pengaturan yang saya coba menghasilkan pesan kesalahan GC atau terlalu banyak konsumsi memori.

Bagaimana itu bekerja

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.
Dennis
sumber
2
Sangat mengesankan bahwa Anda membuat ini 85%lebih pendek dari apa yang Anda mulai.
James
3
@DrGreen Nah, batas waktu terus santai. Dikatakan di bawah satu menit ketika saya mulai retak, jadi hardcoding adalah satu-satunya pilihan. Sekarang kita punya hari, saya berharap bisa di bawah 50 byte.
Dennis
1

Pyth, 330 byte

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

Menyandikan hitungan jumlah 0-9 di setiap angka.

Cobalah online!

Biarawati Bocor
sumber
0

Python 2 , 358 204 byte

-6 byte terima kasih kepada @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:]

Di komputer saya, itu berjalan dalam 11 setengah jam.

Bagaimana itu bekerja?

Hanya satu hal yang di-hardcode, fakta bahwa dari 32 digit dan seterusnya, semua angka kuat memiliki angka 0 hingga 9. Ini ditangani oleh penggunaan variabel Bdalam kode. Kecepatannya turun secara signifikan karena jumlah kombinasi berkurang banyak.

Felipe Nardi Batista
sumber
1
+Operator untuk daftar Python didefinisikan untuk bekerja dengan urutan lain, sehingga Anda dapat menggantinya A+=[t]dengan A+=t,untuk menyimpan byte.
Jonathan Frech
1
sortedmuncul tiga kali, sehingga Anda dapat mengganti semua kejadian dengan Zdan menetapkan Z=sorted.
Jonathan Frech
Karena ini adalah Python 2, Anda dapat mengganti lekukan for-loop (4 spasi) dengan satu tab dan menyimpan enam byte lainnya.
Jonathan Frech
@JonathanFrech tbukan berurutan, jadi saya tidak bisa melakukannya A+=t, saya menggunakan tab dan spasi untuk menyimpan byte, itu pasti telah ditukar kembali ketika saya menyalin kode sebelumnya, terima kasih
Felipe Nardi Batista
@JonathanFrech saya salah membaca komentar Anda tentang A+t,. saya tidak melihat koma di sana
Felipe Nardi Batista