ループをまとめる

はじめに

 つぶやき 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 しました:

この作品では、

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)では、 評価の尺度が異なるため、このような特殊なテクニックが必要とされます。

その辺りをご理解の上、参考にして頂ければ幸いです。