インタラクティブ問題にはテストツール(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')
次のラウンドで出たらそうする。
GCJのinteractiveですが、mkfifo使ったらテストが楽だった。
— まーす (@__math) 2019年4月7日
mkfifo input output
python testing_tool.py < output | tee input.log > input
./d < input | tee output.log > output
rm input output
interactive_runner.py
がない場合はこういう方法があるらしい。ただ、msys2ではうまく動かなかった。