Скорочення IFтверджень
IF заяви доволі дорогі, і гольф їх може врятувати багато байт.
Розглянемо наступне (адаптовано з відповіді Еріка Побіжника):
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це правда ( -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.