« 2006年04月 | メイン | 2006年07月 »

2006年06月26日

Brainf*ckで100までの素数を列挙してみるテスト

キミならどう書く 2.0 - ROUND 1 -

LL Ring の前哨戦として「キミならどう書く 2.0」の開催です!
お題は「100までの整数から素数を列挙せよ」です.

ということで、世界最小のコンパイラ/インタプリタと言われている
Brainf*ckで1~100までの素数を列挙してみました。

ちなみに brainf*ck で prgramming するのは今回が初めてです。

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Wikipedia日本語版の解説より

開発者Urban Müllerがコンパイラがなるべく小さくなる言語として考案した。実際、Muellerが開発したコンパイラのサイズは123バイト(キロバイトではない!)、インタプリタは98バイトしかない。また、実行可能な命令はわずか8つしかない。

処理系には十分なサイズのbyte型配列とその要素のひとつを指すポインタがある。ポインタを「>」「<」命令で移動させながら、そのポインタが指す値を増減させて処理を進めていく。 これだけでチューリングマシンで実行可能なあらゆるプログラムが記述できるとされている。

Brainf*ckの言語仕様は非常に単純で、

  1. > ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
  2. < ポインタをデクリメントする。C言語の「ptr--;」に相当。
  3. + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
  4. - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
  5. . ポインタが指す値を出力する。C言語の「putchar(*ptr);」に相当。
  6. , 1バイトを入力してポインタが指す値に代入する。C言語の「*ptr=getchar();」に相当。
  7. [ ポインタが指す値が0なら、対応する ] までジャンプする。C言語の「while(!*ptr){」に相当。
  8. ] ポインタが指す値が0でないなら、対応する [ にジャンプする。C言語の「}」に相当。

以上8命令を組み合わせてプログラミングするだけです。


ね、簡単でしょ?


素数の列挙には lookup table という超高速なアルゴリズムを採用しています。:-)

Brainf*ckではbyte型の配列つまり0~255の整数しか扱えないため、256以上の素数を真面目に計算しようとすると多倍長演算をサポートしないといけません。ふつうの中学生は素因数分解の問題を解くのに100までの素数は大体暗記してるでしょ、ということで、実は lookup table という手法は現実世界に近い解なのです。

じゃあ、100以上の素数を列挙したい場合はどうすればいいのか?という素朴な疑問に
お答えするため、ppencode ならぬ bpencode なるものをさらに作ってみました。


bpencode - Brainf*ck Prime Encode for JavaScript


bpencode - Brainf*ck Prime Encode for JavaScript

ブラウザ上で brainf*ck のプログラミングの様子を動作確認できます。

上のデモ画面では、300までの素数を表示する brainf*ck のプログラムを動的に生成しています。
ブラウザでの計算速度の限界があるため、今のところ5桁の数字99999まで対応しています。


どうぞご利用ください。


Enjoy brainf*ck programming!


謝辞:

bpencode のプログラムでは、弾さんのブログのエントリーLLR2006 - 1,000,000(番目|まで)の素数に書かれていたJavaScript版の素数列挙プログラムを組み込んでいます。

本当にありがとうございました。

2006年06月20日

ppencode欧州進出

6月15~16日に開催されたNordic Perl Workshop 2006で、
拙作のppencodeが英語のプレゼンテーションにて紹介されました。

NPW'06 lightning talk.

I registered an impromptu lightning talk slot at the last moment, and delivered an English port of Takesako's highly entertaining ppencode talk. (I ported it from the original Japanese to Chinese for OSDC.tw this April, as noted in Takesako's blog.)
Although some of the humor were inevitably lost in translation, it seems to be well received -- people were certainly laughing a lot! The PDF slides and Flash slides are available, too.

翻訳・発表はPerl6/Pugsの凰たん。相変わらず Good job です!

ppencode
(※バイオハザードやジョルジュ長岡のスライドも健在です)

早速Perl Hacks: ppencodeなど、ヨーロッパのブログで話題に取り上げていただいております。
ありがとうございます。

NPW'06 は Norway の Oslo で開催されたとのこと。よく考えたら Oslo は最速ブラウザの Opera Software ASA の本拠地ではありませんか。日本の Shibuya.pm みたいな感じだとすると、Oslo.pm の活動が活発なのもよくわかりますね。

この調子で世界5大陸を制覇するまで頑張りたいと思います!

2006年06月15日

Shibuya.js Technical Talk #2 事前登録開始

Shibuya.js 第二回目のイベント、Shibuya.js Technical Talk #2 を開催します。

開催日時:2006年 6月30日(金) 18:00開場 18:30~21:00 予定
開催場所:株式会社インターネットイニシアティブ (IIJ) 大会議室
事前登録:登録フォームで申し込んでください (先着80 + 40, 合計120名)
     40名は後日、6/17土曜日12:00 より追加募集予定です。

今回は前回の反省を踏まえて、2回に分けて参加募集を行ないます。
どうぞご参加ください。

2006年06月11日

Planet RubyKaigi を作ってみました

それPlaggerでやればいいんじゃね?」ということで、日本Rubyカンファレンス2006のオフレポをチェックするPlanet RubyKaigiを早速作ってみました。

planetRubyKaigi (Powered by Plagger)

http://takesako.31tools.com/planet/RubyKaigi/

公式サイトのトラックバックで言及されていないブログの新着エントリーを発掘するのに便利だと思います。1時間に1回(毎時33分)に新着フィードを自動的にチェックして更新しています。
Planet RubyKaigiではmixiの公開日記も検索対象にしています。

Planet RubyKaigi用の設定ファイルconfig.yaml は(空行も含めて)全部で 62行。
Publish::Planetの設定を書くよりもPlaggerそのもののインストールにかかった方が長かったのは内緒の話です。:-)

こんなに簡単にPlanetのサイトが作れるなんて、Plaggerすげー。
宮川さんをはじめとするplagger AUTHORSの方々に感謝です。

イベント自体は大盛況のうちに終了。よく準備されていたと思います。詳しいコメントはあとで書きたいと思います。
取り急ぎ、スタッフの皆さん、講演者の皆さん、スポンサー各社様、参加された皆さん、お疲れ様でした!

追記(2006.06.11):

トラックバックに失敗。公式サイトのTrackBack URLが間違って掲載されているようでした。
http://jp.rubyist.net/RubyKaigi2006/tb20060611.html/tb/tb20060611

http://jp.rubyist.net/RubyKaigi2006/index.rbx/tb/tb20060611