シカクいアタマをマルくする問題 その1

清水川さんのブログに書いてあったこの問題をPythonで解いてみました。

回文数

"121" や "3333" のように右から読んでも左から読んでも同じ並びになる数値を回文数とよぶことにします。この回文数について以下の問いに答えなさい。

問い1

5を掛けると回文数となる、3桁の数値のうち最大の数値を答えなさい。

できた。

>>> [x for x in range(100,1000) if `x*5` == `x*5`[::-1]]
[101, 103, 105, 107, 109, 111, 113, 115, 117, 119]

後から確認したら,清水川さんのコメント欄に書いてあるのと,ほぼ一緒でした。でも,コメント欄をさらに読み進めていくと,次のようにした方が速いと書かれています。

>>> (x for x in xrange(999,99,-1) if `x*5` == `x*5`[::-1]).next()
119

たしかに今回は3桁だからいいけど,もっと大きな桁数になった場合は,いちいちリストを生成せずにジェネレータ式を使った方が効率がいいですね。ジェネレータオブジェクトは,遅延評価なので値が必要になった時にしか生成されません。

勉強になるなぁ。ぼくのアタマも少しだけマルくなりました。



Leave a comment


:

:

:

:

このエントリーのはてなブックマーク (-)