Markov Chain in JavaScript
2011-05-03 追記: 消えていたので別 URL にて作りなおしました.
Twitter につぶやく機能もつけてみたのでお試しあれ。
オブジェクト指向な上に、GUI アプリケーションも簡単に作れてしまう。JavaScript はやっぱり楽しいですね。
実装としては、前のエントリーの Ruby のものと特に変わりません。Ruby のコードを見ながら移植してほぼ終わり。ただ、Ruby 版では「改行コードをすっ飛ばす」仕様になっていたのを、すっ飛ばさないことにしています。
前のエントリーに載せた、『口辺筋肉感覚による叙情的作品』を、Chain length を 2 として実行すると、どっちが入力でどっちが出力なのか見分けがつかなくておもしろい。さて、次のうちどれが本物でしょうか?
A
ポポ
ヌルヌルヌルモナラミ
ヌルモモヌム
ギレッチョ
ヌム
ヌルヌルモモヌムヌムモナラミ
ギレッチョ
ズルマッチョ
ヌルモモヌム
ポエ
ポエ
ヌム
ヌムヌム
ギレッチョ
ズルマッチョ
ヌルヌルモモヌムヌム
ヌルモモヌム
ヌルモモヌムモナラミ
ヌルヌルヌルモモヌムモナラミ
ギレッチョ
ヌルヌルモモヌムヌム
ポエ
ズルマッチョ
ヌルヌルモモヌムモナラミ
ヌムヌムモナラミ
ポエ
鈴木志郎康作『口辺筋肉感覚による叙情的作品』より
B
ポポ
ズルマッチョ
ヌルモモヌムモナラミ
ヌルヌルヌルヌルヌルヌルヌルヌルヌルモモヌムヌムモナラミ
ポエ
ギレッチョ
ヌルヌルモモヌムモナラミ
ヌルモモヌムモナラミ
ギレッチョ
ヌルモナラミ
ギレッチョ
ポエ
ヌルモモヌム
ズルマッチョ
ヌルモナラミ
ヌルヌルモナラミ
鈴木志郎康作『口辺筋肉感覚による叙情的作品』より
C
ポポ
ヌルヌルモモヌム
ヌルヌルモモヌムヌムヌムモナラミ
鈴木志郎康作『口辺筋肉感覚による叙情的作品』より
D
ポポ
ヌムヌムモナラミ
ヌルヌルモモヌム
ギレッチョ
ズルマッチョ
ヌルヌルモナラミ
ヌルヌルモモヌム
ズルマッチョ
ポエ
鈴木志郎康作『口辺筋肉感覚による叙情的作品』より
E
ポポ
鈴木志郎康作『口辺筋肉感覚による叙情的作品』より
JavaScript, Markov Chain, N-gram
JavaScript というと、通常は Web ブラウザ上で動作するスクリプト言語として有名ですが、実はコンソール上で動作させることもできます。それを可能にするのは、Rhino という Java で実装された JavaScript エンジンです。
インストール
Debian, Ubuntu ならインストールは超簡単。
$ sudo apt-get install rhino
以上。もちろん Java の実行環境が必要ですが、ここでは割愛。
書いてみる
メモ化されたフィボナッチ数列。strict オプションもあります。
$ vi memoize.js
#!/usr/bin/rhino -strict
var fibonacci = function (n) {
return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1);
};
var memoize = function (func, memo) {
memo = memo || {};
var _func = function(arg) {
if (typeof memo[arg] === 'undefined') {
memo[arg] = func(arg);
}
return memo[arg];
};
return _func;
};
fibonacci = memoize(fibonacci);
for (var i = 0; i < 10; i += 1) {
print(i + ': ' +fibonacci(i));
}
動かしてみる
実行権限を与えれば、通常のプログラムのように実行することができます。
$ chmod +xr memoize.js
$ ./memoize.js
0: 0
1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13
8: 21
9: 34
もっと手軽に動かしてみる
Rhino を直接起動することで、対話式インタプリタとしても使えます。Ruby でいう irb ですね。
$ rhino
Rhino 1.7 release 2 2009 05 12
js> '!onihR olleH'.split('').reverse().join('');
Hello Rhino!
何がうれしいか
- バッチ処理を JavaScript で書ける
- ユニットテストを行いやすくなる
- ちょっとしたテストにも便利
月曜は早めに出勤して、仕事用 PC の Cygwin にも入れてみたい。
JavaScript