訃報: ゴルフ場

都内有数のゴルフ場が亡くなってしまいました。遺憾です。帰ったらすぐ修復する予定です…古い問題は一応置いてあります。

http://golf.shinh.org/

そんな中、嬉しいおしらせもあります。当ゴルフ場から世界チャンピオンが誕生しました!!

http://d.hatena.ne.jp/KeisukeNakano/20070626/1182879045

sed で Quine

あなごるのデッドラインまでに書けたので嬉しかったのでした。

s/^/s_S^_SD_S;h;s!_[S]!_S!g;H;x;s!.s_S^.D!!;H;x;s@D.*[@].s@s@/;h;s!_[S]!/!g;H;x;s!.s/^.D!!;H;x;s@D.*[@].s@s@

最初の s/// の中に書けない / を _S としておいて後から頑張って復元するんだけど、全ての _S を / にしちゃうと、今度はエスケープのままになってるべき部分とかも / になっちゃってムキーなのでホールドバッファを使ったり。あとはバックスラッシュを使うとそれもエスケープしにゃならんくなって長くなるのでそれを意地でも回避する。

あと最後の

s@D.*[@].s@s@

って正規表現中にセパレータ含めるってのはすごいと思いました。 Perl にも Ruby にもできない芸当でござる。なんかどっちかっていうとそれはバグじゃないかとか思ってしまうけど。 GNU awk もできるみたいだ。

i@colinux ~> echo / | awk '/[/]/ {print}'
/

mawk はだめみたいだ。

i@colinux ~> echo / | mawk '/[/]/ {print}'
mawk: line 1: regular expression compile failed (bad class -- [], [^] or [)
[
mawk: line 1: syntax error at or near ]

Polyglot Quine 続き

前書いた Polyglot Quine なんですが、 Brainfuck 埋める時に Hello に日和った のはいかんよなー、とか思ったので Brainfuck を混ぜてみた。

Brainfuck & Perl & Ruby & Python & C++ (& PHP) で動く Polyglot Quine です。

http://shinh.skr.jp/dat_dir/poly_quine5.txt

なんかサイズが40倍とかに膨れあがってしまったんだけど、まぁこれでも頑張ったんだというか最初のバージョンは 80kB とかあって、 公式サイトにある BFI.c とかではメモリサイズの都合で動かないにゃーとか思ってたのを頑張って縮めてこんなもん。 32768Byte のメモリを割とギリギリ全部使うはず。まぁまだいくらでも縮められるだろうけど。

あとは Befunge は zfunge なら余裕で混じるだろうけど。自明すぎてやる気起きないよな。

プログラミング言語 Whirl

なんかあなごるスレとかがあることに気付いて、そこで Whirlという言語があるらしい ということを知ったのでした。

http://www.bigzaphod.org/whirl/

なんか esoteric language って星の数くらいあるしインストラクションが二つしかなくて 01 だけ、とか書いてあるけど、普通に Whitespace みたいに適当に何文字かで一命令とかになってるだけじゃないのかなぁ、とか思ってたんだけど、これがなかなか面白い。特にサイトの説明が。

最初のごく一部を訳。

Whirl は以下のような最新技術を念頭に置いてデザインされた言語である:

  • 継承
  • シンプルさ
  • 簡易性
  • XML
  • メンテナンス性
  • 多態
  • 柔軟性
  • 強力さ
  • 引き算
  • グリルドチキン

──残念ながら、どれも最終成果には取り入れられなかった。

まぁこういうナメたノリはいいですね。上記の一覧で極めて強い意味を持っているのは実は「引き算」で、 Whirl は足し算もかけ算も割り算もあるのに引き算は無いという。そしてそのせいで相当にコードが書きにくくなるっていう性質なので、ちょっとコードを書いてみるとなんで「引き算」が最新技術に混じって特筆されてたかがわかって面白かったです。

プログラムは二つのリングコマンド(聖剣2とかD&Dを思い出すんだけど、まさにそんな感じ)を操作する。リングコマンドはそれぞれ12個の命令があって、それをくるくる回してプログラムが進んでいくっていうしくみ。

たぶん論より証拠で実際に動きを見た方がいいです。以下になんかかっこいいフラッシュの処理系があるのでそれを使うといいです。

http://www.bigzaphod.org/whirl/Whirl-1.01.swf

コードは公式サイトに載ってる 1+1 を計算する(Whirlは数値リテラルが無いので2を作るためにも計算が必要)プログラムとかでいいんじゃないかと。

0001100000111100001000001001100000111100

たしかこのコードは微妙にムダがあるけど、なんにせよただ 2 を表示するだけのプログラムでも 30Byte 以上は必要なのでなかなかおそろしい言語だと思う。

Perl / Ruby / Python / C++ / Brainfuck / Befunge あたりで Hello

えーとなんか手元に言語処理系があるんだけど何ていう言語の処理系だったかわからない…ということが時々あるかと思います。そんな時は以下のファイルを喰わせてみれば一目瞭然です。

http://shinh.skr.jp/dat_dir/poly_hello.txt

i@colinux ~/wrk/ag> perl poly_hello.txt
Hello, Perl world!
i@colinux ~/wrk/ag> ruby poly_hello.txt
Hello, Ruby world!
i@colinux ~/wrk/ag> python poly_hello.txt
Hello, Python world!
i@colinux ~/wrk/ag> gcc -xc poly_hello.txt && ./a.out
Hello, C++ world!
i@colinux ~/wrk/ag> ./befunge.rb poly_hello.txt
Hello, Befunge world!
i@colinux ~/wrk/ag> ./BFI poly_hello.txt
Hello, Brainfuck world!

なんか昨日のヤツを仕組みをわかりやすくする目的でこういうのを作ってたんですが忘れさられていたので。 Whitespace とか Whirl とかは余裕で足せるけど見苦しくなるので加えてません。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h