すべてのアームストロング番号


11

アームストロング数(別名、完全な数、または自己陶酔的な数)は、そのn桁の累乗の合計に等しいn数です。ここで、は数字の桁数です。

たとえば、153持っている3数字を、および153 = 1^3 + 5^3 + 3^3ので、153アームストロングの番号です。

たとえば、8208持っている4数字を、および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

あなたの仕事は、上記のリストを正確に出力することです。

柔軟性

区切り文字改行である必要はありませんが、区切り文字に数字を含めることはできません。

出力の最後の末尾の区切り文字はオプションです。

また、あなたのコードは、妥当な時間内(たとえば、1日未満)に宇宙の熱死の前に終了しなければなりません。

あなたはよいハードコード結果またはその一部。

参照資料



連続する要素間に複数のセパレータを印刷できますか
メゴ

区切り文字に数字が含まれていない限り、@ Mego。
リーキー修道女

好奇心から、88人しかいないことが正式に証明されていますか?
パトリックロバーツ

ここでは、言語が10e331秒あたりの命令を実行できない限り、Linearはオプションではありません。
魔法のタコUr

回答:


13

CJam、626 397 325 218 168 134 93 55 54 53バイト

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

実行には約4時間半かかります。1つのアームストロング番号がハードコーディングされ、残りの1つが計算されます。

すべてのアームストロング数の計算は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%元々よりも短くしたことは非常に印象的です。
ジェームズ

3
@DrGreenまあ、時間制限は緩和され続けました。それは言っ分の下で、私が割れ始めたとき、とてもハードコーディングはかなり唯一の選択肢でした。1日が終わったので、50バイト未満にしたいと思っています。
デニス

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

パイソン2358の 204バイト

@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時間半で実行されました。

使い方?

ハードコーディングされているのは1つだけです。32桁以降、すべてのアームストロング番号は0〜9の数字を持っています。これはB、コード内の変数の使用によって処理されます。組み合わせの数が大幅に減少すると、速度は大幅に低下します。


1
+リストのPythonの演算子は、他のシーケンスで動作するように定義されているため、で置き換えA+=[t]A+=t,バイトを保存できます。
ジョナサンフレッチ

1
sortedが3回表示されるため、すべての出現をZで定義して定義できますZ=sorted
ジョナサンフレッチ

Python 2であるため、forループのインデント(4スペース)を1つのタブに置き換えて、さらに6バイト節約できます。
ジョナサンフレッチ

@JonathanFrech t私が行うことができないので、シーケンスではありませんA+=t、私はバイトを保存するには、タブとスペースを使用して、私は、以前のコードをコピーしたときに、それが背中を交換している必要があり、感謝して、
フェリペ・ナルディバティスタ

@JonathanFrechについてのコメントを読み間違えましたA+t,。コンマが表示されませんでした
フェリペナルディバティスタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.