Problem 30
うみねこのなく頃にループ?戻った?隔週でみると話がわけわかめw死んだ人が生きてるのは不気味.おまもりひまりまで頑張ろう.
は!アニメを見てたら時間が…
print sum(x for x in xrange(1000,6 * 9**5) if x == sum([i**5 for i in map(int,str(x))]))
皆が大好き1行アンサー.
修正
ただしこれは5秒弱….codepadじゃかなりぎりぎり.たまにアウトになる.(2回中1回アウトになったw)
少し頑張れば2行になるけど少し早くなる.
lis = [i ** 5 for i in xrange(10)] print sum([x for x in xrange(1000,6 * 9**5) if x == sum([lis[int(i)] for i in str(x)])])
で,この発想をインスパイアされた(listを使うことを)元はCだったのをもう少しpythonで短く書けるように関数化したのが次のソース.
def coco(n,lis): t = 0 i = n while i: t += lis[i % 10] i /= 10 if t > n: return False if n == t: return True return False lis = [i**5 for i in xrange(10)] print sum([x for x in xrange(1000,6*9**5) if coco(x,lis)])
圧倒的に速いので,ただし,str(),int()を使うと遅い.modとdivの方がstr(),int()より速いとみた!-'0'とかにしてみようかな.int()辞めてみよう.pythonはchar型でも-'0'ができないのか…
print sum(x for x in xrange(1000,6 * 9**5) if x == sum((ord(i)-ord('0'))**5 for i in str(x)))
でもordにしただけでも大分早くなった.4秒以上から3秒弱.1行でやる分には十分だと思う.一番早いのは行じゃない奴で1秒ちょいでした.
2行の方もord()使ったけど1行の方がはやかったので,いらない子になってしまったwwww
codepadでも時間が測れる余裕が出たので,結果url
http://codepad.org/34XmRX4A 1行で8秒弱
http://codepad.org/EJaPLor7 2行で8秒ちょい
http://codepad.org/OfASdMre 3秒
圧倒的ですね!でも1行が良いなぁ.
print sum(x for x in xrange(1000,6*9**5) if x == eval('**5+'.join(str(x)+'1')[:-2]))
evalりたかったw
どうしてもw使う意味がないけどまぁなんだろう多分一番短い?