Combinando for
bucles
Supongamos que tiene un código de la siguiente forma:
for($pre1; $cond1; $post1) for($pre2; $cond2; $post2) $code;
esto generalmente se puede volver a enrollar de la siguiente forma:
for($pre1; $cond2 • $post2 || $cond1 • $pre2 • $post1; ) $code;
donde •
representa un operador de combinación genérico. Esto generalmente resulta en una reducción en el conteo de bytes, pero probablemente requerirá algo de creatividad. $cond2
deberá escribirse para que falle la primera vez.$post1
también debe fallar la ejecución la primera vez, aunque puede ser más fácil refactorizar de antemano para que$post1
no esté presente.
Si está trabajando con tres o más bucles anidados, también puede combinar dos primero, y luego combinar eso con otro, y así sucesivamente. Encuentro que en general ha sido más fácil combinar desde adentro hacia afuera.
Como ejemplo, considere la siguiente solución para el fractal de la alfombra H ( 97 bytes ):
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;
Esto puede reformularse de la siguiente manera:
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
previene print
en la primera iteración y tampoco aumenta $i
.
y finalmente ( 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
fallará la primera vez ya que ambas variables no están definidas.