Verkürzende IF
Aussagen
IF
Anweisungen sind ziemlich teuer, und wenn Sie sie ablegen, können viele Bytes gespart werden.
Betrachten Sie Folgendes (nach einer Antwort von Erik dem Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
Das erste, was wir tun können, ist das Speichern ENDIF
mit einer einzeiligen IF
Anweisung:
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Dies funktioniert, solange Sie nicht versuchen, es in die gleiche Zeile wie irgendetwas anderes zu setzen. Insbesondere wenn Sie verschachtelte IF
Anweisungen haben, kann nur die innerste einzeilig sein.
Aber in diesem Fall können wir die IF
Verwendung von Mathematik vollständig eliminieren . Überlegen Sie, was wir eigentlich wollen:
- Wenn
RND<.5
wahr ist ( -1
), wollen wir:
x
um 1 verringern
y
gleich bleiben
a(i)
1 werden
- Andernfalls wollen wir , wenn
RND<.5
false ( 0
) ist:
x
gleich bleiben
y
um 1 verringern
a(i)
zu 0 werden
Nun , wenn wir das Ergebnis der bedingten in einer Variablen (speichern r=RND<.5
), können wir die neuen Werte von berechnen x
, y
und a(i)
:
- Wann
r
ist -1
, x=x-1
; wenn r
ist 0
, x=x+0
.
- Wann
r
ist -1
, y=y+0
; wenn r
ist 0
, y=y-1
.
- Wann
r
ist -1
, a(i)=1
; wenn r
ist 0
, a(i)=0
.
Unser endgültiger Code sieht also so aus:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
Satte 20 Bytes (40%) mehr als in der Originalversion.
Der mathematische Ansatz kann überraschend oft angewendet werden, aber wenn es einen logischen Unterschied zwischen den beiden Fällen gibt (z. B. wenn Sie in einem Fall etwas eingeben müssen, in dem anderen jedoch nicht), müssen Sie ihn trotzdem verwenden IF
.