for
Schleifen kombinieren
Angenommen, Sie haben Code der folgenden Form:
for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;
Dies kann in der Regel in der folgenden Form erneut gerollt werden:
for($pre1; $cond2 • $post2 || $cond1 • $pre2 • $post1; ) $code;
Dabei handelt es sich •
um einen generischen Kombinationsoperator. Dies führt normalerweise zu einer Verringerung der Bytezahl, erfordert jedoch wahrscheinlich etwas Kreativität. $cond2
muss so geschrieben werden, dass es beim ersten Mal durchfällt. $post1
sollte auch nicht beim ersten Mal ausgeführt werden, obwohl es möglicherweise einfacher ist, vorher eine Umgestaltung vorzunehmen, damit diese $post1
nicht vorhanden ist.
Wenn Sie mit drei oder mehr verschachtelten Schleifen arbeiten, können Sie auch zuerst zwei Schleifen kombinieren und diese dann zu einer anderen kombinieren, und so weiter. Ich finde, dass es im Allgemeinen einfacher war, von innen nach außen zu kombinieren.
Betrachten Sie als Beispiel die folgende Lösung für das H-Teppich-Fraktal ( 97 Byte ):
for(;$i<$n=3**$argn;$i+=print"$s\n")for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;
Dies kann folgendermaßen umformuliert werden:
for(;($i+=$e&&print"$s\n")<$n=3**$argn;)for($s=H,$e=1;$e<$n;$e*=3)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;
$e&&print
verhindert print
bei der ersten Iteration und erhöht sich auch nicht $i
.
und schließlich ( 93 Bytes ):
for(;$H>$e*=3or$e=($i+=$e&&print"$s\n")<${$s=H}=3**$argn;)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;
$H>$e*=3
schlägt das erste Mal fehl, da beide Variablen undefiniert sind.