Haskell修行のために、Paizaの「スキルチェック」問題やAizu Online Judgeの「コース」問題に取り組んでいて、またしても妙なところでハマってしまった。特定のテストケースでだけ不正解が出てしまうのだ。
コードの修正を数時間繰り返してみたがどうしてもダメ。そこで、何でもいいから不正解になってしまう手がかりが欲しい、と、Haskellで書いたコードと全く同じ解答を出力するコードをRubyで書いて提出してみた。ロジックは全く同じなので、同じテストケースで不正解が出るハズ…。
ところが! Rubyだと全テストケースで正解が出るのだ!
いったいどこに違いがあるだろう…?と考えてみると、入力データの受け取りの部分。Rubyのコードでは、キッチリと入力データの行数分読み込んでいたが、Haskellのコードでは「getContents」を使って、入力データを丸ごと入力していた。ひょっとしてそこ?
そこで、
main = do
contents <- getContents
let temp = lines contents
n = (read . head) temp --入力データの行数
arr = (map read . tail) temp --2行目からファイルの末尾まで
こんな風に書いていた箇所を、
main = do
contents <- getContents
let temp = lines contents
n = (read . head) temp
arr = (map read . take n . tail) temp --2行目からn行分
こんな風に書き直してみたところ…、これがドンピシャリ! 無事、全テストケースで正解となった。
おそらく、これは…、テストデータの末尾に余計な空白行が入っているのではないか。paiza.ioで試してみると、実行時エラーは起きずに不正解データが出力される。多分これだ。こんな落し穴があったとは…。
「ひょっとして、そこを試されているのでは!?」とも思うんだけど(笑)。