1つの数値関数を用意し, それによりパーツを作るのが基本です.
数値関数の引数を調整することで, 複数種類のパーツを作ることも可能ですね.
例えば
a(X,T):XXa(sX,T-1)XX
という関数を用意した場合,
などとしてパーツが作れますね. このように, 1つの数値関数を複数の場所で使おうとするのは重要です.
このように, 再利用の基本は複数のパーツ作成での両立です.
それに加えて重要なのが, パーツを増やす際の利用です.
例えば上の数値関数ではa(-,1)とすると4倍関数が作れるので,
a(X,T):XXa(sX,T-1)XX a(a(,3)a(,9)r,1)
のように4倍に増やすことが可能になります.
しかし, この考え方だとa(,1)が綺麗なN倍関数になっていないとパーツを増やしにくいですね.
他の例も見てみましょう.
a(X,T):a(sX,T-1)XX b:a(,6)ra(r,6)b b [19B]
「たくさん直進して正方形を描き, 正方形の中央に移動する」というのを無限ループで増やしています.
これを, 一気に圧縮することができます:
a(X,T):a(sX,T-1)XX a(ra(r,6),100) [16B]
sが多量についた上で繰り返されますね. 場合によっては壁に向けて多量にsを付け加えることもありますが,
「十分多量の成長をした前提での繰り返し」を作るのは, かなり多くの数値関数でできます.
この再利用が上手く決まると, 多くの場合, 他の書き方に比べて非常に高い圧縮率を実現できます!
上手く使いこなすのはなかなか難しいですが,
数値でパーツを作り繰り返す場合には, とにかくこの再利用が出来ないか検討する癖をつけると,
だんだんと使えるようになってくるのではないでしょうか?