10分コーディング

たまたま目についたのでやってみた。

main = print $ cards 4 "123412341234123412"
cards n str = [ [str!!m | m<-[0..len-1], m`mod`n == i] | i<-[0..n-1] ]
                    where
                        len = length str - length str `mod` n

Haskellではfor文もwhile文もif文さえも使わないね!
内包表記がネストしてるけど外側のそれはfor文の代わりなので、そんな分かりにくくはないと思う。
何より必要条件でザクザク絞っていくという感覚はなかなか新鮮。
や、今までも必要条件で絞っていくしかなかったのだけど。ザクザク感がないよね。if文には。



まあ時間は10分どころじゃなくかかっていたりする。


どうやらHaskellの内包表記に無限リストは使わない方がいいぽい?

[n | n<-[1..], n<10]

とか書くと計算が終わらない。
まあコンパイラは10以上に10より小さいのものは無い、と知らないからしょうがないか。