IF
Dichiarazioni 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 ENDIF
utilizzando IF
un'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 IF
dichiarazioni nidificate , solo quella più interna può essere a riga singola.
Ma in questo caso, possiamo eliminare il IF
tutto 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
, y
e 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
.