ぐるっとぐりっど

日曜プログラマがいろいろ試してみたことを、後の自分のためにまとめておく場所

google code jamをlispでときたい!!

今日(今夜)はgoogle code jam 1回戦、B日程の日ですね!!!!

私も職場の人に誘われて参加してます、google code jam。

予選は突破したけど、1回戦突破は無理ッスと泣き言いってますが(A日程は、A問題smallしか解けなかったのよね、解の公式の存在を忘れるっていう高校生レベルの数学でつまづいて)


そこで、せめてプログラミングの技術向上のために、カンペみながらでもいいから問題はせめて解きたいと思っています。せっかくなのでlispで!!!!

やっぱり、emacsユーザとしては、誰かが提供してくれるelispをわーい!って使うだけではダメで、lispを手中に入れなきゃだめだと思うのですよ。

というわけで、ANSI Common Lispを片手にlispが得意そうな問題を、解説見ながら解こうと思っております。(英語の解説で、オイラー路とか出てきて半泣きで効率良い解き方を解読しております。)

きっと、ブログに書くと、もっとこうすれば効率よく解けるよってスーパーリスパーが教えてくれそうな気がする。

今のところ、もちろんgoogle code jamのインプットファイルはS式じゃないので、ファイルを読んでS式に変換するところまでは作った段階で、まだまだ先は長いという感じ。
しかもほぼ途中まで読んで挫折してるANSI Common Lispからのパクリ。

頑張ってもっと精進しよう。

(defun tokens (str test start)
  (let ((p1 (position-if test str :start start)))
    (if p1
	(let ((p2 (position-if #'(lambda (c)
				   (not (funcall test c)))
			       str :start p1)))
	  (cons (read-from-string (subseq str p1 p2))
		(if p2
		    (tokens str test p2)
		  nil)))
      nil)))

(defun constituent (c)
  (and (graphic-char-p c)
       (not (char= c #\ ))))

(defun load-file nil
  (with-open-file (in "A.in.txt" :direction :input)
		  (let ((result))
		    (do ((line (read-line in nil)
			       (read-line in nil)))
			((null line) result)
			(setf result
			      (append result
				    (list (tokens line #'constituent 0))))))))

;;;とりあえず変換したS式を出力しておく
(format t "~A~%" (load-file))