http://projecteuler.net/index.php?section=problems&id=301
6時前に目が覚めて問題文を見る。長い。読もうとするが、眠くてなかなか進まない。問題文を読み終えて、特になにも思いつかないので、もっとも原始的にコーディングしてみる。
def X(stones): if stones == (0, 0, 0): return False def gen(ss): for k in range(3): for p in xrange(ss[k]): yield ss[:k] + (p,) + ss[k+1:] return any(not X(ss) for ss in gen(stones)) N = 5 print sum(X((n, n * 2, n * 3)) for n in xrange(1, N + 1))
これで11秒。
やっぱり、このパターンだったか。最後は範囲がヒントになる。
フォーラムを見たが、みんな元々知っている問題だったんだね。自分と同じやり方の人はいなさそう。答えは一瞬で出る。
星になりました。いまのところ26人らしい。今まではLegendだったけど、Veteransに。語感としては格下げのような気が。もう順番はつかないらしい。一丁上がりってことか。
フォーラムに驚愕の解法が書かれていた。しかし、数学的に簡単に確かめられた。よく考えたら、ほかの部分も数学的にクリアになった。