Birleştirici fordöngüler
Aşağıdaki formun koduna sahip olduğunuzu varsayalım:
for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;
bu genellikle aşağıdaki biçimde yeniden sarılabilir:
for($pre1; $cond2 • $post2 || $cond1 • $pre2 • $post1; ) $code;
burada •, genel bir birleştirme operatörü göstermektedir. Bu genellikle bir bayt sayısı azalmasıyla sonuçlanır, ancak büyük olasılıkla biraz yaratıcılık gerektirir. $cond2ilk kez başarısızlıkla sonuçlanacak şekilde yazılması gerekecek. $post1Ayrıca, ilk kez gerçekleştirilememelidir, ancak önceden yok sayılmasının daha kolay olmasına rağmen $post1, mevcut olmaması.
Üç veya daha fazla iç içe döngü ile çalışıyorsanız, önce ikisini birleştirebilir, sonra bunu başka bir öğeyle birleştirebilirsiniz. İçten dışa doğru birleştirmenin genellikle daha kolay olduğunu buluyorum.
Örnek olarak, H-halı fraktalına ( 97 bayt ) aşağıdaki çözümü göz önünde bulundurun :
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;
Bu şu şekilde yeniden düzenlenebilir:
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&&printprintilk yinelemeyi önler ve ayrıca artmaz $i.
ve son olarak ( 93 bayt ):
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 Her iki değişken tanımsız olduğundan ilk kez başarısız olur.