IFOświadczenia skracające
IF wyciągi są dość drogie, a ich gra w golfa pozwala zaoszczędzić wiele bajtów.
Zastanów się, co następuje (na podstawie odpowiedzi Erika the Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
Pierwszą rzeczą, którą możemy zrobić, to zapisać ENDIFza pomocą IFinstrukcji jednowierszowej :
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Działa to tak długo, jak nie próbujesz umieścić go w tym samym wierszu, co cokolwiek innego. W szczególności, jeśli masz zagnieżdżone IFinstrukcje, tylko najbardziej wewnętrzna instrukcja może być jednowierszowa.
Ale w tym przypadku możemy IFcałkowicie wyeliminować matematykę. Zastanów się, czego tak naprawdę chcemy:
- Jeśli
RND<.5jest to prawda ( -1), chcemy:
x zmniejszyć o 1
y pozostać niezmienionym
a(i) zostać 1
- W przeciwnym razie, jeśli
RND<.5jest to false ( 0), chcemy:
x pozostać niezmienionym
y zmniejszyć o 1
a(i) stać się 0
Teraz, jeśli mamy zachować wynik warunkowego w zmiennej ( r=RND<.5), możemy obliczyć nowe wartości x, yoraz a(i):
- Kiedy
rto -1, x=x-1; kiedy rto 0, x=x+0.
- Kiedy
rto -1, y=y+0; kiedy rto 0, y=y-1.
- Kiedy
rto -1, a(i)=1; kiedy rto 0, a(i)=0.
Nasz końcowy kod wygląda następująco:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
oszczędność aż 20 bajtów (40%) w stosunku do oryginalnej wersji.
Metodę matematyczną można zaskakująco często stosować, ale gdy istnieje różnica w logice między tymi dwoma przypadkami (np. Gdy musisz wprowadzić coś w jednym przypadku, ale nie w drugim), nadal będziesz musiał użyć IF.