AtCoder Beginner Contest 062

テストケース実行マクロを導入して、テストも書きやすくなったのはよかった。
でも、A問題の提出のときに、なんども関数呼出をしないコードを提出してしまい、時間をロスしてしまった。
結局、C問題は解けなかったので、過去問を解いてなれていくしかないかな。

テストケース実行マクロについて

いちいち標準入力に入力するのはもったいないので、 動作確認用のユーティリティを定義した。前の defsolver とあわせて使う。

(defsolver solution-a (n)
  (dotimes (i n)
    (format t "~a~%" (1+ (read)))))

(run-testcases
 solution-a
 ((3 1 2 3) . (2 3 4))
 ((2 4 5) . (5 6)))

問題ページから例をコピペして、リストに整形してあげればよくなったので、楽になったと思う。

(defun %run-test (solver input)
  (with-output-to-string (*standard-output*)
    (with-input-from-string (*standard-input* input)
      (funcall solver))))

(defun run-test (solver input expected)
  (let* ((actual (%run-test solver input))
    (samep (equal actual expected)))
    (format t "~:[FAILS~;pass~]~%" samep)
    samep))

(defmacro run-testcases (solver &rest cases)
  `(progn
     ,@(mapcar
    #'(lambda (c)
        `(run-test
          #',solver
          ,(format nil "~{~a~%~}" (car c))
          ,(format nil "~{~a~%~}" (cdr c))))
    cases)))

意識はしていなかったけれど、つくり終えてみれば、 実践Common Lisp のテストフレームワークのような出来になった。 http://www.gigamonkeys.com/book/practical-building-a-unit-test-framework.html

記事をかいてておもったことは、testng の data provider みたいに

(bind-testcases solultion-a
  ...)

(run-testcases solution-a)

とできると、かっこいいかも。

AtCoder Beginner Contest 061

C問題に時間をかけて、B問題 (https://abc061.contest.atcoder.jp/submissions/1283256) しか解けなかった。素直にA問題から順番に解いていくべきだった。

  • HyperSpec を参照する回数が多かったので、その時間ももったいなかった。
  • slime のミニバッファに出る関数のシグネチャをみて、使い方がわかる程度には慣れておこう。
  • 標準入力の部分は似たようなコードパターンがなので、こんなマクロを用意してもいいかもしれない。
(defmacro defsolver (name vars &body body)
  `(defun ,name ()
     (let (,@(mapcar #'list
            vars
            (mapcar (constantly '(read))
                vars)))
       ,@body)))

次回は、今週末 http://abc062.contest.atcoder.jp/ で。

AtCoder Grand Contest 014

agc014.contest.atcoder.jp

ひさしぶりに競技プログラミングの問題を解いてみた。
AtCoderにはSBCLがつかえるので、Common Lisp で解くことにしてみる。
ただ、C以降は手がでそうにでないので、A と B のみ。

Cookie Exchange

気になったこととしては、
各テストケースの実行時間とメモリ消費量は、ほぼ差がない。
しかし、はじめ2つの解答のとき、 in1.txt のケース実行時のみ数値がはねあがっている。
ただ、ash にかえた解答のときは、そうではない。
sbcl の起動に時間がかかってるのだろうか。 sbcl --script Main.lisp のように実行しているらしいが。

Unplanned Queries

私にとってこのコンテンストは難易度は高めだったので、次はBeginnersに参加してみよう。