Łączenie for
pętli
Załóżmy, że masz kod o następującej formie:
for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;
można to ogólnie przerzucić ponownie w następującej formie:
for($pre1; $cond2 • $post2 || $cond1 • $pre2 • $post1; ) $code;
gdzie •
reprezentuje ogólny operator łączenia. Zwykle powoduje to zmniejszenie liczby bajtów, ale prawdopodobnie będzie wymagać kreatywności. $cond2
będzie musiał zostać napisany, aby nie zawiódł za pierwszym razem. $post1
powinien również nie zostać wykonany po raz pierwszy, chociaż może być łatwiej dokonać uprzedniej refaktoryzacji, aby $post1
nie było go.
Jeśli pracujesz z trzema lub więcej zagnieżdżonymi pętlami, możesz również najpierw połączyć dwie, a następnie połączyć je z inną itd. Uważam, że ogólnie łatwiej było łączyć od wewnątrz na zewnątrz.
Jako przykład rozważ poniższe rozwiązanie fraktala H-carpet ( 97 bajtów ):
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;
Można to przeformułować w następujący sposób:
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
zapobiega print
pierwszej iteracji, a także nie zwiększa $i
.
i na koniec ( 93 bajty ):
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
zawiedzie po raz pierwszy, ponieważ obie zmienne są niezdefiniowane.