Скорочення 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<.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
.