usakdsteen

ゆうさくですてぃーん

オンラインジャッジ・コボル・トラブル(1)

オンラインジャッジ*1COBOL*2での解答を提出した際におきたトラブル

 

テストケースの入力データの最終行の末尾に改行文字が無い場合にWA*3する。

 

 

 COBOLに詳しくないのでハッキリとした原因はわかってないのだが。

ACCEPTで入力を取ると入力行の末尾を1文字削除しているような気がする。

おそらく通常はこの削除によって改行文字を削除しているのだと思う。

しかし最終行の末尾に改行文字が無い場合に肝心の入力データの最後の文字が削除されてしまうので正しい計算が出来ず失敗しているのだと思う。

 

COBOLに詳しくないのでどうしたらいいか分からんのだが、

苦肉の解決策として

ジャッジサーバーは Linux なので /dev/stdin からファイルとして入力を取ることが可能な場合*4があるので

CALLで CBL_OPEN_FILE, CBL_READ_FILE, CBL_CLOSE_FILE を呼び出して/dev/stdinからバッファに読み込み、そこから頑張って入力データを読み取る

という感じでなんとか出来た

 

 

このトラブルに出会ったのはこれのとき

漫画版: 女子高生プログラマーの大バトル!〜コボール文明の逆襲〜|paizaオンラインハッカソン6

これのとき使ったコード

 

ACCEPTで失敗したコード

https://github.com/neetsdkasu/Paiza-POH-MySolutions/blob/master/POH6/tsubame/answer.cob

 

CALLでCBL_OPEN_FILE等を使い/dev/stdinから読み込んで成功したコード

https://github.com/neetsdkasu/Paiza-POH-MySolutions/blob/master/POH6/tsubame/After-the-event.cob

 

 

これ以外のイベントでも/dev/stdinから読み込んだことはあるっぽいけど、何でそうしたかは覚えてない

それがこのコード

https://github.com/neetsdkasu/Paiza-POH-MySolutions/blob/master/POH8/Mizugi/Main.cob

 1000bytesずつ読み込みながらデータを読み取っているっぽい

(もっと賢いやりかたありそうだけど、知らん)

*1:オンラインジャッジと呼ばれるものは色々あると思うけど、ここではプログラミングのお題が出されて解答となるソースコードを提出(サブミット)するとコンパイル&実行されてお題に対して正しいプログラムかをサーバーでジャッジしてくれるみたいなサービスのこと、例えばAtCoderCodeforcesやpaizaなど、競技プログラミング系が多い

*2:オンラインジャッジで使われるCOBOLはOpenCOBOL(GnuCOBOL)が多い

*3:Wrong Answer

*4:アクセスが許可されてない場合もありその時は無理だが