2019年4月7日日曜日

GCJ2019 Qualification Round

GCJ2019 Qualification Round

インタラクティブ問題にはテストツール(testing_tool.py)とその実行ツール(interactive_runner.py)がついているが、うまく動かなくて苦労した。Windows+msys2だとPythonが改行をCRLFで出力するのだが、SBCLがよしなに扱ってくれないのが問題と思われる。 さしあたり、Lisp側ですべての入力をread-lineで受け取ってCRを消すようにしたら実行できた:

(defun strip-read-line (&optional (in *standard-input*))
  (delete #\Return (read-line in)))
$ python3 interactive_runner.py python3 testing_tool.py 0 -- sbcl --script foo.lisp
Judge return code: 0
Judge standard error:
Solution return code: 0
Solution standard error:

でも、できればそんなことはしたくない。具体的には、python側の改行コードをLFにしたいのだが、testing_tool.pyを書きかえてprint("asdf", end="\n")のようにいちいち改行を指定してもCRLFになってしまうし、それどころかend="\x0a"とASCIIコードを明示しても勝手にCRが付加される。

ググったところ、同じように苦闘した人がいた。結論から言えば、testing_tool.pyの冒頭に次のコードを加えればLFだけ出力するようになるようだ。

import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, newline='\n')

次のラウンドで出たらそうする。


interactive_runner.pyがない場合はこういう方法があるらしい。ただ、msys2ではうまく動かなかった。