모든 암스트롱 번호


11

암스트롱 숫자 (AKA Plus Perfect 숫자 또는 자기애 숫자)는 숫자의 n제곱 거듭 제곱의 합과 같은 숫자입니다. 여기서 n숫자의 자릿수입니다.

예를 들어, 1533자리하고 153 = 1^3 + 5^3 + 3^3있으므로, 153암스트롱 번호입니다.

예를 들어, 82084자리하고 8208 = 8^4 + 2^4 + 0^4 + 8^4있으므로, 8208암스트롱 번호입니다.

2013 년 11 월 14 일 에 숫자가 암스트롱 숫자인지 테스트했습니다.

이제 모든 암스트롱 번호를 나열하고 싶습니다. 정확히 88암스트롱 숫자가 있습니다 :

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

당신의 임무는 정확히 위의 목록을 출력하는 것입니다.

적응성

구분 기호 줄 바꿈 일 필요는 없지만 구분 기호에는 숫자가 없어야합니다.

출력 끝의 후미 구분 기호는 선택 사항입니다.

또한 코드는 우주의 열사 전에 합리적인 시간 (예 : 하루 미만)으로 종료되어야합니다 .

결과 또는 그 일부를 하드 코딩 있습니다 .

참고 문헌



연속 요소간에 여러 구분 기호를 인쇄 할 수 있습니까?
Mego

구분 기호에 숫자가없는 한 @Mego.
Leaky Nun

호기심에서, 그들 중 88 명만이 있다는 것이 공식적으로 입증 되었습니까, 아니면 지금까지 얼마나 많은 사람이 확인 되었습니까?
Patrick Roberts

귀하의 언어가 10e33초당 명령 을 실행할 수 없다면 Linear는 옵션이 아닙니다 .
Magic Octopus Urn

답변:


13

CJam, 626 397 325 218 168 134 93 55 54 53 바이트

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

내 컴퓨터에서 실행하는 데 약 4 시간 30 분이 걸립니다. 하나의 암스트롱 번호는 하드 코딩되고 나머지는 계산됩니다.

이론적으로 모든 암스트롱 수를 계산하는 것은 24 시간 안에 가능하지만

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

가비지 수집기 너트를 구동합니다. 지금까지 시도한 모든 설정에서 GC 오류 메시지 또는 너무 많은 메모리 소비가 발생했습니다.

작동 원리

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
85%처음 시작한 것보다 짧게 만든 것이 매우 인상적입니다 .
James

3
@ DrGreen 글쎄, 시간 제한은 계속 편안해졌습니다. 내가 크래킹을 시작했을 때 1 분 안에 말했다 . 그래서 하드 코딩은 거의 유일한 옵션이었다. 이제 하루가 있으므로 50 바이트 미만이되기를 바랍니다.
Dennis

1

Pyth, 330 바이트

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

각 숫자에서 0-9의 개수를 인코딩합니다.

온라인으로 사용해보십시오!


0

파이썬 2 , 358204 바이트

@JonathanFrech 덕분에 -6 바이트

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:]

내 컴퓨터에서는 11 시간 반 만에 실행되었습니다.

어떻게 작동합니까?

32 자리부터 모든 암스트롱 번호는 0에서 9까지의 숫자를 갖습니다 B. 이는 코드 에서 변수의 사용에 의해 처리됩니다 . 조합 횟수가 많이 줄어들면 속도가 크게 줄어 듭니다.


1
파이썬의 +사용자가 교체 할 수 있도록 목록의 연산자는, 다른 시퀀스와 함께 작동하도록 정의 A+=[t]A+=t,바이트 저장합니다.
Jonathan Frech

1
sorted이 세 번 나타나므로 모든 발생을 Z및로 대체 할 수 있습니다 Z=sorted.
Jonathan Frech

Python 2이므로 for-loop 들여 쓰기 (4 개의 공백)를 하나의 탭으로 바꾸고 다른 6 바이트를 저장할 수 있습니다.
Jonathan Frech

@JonathanFrech은 t내가 할 수없는, 그래서 순서 아니다 A+=t, 내가 바이트를 저장 탭과 공백을 사용하던 내가, 코드 이전 덕분에 복사 할 때, 그것은 다시 교환해야합니다
펠리페 나르디 바티스타를

@JonathanFrech에 대한 의견을 잘못 읽었습니다 A+t,. 나는 거기에 쉼표 보지 못했다
펠리페 나르디 바티스타
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.