ちょっとしたプログラミング

[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整数のオーバーフローを考慮するひつようはない.

Haskellらしさはあるか

Haskellでしかプログラムを書かないので,何がHaskellらしいのかということがわからなくなっているように思が,あえていうならプログラムを書いていないところがHaskellらしいところかな.上で書いたのはHaskellで書いた式であって,プログラムではない.