IFDichiarazioni di accorciamento
IF le dichiarazioni sono piuttosto costose e il loro golf down può far risparmiare parecchi byte.
Considera quanto segue (adattato da una risposta di Erik the Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
La prima cosa che possiamo fare è salvare ENDIFutilizzando IFun'istruzione a riga singola :
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Funziona finché non provi a metterlo sulla stessa linea di qualsiasi altra cosa. In particolare, se hai IFdichiarazioni nidificate , solo quella più interna può essere a riga singola.
Ma in questo caso, possiamo eliminare il IFtutto usando la matematica. Considera cosa vogliamo effettivamente:
- Se
RND<.5è vero ( -1), vogliamo:
x per diminuire di 1
y per rimanere lo stesso
a(i) diventare 1
- Altrimenti, se
RND<.5è false ( 0), vogliamo:
x per rimanere lo stesso
y per diminuire di 1
a(i) per diventare 0
Ora, se salviamo il risultato del condizionale in una variabile ( r=RND<.5), possiamo calcolare i nuovi valori di x, ye a(i):
- Quando
rè -1, x=x-1; quando rè 0, x=x+0.
- Quando
rè -1, y=y+0; quando rè 0, y=y-1.
- Quando
rè -1, a(i)=1; quando rè 0, a(i)=0.
Quindi il nostro codice finale appare come:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
risparmiando un enorme 20 byte (40%) rispetto alla versione originale.
L'approccio matematico può essere applicato sorprendentemente spesso, ma quando c'è una differenza nella logica tra i due casi (ad esempio quando è necessario inserire qualcosa in un caso ma non nell'altro), sarà comunque necessario utilizzarlo IF.