for文一重化

for文一重化とは二重以上の入れ子になっているfor文を一重にまとめることをいいます。
単純に考えるとfor(;;)が消えるので7バイト縮まるのですが上手くいく場合とそうでない場合があります。
ここでは二重のfor文を一重化することを考えます。

基本的な一重化の方法

for文一重化は次のようにするのが基本となります。
for(a;b;c)for(d;e;f)g;
for(a;e?g,f:(c,d,b););
これでは1バイトも縮んでいませんが、cとd、fとgのいずれかが無い場合はコンマの分だけ短くなります。
(bは終了条件なので常に存在しています。)
ということはfor文が二重の段階でc,d,f,gの部分に処理が入らないように工夫すると一重化で短くなりやすいです。

ここではfが常に真であることを仮定します。
たいていの場合、工夫してfを真にすることはそんなに難しくありません。

問題なのは実行順序が変わっているという点です。プログラムの流れを見てみましょう。
a->b->d->       e->g->f->e->c->   b->d-> e->g->... //二重
a->             e->g->f->e->c->d->b->    e->g->... //一重、eの初期値が真
a->e->c->d->b-> e->g->f->e->c->d->b->    e->g->... //一重、eの初期値が偽
変わったのは最初の部分とbとdの順序です。
なぜこのようにbとdの順序を逆転させるかというと、bがループの終了条件になっているからです。
dで行われる処理がbに依存する場合は工夫しないと一重化することができません。
しかしそれ以上に問題なのが最初の部分が大幅に変わっていることです。
for文二重化の際に最もネックとなってくるのがこの点で、初期化の方法を変えるのが難しい場合は二重のままである方が短い場合が多いです。
以上をまとめると
初期化が大変
c,d,f,gの部分にできるだけ処理が入らないようにする
dがbに依存しているときは工夫が必要
fが常に真になるようにする

それでは、具体例で考えてみましょう。

具体例

未編集。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます