Tất cả các số Armstrong


11

Số Armstrong (Số hoàn hảo AKA Plus, hoặc số tự sự) là một số bằng tổng nlũy thừa của các chữ số, trong đó nlà số chữ số của số đó.

Ví dụ, 1533chữ số, và 153 = 1^3 + 5^3 + 3^3, vì vậy 153là một số Armstrong.

Ví dụ, 82084chữ số, và 8208 = 8^4 + 2^4 + 0^4 + 8^4, vì vậy 8208là một số Armstrong.

Vào ngày 14 tháng 11 năm 2013 , chúng tôi đã kiểm tra xem một số có phải là số Armstrong không.

Bây giờ, chúng tôi muốn liệt kê tất cả các số Armstrong. Có chính xác các 88số 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

Nhiệm vụ của bạn là xuất chính xác danh sách trên.

Uyển chuyển

Dấu phân cách không phải là dấu ngắt dòng, nhưng dấu phân cách không được chứa bất kỳ chữ số nào.

Một dấu phân cách ở cuối đầu ra là tùy chọn.

Ngoài ra, mã của bạn phải chấm dứt trước cái chết nhiệt của vũ trụ trong một khoảng thời gian hợp lý (giả sử, chưa đầy một ngày ).

Bạn có thể mã hóa kết quả hoặc bất kỳ phần nào trong đó.

Người giới thiệu



Nhiều dấu phân cách có thể được in giữa các yếu tố liên tiếp?
Mego

@Mego miễn là dấu phân cách không chứa bất kỳ chữ số nào.
Leaky Nun

Vì tò mò, liệu có chính thức chứng minh rằng chỉ có 88 người trong số họ, hoặc đó chỉ là có bao nhiêu đã được xác nhận cho đến nay?
Patrick Roberts

Tuyến tính không phải là một tùy chọn ở đây trừ khi ngôn ngữ của bạn có thể thực hiện các 10e33hướng dẫn mỗi giây.
Bạch tuộc ma thuật Urn

Câu trả lời:


13

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

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

Thực thi mất khoảng bốn giờ rưỡi trên máy của tôi. Một số Armstrong được mã hóa cứng, những số còn lại được tính toán.

Tính toán tất cả các số Armstrong về mặt lý thuyết là có thể trong 24 giờ, nhưng cách tiếp cận

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

ổ đĩa thu gom rác. Cho đến nay, tất cả các cài đặt tôi đã thử dẫn đến thông báo lỗi GC hoặc tiêu thụ quá nhiều bộ nhớ.

Làm thế nào nó hoạt động

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
Thật ấn tượng khi bạn thực hiện điều này 85%ngắn hơn so với những gì bạn bắt đầu.
James

3
@DrGreen Vâng, giới hạn thời gian tiếp tục được thư giãn. Nó nói dưới một phút khi tôi bắt đầu bẻ khóa, vì vậy mã hóa cứng là lựa chọn duy nhất. Bây giờ chúng tôi có một ngày, tôi hy vọng sẽ nhận được dưới 50 byte.
Dennis

1

Bình thường, 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

Mã hóa số đếm 0-9 trong mỗi số.

Hãy thử trực tuyến!


0

Python 2 , 358 204 byte

-6 byte nhờ @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:]

Trong máy tính của tôi, nó chạy trong 11 giờ rưỡi.

Làm thế nào nó hoạt động?

Chỉ có một điều là mã hóa cứng, thực tế là từ 32 chữ số trở đi, tất cả các số armstrong đều có các chữ số 0 đến 9. Điều này được xử lý bằng cách sử dụng biến Btrong mã. Tốc độ của nó giảm đáng kể vì số lượng kết hợp giảm đi rất nhiều.


1
+Toán tử Python cho các danh sách được xác định để hoạt động với các chuỗi khác, vì vậy bạn có thể thay thế A+=[t]bằng A+=t,để lưu một byte.
Jonathan Frech

1
sortedxuất hiện ba lần, vì vậy bạn có thể thay thế tất cả các lần xuất hiện Zvà xác định Z=sorted.
Jonathan Frech

Vì nó là Python 2, bạn có thể thay thế thụt lề vòng lặp (4 khoảng trắng) bằng một tab và lưu sáu byte khác.
Jonathan Frech

@JonathanFrech tkhông phải là một chuỗi, vì vậy tôi không thể làm được A+=t, tôi đã sử dụng các tab và khoảng trắng để lưu byte, nó phải đổi lại khi tôi sao chép mã trước đó, cảm ơn
Felipe Nardi Batista

@JonathanFrech tôi đọc sai nhận xét của bạn về A+t,. tôi không thấy dấu phẩy ở đó
Felipe Nardi Batista
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.