Birleştirici for
dö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. $cond2
ilk kez başarısızlıkla sonuçlanacak şekilde yazılması gerekecek. $post1
Ayrı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&&print
print
ilk 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.