Сокращенные IF
заявления
IF
операторы довольно дороги, и игра в гольф может сэкономить много байтов.
Рассмотрим следующее (адаптировано из ответа Эрика Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
Первое, что мы можем сделать, это сохранить ENDIF
с помощью однострочного IF
оператора:
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Это работает до тех пор, пока вы не попытаетесь поместить его в одну строку с чем-либо еще. В частности, если у вас есть вложенные IF
операторы, только самые внутренние могут быть однорядными.
Но в этом случае мы можем IF
полностью исключить использование математики. Посмотрим, что мы на самом деле хотим:
- Если
RND<.5
true ( -1
), мы хотим:
x
уменьшить на 1
y
оставаться прежним
a(i)
стать 1
- В противном случае, если
RND<.5
false ( 0
), мы хотим:
x
оставаться прежним
y
уменьшить на 1
a(i)
стать 0
Теперь , если мы сохраним результат условной в переменной ( r=RND<.5
), мы можем вычислить новые значения x
, y
и a(i)
:
- Когда
r
это -1
, x=x-1
; когда r
есть 0
, x=x+0
.
- Когда
r
это -1
, y=y+0
; когда r
есть 0
, y=y-1
.
- Когда
r
это -1
, a(i)=1
; когда r
есть 0
, a(i)=0
.
Итак, наш окончательный код выглядит так:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
сохранение колоссальных 20 байтов (40%) по сравнению с оригинальной версией.
Математический подход может применяться на удивление часто, но когда между этими двумя случаями есть различие в логике (например, когда вам нужно что-то ввести в одном случае, а не в другом), вам все равно придется использовать IF
.