Verkürzende IFAussagen
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 ENDIFmit einer einzeiligen IFAnweisung:
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 IFAnweisungen haben, kann nur die innerste einzeilig sein.
Aber in diesem Fall können wir die IFVerwendung von Mathematik vollständig eliminieren . Überlegen Sie, was wir eigentlich wollen:
- Wenn
RND<.5wahr ist ( -1), wollen wir:
x um 1 verringern
y gleich bleiben
a(i) 1 werden
- Andernfalls wollen wir , wenn
RND<.5false ( 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, yund a(i):
- Wann
rist -1, x=x-1; wenn rist 0, x=x+0.
- Wann
rist -1, y=y+0; wenn rist 0, y=y-1.
- Wann
rist -1, a(i)=1; wenn rist 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.