IF
Oś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ć ENDIF
za pomocą IF
instrukcji 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 IF
instrukcje, tylko najbardziej wewnętrzna instrukcja może być jednowierszowa.
Ale w tym przypadku możemy IF
całkowicie wyeliminować matematykę. Zastanów się, czego tak naprawdę chcemy:
- Jeśli
RND<.5
jest to prawda ( -1
), chcemy:
x
zmniejszyć o 1
y
pozostać niezmienionym
a(i)
zostać 1
- W przeciwnym razie, jeśli
RND<.5
jest 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
, y
oraz a(i)
:
- Kiedy
r
to -1
, x=x-1
; kiedy r
to 0
, x=x+0
.
- Kiedy
r
to -1
, y=y+0
; kiedy r
to 0
, y=y-1
.
- Kiedy
r
to -1
, a(i)=1
; kiedy r
to 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
.