所有阿姆斯壮数字


11

阿姆斯壮数字(AKA Plus完美数字或自恋数字)是一个数字,等于其数字的n-次幂的和,其中n是数字的位数。

例如,153具有3数字,和153 = 1^3 + 5^3 + 3^3153阿姆斯壮数字也是如此。

例如,8208具有4数字,和8208 = 8^4 + 2^4 + 0^4 + 8^48208阿姆斯壮数字也是如此。

在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每秒可以执行指令,否则线性不是此处的选择。
魔术章鱼缸

Answers:


13

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

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

在我的机器上执行大约需要四个半小时。一个阿姆斯壮数字被硬编码,其余的被计算。

理论上,可以在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好吧,时间限制越来越放松。它说的我开始破解的时间不到一分钟,因此硬编码几乎是唯一的选择。现在我们有一天了,我希望少于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

Python 2中358个 204字节

-6个字节,感谢@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:]

在我的计算机上,它运行了11个半小时。

这个怎么运作?

从32位开始,所有阿姆斯壮数字都具有0到9的数字,这是硬编码的唯一事情。这可以通过使用B代码中的变量来处理。随着组合数量的减少,速度大大降低。


1
Python的+列表运算符已定义为可与其他序列一起使用,因此可以替换A+=[t]A+=t,以保存字节。
乔纳森·弗雷希

1
sorted出现3次,因此您可以用Z和定义所有出现的事件Z=sorted
乔纳森·弗雷希

由于它是Python 2,因此您可以使用一个选项卡替换for循环缩进(4个空格),并保存另外六个字节。
乔纳森·弗雷希

@JonathanFrech t不是序列,所以我做不到A+=t,我使用制表符和空格保存字节,当我较早复制代码时,它一定已经交换回来了,谢谢
Felipe Nardi Batista

@JonathanFrech我误读了您对的评论A+t,。我在那没看到逗号
Felipe Nardi Batista
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.