Archive for 12月, 2009

今年1年を振り返る

木曜日, 12月 31st, 2009

適当に今年の出来事を10個集めてみました。

ポケステでLispが動いた
去年の年末から今年の年始にかけてポケステ向けのLispインタプリタを作りました。

フルマラソン走った
翌日の筋肉痛が凄かったです。タイムが遅かったのが残念。

Mac Book買った
非常に使いやすいです。いい買い物をした。

自転車で琵琶湖一周
大体時速20kmをキープし続けることができました。次走るときはもう少し良い自転車で走りたい。

マンガで分かるLispがたくさん
最近停滞気味ですが、最後まで続けたいと思います。

BiwaSchemeでゲーム作った
Schemeでブラウザ向けのゲームが作れるというのは面白いですね。

院試受かった
院試が近い時期に彦根まで自転車でひこねのよいにゃんこのグッツを買いにいったりしましたが、
試験日やその前日にカツ丼やチキンカツ定食を食べたおかげか無事合格できました。

CLでJavaのアセンブラ/逆アセンブラを作った
CLでプログラムを書くのも大分慣れてきたおかげか、比較的楽に書くことができました。

cl-openglで遊んだ
こいうプログラムを書くのは楽しいですね。

今年1年振り返ってみたけど、ろくなことをやってない
特に書くことがなかったので再帰的なリンクを張っておきます。

Prologでオシオキ

火曜日, 12月 1st, 2009

メモリたくさん欲しいです(Yet Another Ranha)
を読んで、私もオシオキしてみることにしました。

画像が小さくて良く見えませんが、4人が水泳大会の順位を言っていて、
そのなかで一人だけ嘘をついているのでその人を見つけ出すみたいです。
(順位も求めるみたいですが、誰が嘘をついているか分かれば順位は自明なので、
 順位は表示したりしていません。)

私はranhaさんのように変態紳士では無いので、素直にPrologを使いました。
処理系はSWI-Prolog。

;; 二つの集合が等しいか
set_eq([], []).
set_eq([X|Xs], Y) :- member(X, Y), delete(Y, X, Z), set_eq(Xs, Z).
;; 4人が別々の順位になるか
rank(X,Y,Z,W) :- set_eq([X,Y,Z,W], [1,2,3,4]).
;; それぞれの言い分
ayu(1).
ayu(2).
suzu(1).
suzu(2).
naru(N, S) :- N < S.
kotori(1).
;; オシオキされる人
oshioki(ayu)   :- suzu(S), kotori(K), rank(_,S,N,K), naru(N, S).
oshioki(suzu)  :- ayu(A), kotori(K), rank(A,S,N,K), naru(N, S).
oshioki(naru)  :- ayu(A), suzu(S), kotori(K), rank(A,S,_,K).
oshioki(kotori):- ayu(A), suzu(S), rank(A,S,N,_), naru(N, S).

で、動かしてみたら、誰をオシオキしたらいいのかすぐに分かります。

?- oshioki(X).
X = suzu

SWI-Prologのdeleteの引数が想像と逆ですこしハマりました。
それにしてもあまりきれいじゃないですね。
もう少しうまく書けないものか。