Сокращенные 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<.5true ( -1), мы хотим:
x уменьшить на 1
y оставаться прежним
a(i) стать 1
- В противном случае, если
RND<.5false ( 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.