*成長速度の調整2 [#eb28b514]
[[成長速度の調整]]の講では, 複数の変数を使って, ちょっぴり不規則にパターン成長をさせました. 例えば
 a(X,Y):****a(sY,ssX)
 a(,)
とすると, Xの部分に

> ,s,sss,ssss,…

つまり

> 0,1,3,4,6,7,…

というパターンが現れるというものでした. ~

----

Xの部分に「0,1,3,4,6,7,…」を作るという方針だと, 別の書き方をすることも出来ます:
 a(X,Y,Z):****a(YX,Z,Y)
 a(,s,ss)
(なおこのコードには明らかに1Bの無駄があります, 後述. )

上述の方法よりも原理は分かりやすいのではないかと思います. 
「階差」の部分が1,2の交互になるため「0,1,3,4,6,7,…」が実現されます. 
以下簡単のため,最初に挙げたa(X,Y):****a(sY,ssX)という方法を''方法A'', 
今回紹介したa(X,Y,Z):****a(YX,Z,Y)という方法を''方法B''と呼ぶことにします. 

----

方法Bと方法Aの大きな違いは, 方法Bでは''1つのパターンを成長させている''という点です. ~
逆に言えば方法Aでは「2つのパターンを育てている」ことになります. ~
つまり, XとYの2つを同時に育てているのが分かりますね. ~
そのためXとYに別の初項を与えると, 別系列のパターンを同時に育てるようなことも可能です. 例えば
 a(X,Y):XXXXa(sY,ssX)
 a(r,l)
みたいな感じですかね. また, 方法Bでは「1つのパターンを成長させる」ということから, 例えば

> [0,2][1,3][2,4]…

のような,「負の階差」を含む成長のさせ方は出来ません.

さて, ただでさえbyte数が膨らんだように見える方法Bについて, さらに追い打ちをかけるように~
「方法Aでしか出来ないこと」を紹介していきました. ~
しかし, いつでも方法Aが有利だというわけではありません. いくつか例を挙げましょう. 

まずは, 初項が複雑な場合です. 例えば

 a(X,Y):X[rslsr]X[rslsr]X[rslsr]X[rslsr]a(sY,ssX)
 a(,)
という方法Aのコードはそのまま短縮すると
 a(X,Y):XXXXa(sY,ssX)
 a(rslsr,rslsr)
と2つ同じ初項を設定する必要があります. 
この辺りは「本当は1つのパターンを育てたいのに2パターンを同時に育てている」ことの弊害なのかもしれませんね. ~
「1パターンを育てる」ことに専念すれば勿論, 初項は1つはいいので短くなる場合があります. 

次に, 階差の部分を実行でも用いる場合です. 例えば
 a(X,Y,Z):XYXa(YX,Z,Y)
 a(,sr,sl)
みたいな感じでしょうか?

次に, 「同じ関数形の階差」の場合です. 例えば
 a(X,Y,Z):Xla(YYX,Z,Y)
 a(,ss,srsl)
のような感じでしょうか. 「ssss, srslsrsl」という階差が同じYYの部分で実現できます. 

----

なお冒頭に挙げた
 a(X,Y,Z):****a(YX,Z,Y)
 a(,s,ss)
というコードも, 
 a(X,Y,Z):****a(sYX,Z,Y)
 a(,,s)
とすることで, つまり同じ関数形sYと思うことで短縮が可能です. 
 a(X,Y,Z):****a(sYYX,Z,Y)
 a(,s,sss)
とすれば, 

> 0,3,10,13,…

というような激しい成長も作れます. このくらいになると方法Aよりもだいぶ短く書けそうです. 

上記の「同じ関数形」と一口に言っても「YYXZY」のように左右にYZ複合してつけるようなことも可能ですしね. ~
もちろんそんなに複雑なものは見たことがないですが, これに近い複雑なことをやって短縮できたようなこともあります. ~
単純に「YZX」のような付け方でも意外と気付きにくかったりします. 奥が深いですね. 


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS