GCJ Round 2に出たが、Round 1に引き続いてSBCL絡みのトラブルにあってしまった。
以下の(特に意味のない)コードをSBCL 1.3.8 ~ 1.4.5に打ち込むとコンパイルが終了しない。
(defun test (n graph)
(let ((vector (make-array n :initial-element 1)))
(setf (aref vector 0) 0)
(let ((value 1))
(dotimes (i n)
(dolist (v (list 1))
(setf (aref vector v) value)
(dolist (y (aref graph v))
(print y)))))))
1.3.7→1.3.8と、1.4.5→1.4.6の変化を眺めた感じでは、make-array
の最適化に関連して低レベルの問題が起こっていそうで、(declare (fixnum n))
や(declare (notinline make-array))
を宣言すると問題が解消する。詳細はわかっていない。
Security Updateのvisibleをとりあえず通しておこうとして起きた現象で、この対処に時間を費やしてしまった。自分の準備にも問題があって、ローカルではバージョン1.4.14を使っていたので単純に問題の把握が遅れたというのがある。(GCJの環境は1.3.14だが、Windowsリリースはないし、CodeChefの1.3.13で問題が起きたことがないので気にしていなかった。) 本格的にWSL環境に移ることを考えたほうがよいのかもしれない。
しかし、こんな基本的なコードが落ちるのはさすがに驚く……
コンテスト後にはさすがに凹んだけれど、去年よりは確実に強くなっている。来年も頑張ろう。