ぷよぷよ19連鎖の問題を Clojure で

去年、迷路を最短経路で解く問題を出題していたところが、今年も採用一次試験の問題を公開しているというのでClojureで解いてみた。 問題は以下のとおり。 ゲーム「ぷよぷよ」で、フィールドの状態がテキストで与えられたとき、消える「ぷよ」を消して次のフ…

Rubyで末尾再帰最適化をする。

元ネタはPythonで末尾再帰最適化をする。 - wasabizの日記。Pythonのデコレータを使って、末尾再帰で書かれた関数に対して末尾呼び出し最適化(TCO)を行う、というものです(どうやってTCOを実現しているかの詳細についての説明はここでは割愛します)。さて、…

暗黙の引数 &env を使ってスコープを曲げてみる

昨日に引き続き、Clojureマクロの暗黙の引数&envについて。&envを通してマクロ呼び出しのフォームを囲む環境が手に入るわけで、これを利用しておもしろいことはできないだろうか。そう考えているうちに、スコープを曲げる - 主題のない日記で出てきた例を思…

マクロの暗黙の引数 &form と &env

Varの適用 Clojureでは、たとえば (#'list 1 2 3) が (list 1 2 3) と同じ結果を返す。Varに関数が束縛されている場合には、Varに束縛されている関数がそのまま適用されるようだ。では、Varにマクロが束縛されている場合にはどうなるだろう?マクロを展開し…

インライン Brainfuck をモナドっぽいなにかで

タイトルは釣り気味?なんとなくStateモナドのつもりで書いていたけど、これをモナドと呼ぶのかは謎。メインのアイディアは、Brainfuck の各命令を関数で表し、メモリやポインタといった Brainfuck の実行に必要な状態を引き渡していくというもの。つまり、…

gaucheyライブラリ

今日はShibuya.lispのHackathonがあったようです。東京には行けなかったんですが、時間中(13:00 - 17:30)は時間をとってリモートで勝手に参加させてもらってました。時間中はひたすらClojureを書いていました。gaucheyという、Gaucheにバンドルされたライブ…

(nagoya-lisp 0) やりました

第0回 nagoya-lisp をやりました。(nagoya-lisp 0) : ATND今回は、とりあえず次回から何をやるのかを決める準備の回でした。わりと話し合いがメインの回だったのにホワイトボード等ない場所での開催となったので、Google docsで議事録を共有しつつ進める形に…

nagoya-lisp やります!

名古屋を中心とした Lisp 系言語の勉強会をやろうと思います。(nagoya-lisp 0) : ATND 日時 2010/10/16 18:00〜19:30(予定) 場所 名古屋市栄の Cafe どえりゃあ 初回の予定 今後勉強会で何をやっていきたいかについての作戦会議 具体的に何をやっていくのか…

わーい、テトリス言語 Tetrlang 完成したよー\(^o^)/

これはなに? Tetrlang は、研究の中間発表を1週間後に控えた大学院生の現実逃避によって作り出された言語テトリスにインスパイアされた言語です。Tetrlang は以下のような特徴をもつ言語です。 各命令がテトリスのブロック(テトラミノ)によって表される 他…

Lisp in Small Piecesを読んだ

読み終わったのは3週間くらい前だけど、ゴールデンウィークで普段よりは時間があるので、読んだ感想など書いてみる。Lisp in Small Pieces作者: Christian Queinnec,Kathleen Callaway出版社/メーカー: Cambridge University Press発売日: 2003/12/04メディ…

麻雀の待ちを出力する問題を amb で

毎度流行りには乗り遅れる傾向にあるけど、麻雀の待ちを出力する例の問題をいまさら解いてみる。「バックトラックするだけの問題なら amb 使えば楽勝でしょ」と思って amb を使ってやってみたんだけど、思いのほかてこずった。しかも、なんだかうまく頭を切…

Gambitでクロージャをシリアライズ

できるよという話。Gambitに強力なシリアライズ機能が付いていることをyieldした途中の状態をファイルに保存とかって出来ますか - 崩壊現実-全てはvirtualに収束する-を見ていてふと思い出したので、クロージャを使って同じようなことを試してみた。 (define…

迷路を最短経路で解く問題を Clojure で

Clojure といえば、巷ではProgramming Clojureの日本語訳である「プログラミング Clojure」の献本が行われているようで、これが発売すればいよいよ日本でも本格的に Clojure が広まっていくんじゃないでしょうか。というわけで、スタートダッシュ(というかフ…

噂の「英単語を覚えるスクリプト」をClojureで

第1回 Scheme コードバトンのお知らせ - Higepon’s blogでネタとして挙がっている英単語を覚えるスクリプトをClojureで書いてみた、という話。コード自体はid:higeponさんのScheme(R6RS)版をほぼそのままClojureに移植しただけ。 ソースコード (追記:ソース…

継続とマクロでお手軽ブレークポイント

継続によるプログラムの実行の中断・再開と、LOL の pandoric macro (クロージャに捕捉されている自由変数に、クロージャの外側からアクセスするためのマクロ) を組み合わせて簡単なブレークポイントっぽいものを作ってみました。 使い方 以下のようにして使…

Gaucheでシェルスクリプト

最近、Let Over Lambda (LOL) という本を読んでます。Let Over Lambda作者: Doug Hoyte出版社/メーカー: Lulu.Com発売日: 2008/04/30メディア: ペーパーバック購入: 1人 クリック: 14回この商品を含むブログ (6件) を見るLOLは、On Lispの発展(?)としてLisp…

Gauche-FUSE試してみた

id:GemmaさんがGauche-FUSEというライブラリを作ったようなので試してみた。exampleのhello.scm, fusexmp.scmについては問題なく動いたのだけど、outputz.scmがうまく動かない。実行すると以下のようなエラーが出る(追記:勘違いでした。ちゃんと動いている…

プログラミング言語の難易度

Javaはわりと素朴な言語だ。 Rubyは簡単な英語をちょっと知っていれば分かってしまうくらい易しい。Perlもまぁだいたい同じくらいだ。 Cなんて、小学生でも、ともすれば幼稚園児でも、理解が可能だ。 C++やC#なんかは慣れない人は戸惑ってしまうかもしれない…

Scalaって末尾再帰の最適化してるの?

Scalaの勉強中。Scalaはオブジェクト指向でありながら、関数的にもプログラムを書けるという特徴を持っているとのことで、「だったら末尾再帰は最適化されるよね?」ってことでバイトコードがどうなってるのか調べてみた。 結論からいえば、d:id:mzp:2008111…

lim[n→∞]√2↑↑n=2

日曜日にCSNagoyaのSICP勉強会に参加していて、タワー記法が出てきた流れで、だ(と思う)という話をしたら、id:yoshihiro503さんとid:mzpさんから意外とよい反応をいただいた。 証明をちゃんとつけてなかったのだけど、帰り道で考えていたらわりと簡単に証明…

漢数字を整数リテラルとして使えるようにする

漢数字で九九の表を作ってください。 ただし以下の条件をつけます。条件 一.アラビア数字(0〜9)禁止。 プログラムにも出力結果にもアラビア数字を含んではいけない。(全角・半角とも) 二.結果の数字は、「七」とか「一○」(=10)とか「六四」(=64)のよう…

Scheme どう書く?的

整列済みの number のリストがある。'(1 3 4 5 6 12 13 15)このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。最初の例のリストであれば以下のようになる。'(1 (3 . 6) (12 . 13) 15)このような…

Re:Schemeはツンデレ

Schemeはツンデレより。個人的には、ツンデレっていうより「ささやかな優しさ」って感じですね。 僕が「○○作りたいなぁ」ってボソッとつぶやいたのを隣でこっそり聞いていたすきぃむちゃん。僕が席を離れてる間に机の上に○○を作るための道具一式を置いておい…

SRFI 42でFizzBuzzとフィボナッチ

SRFI 42は、下のようにいろんなデータでのループに使うことができる。 gosh> (list-ec (: x 1 10) x) (1 2 3 4 5 6 7 8 9) gosh> (list-ec (: c "ABCDE") #`"char-,c") ("char-A" "char-B" "char-C" "char-D" "char-E") gosh> (list-ec (: x '#(1 2 3) '#(4 …

Brainfuckコンパイラ

id:mzpさんがBrainfuckインタプリタを作っていたので、なんとなくBrainfuckからSchemeへのコンパイラを作ってみた。こんな感じになってます。 (define (char->symbol c) (string->symbol #`",c")) (define (inst-name->cont name k) (lambda (x) (k `((,(cha…

13日の金曜日を数え上げる

今日から20013年12月31日までの、13日の金曜日とその総数を表示してください。 どう書く?org lequeさんのを参考に改変。list-ecを使ってるのに、さらにdropやfilterを使うのはなんだかもったいない気がするので。でも結局元のコードより長くなってるってい…

オープンソースのクールなイースターエッグ10選

みたいな訳になるんですかね。10 Cool Open Source Easter Eggs | The Linuxologist 10 Cool Open Source Easter Eggs | Bringing Linux to the Masses 何がすごいって、コメント欄に書いてあった $ telnet towel.blinkenlights.nl するとターミナル上でスタ…

文字列に含まれる単語の最初の文字を大文字にする

文字列に含まれる単語について、それぞれの単語の最初の文字を大文字にしてください。たとえば、"LL future" と与えられたときは "LL Future" と出力する。"LL day and night" と与えられたときは "LL Day And Night" と出力する。 どう書く?org こんな感じ…

「こんなプログラムを書いてみよう」 in Scheme

文字列の集合{ BAB, AAB, BAA, AAA, ABA }があるとき、これらのすべてを1回ずつ含み、かつ、3文字の部分文字列としてはこれらの文字列しか含まない文字列は、BABAAABとBAAABABの2通りある。文字列の集合が{ BAB, AAB, BAA, AAA }のときは、そのような条件で…

GaucheのMOPいじり

Gaucheでは、クラス、クラス、クラスをサブクラス化することでオブジェクトシステムの振る舞いをカスタマイズすることができる。 をサブクラス化したクラスをメタクラスにもつようなクラスを定義するには、 (define-class <myclass> () () :metaclass <myclass-meta>) とすればいい</myclass-meta></myclass>…