Code is beautiful

2010-05-16

食物連鎖シミュレーション

シミュレーション系は見てて飽きないので挑戦。

コーディング面で悩むというよりはルール作りに苦戦して上手くループしてくれず絶滅・・・的な感じ。

処理速度も遅いので個体数増やしてみようにも厳しい状態。

何とかならないモンかしら。

http://gimite.net/rails/iframe_gadget

ルール
・肉食動物は、草食動物を捕食する。
・草食動物は、植物を捕食する。
・植物は、捕食されると消滅する。
・肉食動物と草食動物は、時間と共にライフが減少する。
・肉食動物は、ライフが0になると植物の種子となる。
・草食動物は、ライフが0、または捕食されると植物の種子となる。
・植物の種子は、一定時間後、植物となる。
・肉食動物と草食動物は、残りライフが少なくなると空腹になる。
・肉食動物は、ランダムに動き回るが、空腹時は視界に入った草食動物へ向かう。
・草食動物は、ランダムに動き回るが、肉食動物が視界に入ると逃げる。しかし、空腹時は視界に入った植物へ向かう。
・肉食動物と草食動物は、空腹時は移動速度が速くなる。しかし、その分ライフも消耗する。また、その時視界に捕食対象がいない時は、ランダムに動き回り対象を探す。
・肉食動物と草食動物は、捕食後、一定時間再捕食しない。
・肉食動物と草食動物は、一定数捕食を行うと、交尾を行い繁殖する。

視線
・白線は、捕食対象への視線を表す。
・桃線は、交尾対象への視線を表す。
・点線は、草食動物が肉食動物から逃げているのを表す。

2010-03-24

円周率はロマン

いつだったか、円周率を手で計算できないものかと思ってたものの、そんな事忘れて大人になってしまった訳で。

最近になって何となく内部的な計算方法が気になり出して、調べてみたら面白くなっちゃって書いてみた。


http://gimite.net/rails/iframe_gadget


そもそもバカデカい桁の計算をさせるには多倍長演算とかいう、長い配列を使って計算させないといけない。

今回は情報が多かったのもあり、万進法を使用。

Ex)

123456789 + 123456789

なら、

Array[2] = 6789 + 6789
Array[1] = 2345 + 2345 + 1  // 桁上がり分
Array[0] = 1 + 1

みたいな。


配列1つに4桁ずつ埋めるので、円周率なら、

求める小数点以下の桁数 / 4 + 1(小数点以上) + 余裕分

が必要。余裕分は桁上がりなど誤差を考えて。


円周率の公式(マチンの公式)は

π/4 = 4arctan(1/5) - arctan(1/239)

証明等は他者様にお任せして・・・、これをテイラー展開すると、等比級数の形にできるので、ループを回して計算できる様になる。


正直、頭が硬くなってしまったからかlogの使い方なんて忘れてるが、ループを何回回せばいいのか問題は、logを使えば分かる。

分母がデカい程収束が速いので、そういう公式を選んだ方が基本的に速い(色々試した結果、自分の環境だとストーマーの式が速かった)。


また、forループなりで回した方が速いが、15秒制限に引っかかってデカい桁計算できないので、エンターフレームで回している。

stage.frameRate = 1000 とかやっているんだけど、ブラウザによって速度が違う。

恐らく、

フレームレートの最大値について話すと、Internet Explorerの最大値は100 flame/sec です。なぜならWindowsのタイマーの最小値が10ミリ秒だからです(1秒(1000ミリ秒)÷10ミリ秒=100 flame/sec)。FireFoxはどうでしょうか?FireFoxは特別なタイマーを持たず、プラグインによってタイマーの最小値が決まっていません。これは思うに、プラグインCPU timeをとりすぎることに対し、ユーザーが不満を漏らしていたためでしょう。

trick7 - Flash Playerのフレームレート
http://www.trick7.com/blog/2006/05/09-101745.php

という事っぽい?

まぁ速度を求めるならフーリエ変換とか使って計算するらしいし、そもそもActionScript(ry


それでも、計算できる部分を先に計算しておけば、まだ速度アップできそう。

2010-03-02 今更ながら、wonderfl

今更ながら、wonderfl

何となく気にはなってたものの、特に主張できる程のコードが書ける訳でもなくROM専だったけど、これまた何となくゲームっぽい物を作ってしまったし、折角なので上げてみる事にした。

恥は掻き捨て。

慣れてないので勝手が分からない感じだったけども、コード書いてると同時にコンパイルされて、何か気持ちいい。


ブログ貼り付けは、iframe → Google Gadgetコンバータを使用させて頂きました。


・wonderfl (http://wonderfl.net/)

2009-11-12

ActionScript3.0にて、appendTextで追加か、textプロパティで総書き換えか。

Stringsに長い文字列が入ってるとして、TextFieldにn文字ずつ表示したい時、

// n文字ずつ追加
TextField.appendText(Strings.substr(TextField.text.length, n));

// 総書き換え
TextField.text = Strings.substr(0, TextField.text.length + n);

appendTextの方が良さげなんだけど、負荷率を見る限りあんま変わってる気がしないのでどうしたモンかなと。

てな訳で10万文字、n=100くらいで試した所、後半になるにつれ負荷率が上がってくのは一緒なんだけど、若干appendTextの方が速くて負荷率も少ないかなと。