HaskellでEOFを受け取るまで処理を繰り返すのに苦労したのでメモ
50 以下の正の整数 n を入力し、0 ~ 9 の範囲の整数 a,b,c,d の組で
a+b+c+d=n
を満たすものの組み合わせ数を出力するプログラムを作成して下さい。
とりあえずパパっと作ったコードがこれ
combinations n = [[a,b,c,d] |a<-[0..9], b<-[0..9], c<-[0..9], d<-[0..9], a+b+c+d==n ] main = do n <- readLn print $ length $ combinations n
ところがWrong Answer
試しに手元にテスト用のファイルを作って実験すると
50行ほど入力してみるも1行分の答えしか出力しない。
それではまずい。
単にgetContensするのも面白くないので
EOFを受け取ってから停止するように書き換えてみた
import System.IO combinations n = [[a,b,c,d] |a<-[0..9], b<-[0..9], c<-[0..9], d<-[0..9], a+b+c+d==n ] main = do n <- getLine print $ length $ combinations (read n) eof <- isEOF if eof then return () else do main
EOFを受け取ったら終了
そうでなかったらgetLineを繰り返すプログラムだ。
最初はhIsEOFにして失敗したりで
完成までに丸1日かかってしまった。
参考
haskell - Why isEOF doesn't work? - Stack Overflow
System.IO モジュール(8) isEOF, hIsEOF : tnomuraのブログ
各言語の標準入出力サンプル|CodeIQ│CodeIQ