ちょっとしたプログラミング
[id:yarb:20091109]にちょっとしたお題があったので,頭のなかを晒してみよう.
2乗した結果に1から9までの数字が1度ずつ現れる整数をすべて挙げよ
まぁ素朴に1から100,000までの数字をチェックしよう.
sortを使うからData.ListをインポートすればOKかな.
こんな場合はリスト内包表記を使う.
Prelude> :module +Data.List Prelude Data.List> [(x,x2) | x <- [1..100000], let x2 = x ^ 2, "123456789" == sort (show x2) ] [(11826,139854276),(12363,152843769),(12543,157326849),(14676,215384976),(15681,245893761) ,(15963,254817369),(18072,326597184),(19023,361874529),(19377,375468129),(19569,382945761) ,(19629,385297641),(20316,412739856),(22887,523814769),(23019,529874361),(23178,537219684) ,(23439,549386721),(24237,587432169),(24276,589324176),(24441,597362481),(24807,615387249) ,(25059,627953481),(25572,653927184),(25941,672935481),(26409,697435281),(26733,714653289) ,(27129,735982641),(27273,743816529),(29034,842973156),(29106,847159236),(30384,923187456)]
整数に解釈できる数値リテラルはデフォルトでIntegerに解釈されるので,この場合は32bit整数のオーバーフローを考慮するひつようはない.