はじめに
つぶやき Processing では、多重ループもよく使います。 これは、 Creative Coding 入門 の ところでも書いているように、 例えば全画面に何か描く場合でも使われるテクニックです。
参考: 全体的に塗る系の作り方(基礎)
もちろん、通常のプログラムであれば、保守性の面からも素直に実装するべきかと思います。 しかし、つぶやき Processing においてはコードに使用される全文字数を削減する code golf も実施しないと、ひとつのツィートに収められない事態も発生してしまいます。
そのため、ここで示すようなテクニックで、文字数圧縮を図る場合があります。
2 重ループを 1 重ループへ変換する
以下のような 2 重の for ループは、
for i in range(N):
for j in range(M):
# 何かの処理
次の 1 重の for ループと同様となります:
for t in range(N*M):
i=t/M; j=t%M
# 何かの処理
もちろん、ループが 1 回回る毎に、毎回 i の初期化処理も実行されてしまうので、 厳密には同値な処理とは言えません。 しかし、オーバーヘッドを無視すれば、実質的に同じ効果を得ることができます。
Python の場合では、2 重ループにしたときは 37 文字を必要としますが、 1 重ループで書き直した場合は 32 文字となり、5 文字少ないプログラムとなります。
実際の作品での使用例
このテクニックを利用して次の作品を つぶやき Processing しました:
Procedural Texture の応用例。#つぶやきProcessing
— Koji Saito (@KojiSaito) March 28, 2020
def setup():size(500,500);noStroke()
def draw():
for i in range(10000):
x=i%100;y=i/100
u=x*.01-.5;v=y*.01-.5
s=abs(sin(sqrt(mag(u,v)+noise(u+1,v+1,frameCount*.01))*150))
fill(90+s*100,40+s*100,30)
rect(x*5,y*5,10,10) pic.twitter.com/aI67XU3iaY
この作品では、
for i in range(10000):
x=i%100; y=i/100
としてますが、これは
for y in range(100):
for x in range(100):
と書かれた 2 重ループに他なりません。
このように、code golf のテクニックを知っていると、 圧縮されたプログラムから元のコードの意味を推測することも可能になるかと思います。
おわりに
通常のプログラミングでは、このような変換は(多分)許されません。 しかしながら、code golf (およびそれを本質的に含む つぶやき Processing)では、 評価の尺度が異なるため、このような特殊なテクニックが必要とされます。
その辺りをご理解の上、参考にして頂ければ幸いです。