どう書く?org

今更ながら、どう書く?orgのアカウントを登録してきました。ラングトンの蟻のコードが割と綺麗にまとまったので、投稿したくなったんです(笑)。

で、さっそく投稿したのが次の2つ。

ラングトンの蟻 #9398
!東=0
!南=1
!西=2
!北=3

線スタイルは`透明`
必要な 間、蟻を進めて0.01秒待つ

■ブロック
 ・{整数}W{=5}
 ・{整数}H{=5}
 ・色取得(X,Yの)〜
  X*W,Y*Wを点取得
 ・プロット(X,YにCOLを)〜
  塗り色はCOL
  X*W,Y*Hから(X+1)*W,(Y+1)*Hへ四角

■蟻 +ブロック
 ・{整数}向き{=2}
 ・{整数}X{=40}
 ・{整数}Y{=40}
 ・進む〜
  COLとは整数=X,Yの色取得
  向き=(向き-2*(COL==白色)+5)%4
  X,Yに(COLの反転色)をプロット
  X=X-(向き==西)+(向き==東)
  Y=Y-(向き==南)+(向き==北)

●反転色(COLの)
 白色-COLを戻す
ラングトンの蟻 #9399
!ブロック幅 =3
!ブロック高さ=3
!世界幅 =150
!世界高さ=120

!東=0
!南=1
!西=2
!北=3

!色数 =4
!基準色=黒色
!STEPBY=500

ルールは『RLLR』
ルールの色配列は「{基準色},{赤色},{青色},{緑色}」を`,`で区切ったもの

母艦について
 クライアントW=ブロックのW*世界幅
 クライアントH=ブロックのH*世界高
 スタイルは`枠固定`
 基準色で画面クリア

STEPとは整数

線スタイルは`透明`
必要な 間
 蟻を進める。
 もしSTEP%STEPBYが0ならば
  0.01秒待つ
  母艦は「step: {STEP}」
 STEPに1を直接足す

■ルール
 ・{配列}ルール配列
 ・テキスト ←ルール設定 デフォルト
 ・ルール設定(V)〜
  Vを文字列分解して反復
   ルール配列[回数-1]=2*(対象==`R`)-1 # Rなら1、それ以外は-1
 ・{非公開}色配列

■ブロック
 ・{非公開}W{=3}
 ・{非公開}H{=3}
 ・色取得(X,Yの)〜
  X*W,Y*Wを点取得
 ・プロット(X,YにCOLを)〜
  塗り色はCOL
  X*W,Y*Hから(X+1)*W,(Y+1)*Hへ四角

■蟻 +ブロック
 ・{整数}向き{=0}
 ・{整数}X{=75}
 ・{整数}Y{=50}
 ・進む〜
  COLとは整数=X,Yの色取得
  COLで向きを方向転換する
  COLを色循環する
  X,YにCOLをプロット
  Xに(向き==東)-(向き==西)を世界幅でMOD加算
  Yに(向き==南)-(向き==北)を世界高でMOD加算

●方向転換する({整数}COLで{参照渡し}DIRを)
 Iとは整数=ルールの色配列でCOLを配列検索
 もしIが(-1)ならばI=0
 DIRに(ルールのルール配列[I])を4でMOD加算する

●色循環する({参照渡し}COLを)
 COLORSとは配列=ルールの色配列
 Iとは整数=COLORSでCOLを配列検索
 COL=COLORS[(I+1)%色数]

# Z/CZ上でAにBを直接足す
●MOD加算({参照渡し}Aに{整数}Bを{整数}Cで)
 A=(A+B+C)%C

2つ目はともかく、1つ目はなかなかスッキリしていて見通しの良いコードではないでしょうか?「もし」文を使うのが嫌で論理計算使ってますがf(^^; 1つ目が30行、発展版の2つ目が75行です。

バイナリクロックとかまだ未投稿みたいだし、地味に着々と投稿を増やしていきたいと思います。

なでしこ + JavaScript

ブラウザ(部品)との連携強化。やっぱりそれをするにはJavaScriptが不可欠。で、初心者掲示板でJavaScriptとなでしこの連携についての質問が上がっていたので、回答してきた。

常套手段はやはりHTMLファイルを生成してそれをブラウザに読み込ませるというもの。文字列処理だけならばなでしこは十分強いし、割とこれでこなせる可能性が高い。

問題は、外部Webページで連携したいときだ。色々やりたいページがWeb上にあると、単にソースをローカルに持ってきていじくっただけではうまくいかない可能性が非常に高い。(参照している画像・JavaScript・CSSなどのリソースもWeb上にあるから)

で、なでしこ側からJavaScriptを手軽に扱えると非常に強力な武器になる。それをごく単純かつ簡単に実現したのがこれ。

■ブラウザ +ブラウザ
 ・JS実行(JSを)〜
  URLは`javascript:`&(JSの改行を空に置き換え)

だが、これでは根本的な問題がいくつか解決していない。

  1. JavaScript」の実行が終わるのを「なでしこ」側が待ってくれない
  2. 改行を空に置き換えてから実行しているため、通常ならJavaScriptのコードでも実行できない可能性がある(きちんと文法的にvalidなJavaScriptを書けば何ら問題はない)
  3. JavaScript」側の変数と「なでしこ」側の変数のやり取りが不便

そこでまぁJavaScriptと連携できるようなライブラリを作ろうと思った。jsConnector.nakoプロジェクト(仮)。一応現時点でできているものを倉庫に置いておきました。

で、まず肩慣らしに、3「変数のやり取りができる仕組み」を、クリップボード経由で作ってみることにした。が、1の問題をクリアしていないため時々データのやり取りに失敗する。かなり考えてみたけれど、これを解決する画期的な案がなかなか出てこない。せいぜいクリップボードを乗っ取って監視するぐらいだけど、それじゃぁウェイトを置いている今と大して変わらないし、不安定すぎる。

JavaScript側の実行が重くならないように最初からほとんどのコードをJavaScript側に回しておけばいいのだけど、それだとあまり意味がない。できるだけ多くのことをなでしこ側から実現できるようにしたいというのが本来の目的。

さて、ここからどうするかな・・・。「JS実行完了した時」みたいなイベントを作ることができればいいのだけれど、そもそも実行完了をどう判断するかというね。悩ましい。