Cogito Ergo Sum.

我思う故に我あり

ハマった~(涙) 2

 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で試してみると、実行時エラーは起きずに不正解データが出力される。多分これだ。こんな落し穴があったとは…。

 「ひょっとして、そこを試されているのでは!?」とも思うんだけど(笑)。