2015年8月27日木曜日

今回は移植ネタ「酔っ払いの虫」

先日、親分からつぎの話題を紹介されたのですが、関連したものを色々と調べている内に、記事のアップが遅れてしまいました。

楽屋裏 - 酔っ払いの虫 (Drunk Bug) - e-Gadget - プログラム関数電卓
http://egadget.blog.fc2.com/blog-entry-445.html

以下では、この記事を「原作」と記しております。まずは、TI-83+への移植を試みました。

TI-83+版のコード

PROGRAM:DRUNK
:ClrDraw
:94/2→V:62/2→W
:While 1
:Pxl-Change(W,V)
:2*randInt(0,1)-1→S
:2*randInt(0,1)-1→T
:If V+S≧0 and V+S≦94 and W+T≧0 and W+T≦62
:Then
:V+S→V:W+T→W
:End
:End

randInt(Begin, End)は、Begin,Endの間の整数乱数を返す関数で、randInt(0,1)は、0もしくは1を返します。
2*randInt(0,1)-1 の部分で、-1, +1の整数乱数にしております。
原作ではMODを使っておりましたが、まったく同じでは芸がないので、少しひねってみました。

今回、Pxl-Change()を使って判ったのですが、不規則ながらもグラフィクスコマンドを使う所で、一部変数の値が書き換わってしまうケースがあります。CASIO BASICと同じ様な感じです。
マニュアルには「ただし、変数X,Y,T,θ,Tはグラフを描く際、更新されることがあるので、グラフ関係以外の値を代入することは避けたほうが賢明です」(ページ A-50)と明記されておりました。

原作の興味深い所としては、酔歩の「移動の等方性」を担保するため、斜め方向の移動のみを行っている所です。
斜め方向の移動は、縦、横の移動と較べると、√2倍の距離の移動になります。縦、横の移動と斜め方向の移動とでは、単位時間での移動速度が異なる事になりますが、縦、横の移動、もしくは斜め方向の移動だけならば、移動の等方性が確保されます。原作の場合、斜め方向の移動のみを行う事で、移動の等方性を確保し、更に視覚的にも面白い表現を実現しています。

直交座標系では、縦、横と斜め移動の等方性について考える事が必要になりますが、四角ではなく六角形を敷き詰めたマス目空間(Hexagonal field)では、黙っていても移動の等方性が確保されます。少し工夫をする事で、直交座標系のピクセル空間にHexagonal fieldを擬似的に表現できます。

PROGRAM:HXDRNK
:ClrDraw
:94/2→V:62/2→W
:While 1
:Pxl-Change(W,V)
:Pxl-Change(W,V+1)
:Pxl-Change(W+1,V)
:Pxl-Change(W+1,V+1)
:randInt(0,5)→D
:(iPart(D/2)-1)*2→T
:2(fPart(D/2)*2)-1→S
:If T=0
:Then
:S*2→S
:End
:If V+S≧0 and V+S≦94 and W+T≧0 and W+T≦61
:Then
:V+S→V:W+T→W
:End
:End 
 
図が必要な事もあり、詳しい内容は、いずれ折を見て述べましょうか。 
 
更に、HP Prime向けコードも。

// title : Diagonal random walk for HP Prime
// begin : 2015-08-02
// note  : 

EXPORT drunk()
BEGIN
// Clean the screen (G0)
RECT();

LOCAL i, p;
LOCAL x, y, v, w;

x := 320/2;
y := 240/2;

WHILE GETKEY() == -1 DO
  p := B→R(GETPIX_P(x, y));
  IF p<>0 THEN
    PIXON_P(x, y);
  ELSE
    PIXOFF_P(x, y);
  END;
  v := RANDINT*2-1;
  w := RANDINT*2-1;
  IF x+v>=0 AND x+v<320 AND y+w>=0 AND y+w<240 THEN
    x := x+v;
    y := y+w;
  END;

//  WAIT(0.1);

END;

//  key wait loop
REPEAT UNTIL GETKEY() == -1;
FREEZE;

END;

実行中に適当なキーを押すと、停止します。更にもう一度キーを押す事で、プログラムの終了となります。
エミュレータで動かすと「爆速」ですが、そんな時にはコメントになっている「WAIT(0.1)」を使ってみて下さい。

お次はHexagonal field版

// title : Hexagonal random walk for HP Prime
// begin : 2015-08-02
// note  : 

EXPORT hexdrunk()
BEGIN
// Clean the screen (G0)
RECT();

LOCAL i, p, d;
LOCAL x, y, v, w;

x := 320/2;
y := 240/2;

WHILE GETKEY() == -1 DO
  p := B→R(GETPIX_P(x, y));
  IF p<>0 THEN
    PIXON_P(x,   y);
    PIXON_P(x+1, y);
    PIXON_P(x,   y+1);
    PIXON_P(x+1, y+1);
  ELSE
    PIXOFF_P(x,   y);
    PIXOFF_P(x+1, y);
    PIXOFF_P(x,   y+1);
    PIXOFF_P(x+1, y+1);
  END;
  d := RANDINT(5);
  w := (IP(d/2)-1)*2;
  v := 2*(FP(d/2)*2)-1;
  If w==0 THEN
    v := 2*v;
  END;
  IF x+v>=0 AND x+v<320 AND y+w>=0 AND y+w<240 THEN
    x := x+v;
    y := y+w;
  END;

//  WAIT(0.1);

END;

//  key wait loop
REPEAT UNTIL GETKEY() == -1;
FREEZE;

END;

HP PrimeのPPL (Prime Programming Language)での注意ですが、「変数への代入には := を使うべし」です。
実は、ピクセル値の値を取得する所で「p = B→R(GETPIX_P(x, y));」とやって、かなりハマってしまいました。
これでは代入ではなく「比較」になってしまうのですが、構文上は問題がないのでそのまま実行出来てしまい、エラー発見に手こずる事になります。


小中学生の皆様はもう新学期だそうで、今更「夏休みの自由研究」でもないのですが、来年の自由研究のネタに使えるかも知れません (鬼が笑うとりますがな)。

9 件のコメント:

Sentaro さんのコメント...

akatuki様、こんにちは!

CasioBasicコンパイラプロジェクトのあれやこれやで出遅れました(^^;
まだまだコンパイラが形になるのはずっと先のことになりそうですが、とりあえずはインタプリタからということで、今のところ式評価関数の作業中ですが「演算保留」のあたりでちょっとハマってしまってます(^^;

この酔っ払いの虫プログラムはHP Prime実機で動かすとPCエミュよりは遅いとはいえ爆速ですね。
ウエイトを入れたらCasioBasicの感じに近くなります。
CのアドインだとPrime並みに速くなりますが、CasioBasicコンパイラでお手軽にそこのあたりの速度を狙いたいところです(^^)


>HP PrimeのPPL (Prime Programming Language)での注意ですが、「変数への代入には := を使うべし」です。

これはCasioBasicでも
BASIC感覚で
A=B+C
という記述しても何もエラーが出ないので同じ罠に陥ります(^^;

代入文は電卓系言語では左辺か右辺の→がスタンダードな感じですけど、
PrimeやNspireは従来互換で(→、 := )両方の記述が使えるので、
:= を使う方が間違いがないですね。

akatuki さんのコメント...

Sentaro 様、草木も眠る丑三つ時に、こんばんは ! 遅うなりました。

> CasioBasicコンパイラプロジェクトのあれやこれやで出遅れました(^^;

お疲れ様です !!
やす親分より色々と話を伺っており、また、親分のblogコメント欄も見まして、大分凄い事を進めて居られる様で、何よりです !

> まだまだコンパイラが形になるのはずっと先のことになりそうですが、とりあえずはインタプリタからということで、今のところ式評価関数の作業中ですが「演算保留」のあたりでちょっとハマってしまってます(^^;

ウーム。結構面倒ですよね、式の評価。ここは最初の「大峠」です。
「鞍上、枕上、厠上」と言って、気を抜いた時にブレークスルーが生じる事もあります。大きく構えてゆったり行きましょう !

> この酔っ払いの虫プログラムはHP Prime実機で動かすとPCエミュよりは遅いとはいえ爆速ですね。

結構、いい速度を出していますね、HP Prime。ただ、親分の原作コードが「軽量」だから、という事もありますが。

> ウエイトを入れたらCasioBasicの感じに近くなります。

CASIO BASICインタプリタだと、チョット遅い ?
これは、他社に先行したハードウェアとの兼ね合いもあるのかなぁ ?

> CのアドインだとPrime並みに速くなりますが、CasioBasicコンパイラでお手軽にそこのあたりの速度を狙いたいところです(^^)

いいですね !
いや、そこを目指してこその「コンパイラ」でした。インタプリタBASICで動作を確認し、コンパイルする事で実行速度が大幅に増す、これは期待が高まります !

> これはCasioBasicでも
> BASIC感覚で
> A=B+C
> という記述しても何もエラーが出ないので同じ罠に陥ります(^^;

あれ、そうなんですネ。

> 代入文は電卓系言語では左辺か右辺の→がスタンダードな感じですけど、
> PrimeやNspireは従来互換で(→、 := )両方の記述が使えるので、
> := を使う方が間違いがないですね。

「→」は従来の互換性を担保するためで、「:=」はソーステキストハンドリング、特にPCでのソース作成を意識しての導入、という感触ですネ。
ただ、こうした機能付加が積み重なると、言語そのものが面倒な事になって来てしまうのが悩みの種 ... 。

当方は野次馬の様な事しか出来ませんが、コンパイラ作成の作業が進められているというのをCASIOの開発者も見ているかも知れません。すると、今後の製品開発にも少なからず影響がある筈なので、どしどし進められ度思う所です !

やす (Krtyski) さんのコメント...

akatuki様
sentaro様

大幅に出遅れておりました。
移動中にスマホで見たら、なんと面白いことになっていますね。

スマホだとロボットではありません認証で絵を選ぶことになると、画面がおかしくなって認証できず、何度か繰り返しています。これがアップされたら、絵おを選ばないでOKになったということで...

アップできない可能性があるので、この程度のご挨拶のみということで...

akatuki さんのコメント...

やす (Krtyski) 様, 遅うなりました。

> 大幅に出遅れておりました。

いえいえ、こちらも出遅れておりますので、ご安心(?)を。

> 移動中にスマホで見たら、なんと面白いことになっていますね。

BASIC周りの話は、本来ならば親分のblogで進める所なのですが、
ちょっと寄り道、です。一応、TI-83+絡みなので。

> スマホだとロボットではありません認証で絵を選ぶことになると、画面がおかしくなって認証できず、何度か繰り返しています。これがアップされたら、絵おを選ばないでOKになったということで...
> アップできない可能性があるので、この程度のご挨拶のみということで...

お疲れ様です。
無事にポストされております。

スマホ、タブレットも、もう少し使い勝手が良くなって貰いたい所です。

やす (Krtyski) さんのコメント...

akatuki様

今回のネタ、きちんとひねりが効いていて、さすがです。


ここのところ、当方のブログすら記事をアップできない状況が続いています。
ネタはあるのですが、なかなかまとめる時間もなく、興味の向くまま探索をやっているような状況です。

Casio Basicグラフィックスコマンドは、あっちとこっちが関係していたりしていて、まとめる前に新しい発見があると、「まとめ」は先へ延びてしまいます。

akatuki さんのコメント...

やす (Krtyski) 様、最近はネタが枯渇しております零細blogにお越し戴き多謝です。

> 今回のネタ、きちんとひねりが効いていて、さすがです。

恐れ入ります。

> ここのところ、当方のブログすら記事をアップできない状況が続いています。
> ネタはあるのですが、なかなかまとめる時間もなく、興味の向くまま探索をやっているような状況です。

当方、些事が続いておりまして、なかなか記事が上げられないのですが、近々、雑感などをポストするつもりで。
雑感であり、少しばかり憤懣やる方ない内容ですから、期待せぬ様。

> Casio Basicグラフィックスコマンドは、あっちとこっちが関係していたりしていて、まとめる前に新しい発見があると、「まとめ」は先へ延びてしまいます。

お疲れ様です。
タモリは「は目下に使う言葉」と申しておりましたが、他に何て言うたらいいのか良く判りませんで、申し訳ない。

ウーム、これはこれで奥が深い。
映画「舟を編む」でしたか、辞書の編纂を行う人々の映画がありました。一応、辞書は出版に漕ぎ着けるのですが、その後も地道に改訂作業が進められていく、という。
ある程度の「土台」が出来ましたら、それを改訂していくという方針で進めれば、大分気楽に進められる様にも思われます。
電卓関係ではないのですが、当方もちょっとした文書を作成しようともがき、メモ書きを進めており。しかし、なかなか文書にまとまらないで居るのですが、網羅的にやろうとしても、分量が大き過ぎるし、という具合でして。
そこで「それなりに手広くやる」事にして、全ての物件を網羅的に扱うのはヤメテしまう方針を考えました。すると、大分気楽に構えて居られるのです。

何だか、良う判らん事になってしまいました。軽く聞き流して戴き度。
先ずはリラックスです、そうでないと、力が出ません。気乗りした所で力を傾ければいいのですから。

やす (Krtyski) さんのコメント...

akatuki様

お疲れ様、が目下へ使う言葉とは、私はそんな感覚ありませんでした。目上にはご苦労様の代わりにお疲れ様を使っていました。調べて見ると、下から上へそのような意味の言葉を書ける習慣の無いのが、日本の文化だから致し方ない、という論を見ました。なんだか私にはしっくりきます。なので、時代は変わったから「お疲れ様」はもうOKだと思いたいところです。

辞書の編纂の映画は、昔カミさんと一緒に見に行った記憶があります。新聞屋が配っていたタダ券だったよーな...


>そこで「それなりに手広くやる」事にして、全ての物件を網羅的に扱うのはヤメテしまう方針を考えました。すると、大分気楽に構えて居られるのです。

大いに励まされ、少し気が楽になりました。ありがとうございます。

akatuki さんのコメント...

やす (Krtyski) 様、遅れてしまいまして申し訳ない。
ヤボ用で、心をなくしております。御容赦 !

> お疲れ様、が目下へ使う言葉とは、私はそんな感覚ありませんでした。目上にはご苦労様の代わりにお疲れ様を使っていました。

いえね、コレ、当方もその様に教わって居りまして。タモソがあんな事を言うとる、てんで。

> 調べて見ると、下から上へそのような意味の言葉を書ける習慣の無いのが、日本の文化だから致し方ない、という論を見ました。なんだか私にはしっくりきます。

ウーム。ちょっと興味深いものです。

> なので、時代は変わったから「お疲れ様」はもうOKだと思いたいところです。

仰る通りです !

> 辞書の編纂の映画は、昔カミさんと一緒に見に行った記憶があります。新聞屋が配っていたタダ券だったよーな...

当方もTVで掛かったのを見たくらいですから ... 。

> 大いに励まされ、少し気が楽になりました。ありがとうございます。

いえいえ、こちらこそコメント、痛み入ります。

所用でゴタゴタしておりまして、ポストの予告もママならぬ有様ですが、そこは長い目で ... 。

akatuki さんのコメント...

(ぼやき; 今度はドーナツの絵を選べ、だって ... 久しくlogin していないので、こんな事になってしまう)