Використовуючи if
, ifelse
і`if`
Існує декілька способів зробити, якщо твердження в оптимальних рішеннях R. Golf можуть різнитися.
Основи
if
призначений для контролю потоку. Він не векторизований, тобто може оцінювати лише умови довжини 1. Це вимагає else
(необов'язково) повернення іншого значення.
ifelse
є функцією. Він векторизований і може повертати значення довільної довжини. Третій аргумент (інше значення) є обов'язковим. *
`if`
є функцією, з тим же синтаксисом, що і ifelse
. Він не векторизований, і жоден із зворотних аргументів не є обов'язковим.
* Це технічно не є обов'язковим; ifelse(TRUE,x)
працює добре, але він видає помилку, якщо третій аргумент порожній і умова оцінюється на FALSE
. Тож безпечно використовувати лише тоді, коли ви впевнені, що ця умова є завжди TRUE
, і якщо це так, то чому ви навіть не турбуєтесь із заявою if?
Приклади
Всі вони рівноцінні:
if(x)y else z # 13 bytes
ifelse(x,y,z) # 13 bytes
`if`(x,y,z) # 11 bytes
Зауважте, що пробіли навколо else
не потрібні, якщо ви використовуєте рядки безпосередньо в коді:
if(x)"foo"else"bar" # 19 bytes
ifelse(x,"foo","bar") # 21 bytes
`if`(x,"foo","bar") # 19 bytes
Поки `if`
виглядає переможцем, доки ми не маємо векторизованих даних. А як щодо випадків, коли нас не хвилює інша умова? Скажімо, ми хочемо виконати якийсь код лише в тому випадку, якщо це умова TRUE
. if
Зазвичай лише один рядок коду :
if(x)z=f(y) # 11 bytes
ifelse(x,z<-f(y),0) # 19 bytes
`if`(x,z<-f(y)) # 15 bytes
Для кількох рядків коду if
все ще є переможцем:
if(x){z=f(y);a=g(y)} # 20 bytes
ifelse(x,{z=f(y);a=g(y)},0) # 27 bytes
`if`(x,{z=f(y);a=g(y)}) # 23 bytes
Там також можливість того, де ми дійсно дбаємо про стан ще, і де ми хочемо , щоб виконати довільний код , а не повертати значення. У цих випадках, if
і `if`
еквівалентні по лічильнику байтів.
if(x)a=b else z=b # 17 bytes
ifelse(x,a<-b,z<-b) # 19 bytes
`if`(x,a<-b,z<-b) # 17 bytes
if(x){z=y;a=b}else z=b # 22 bytes
ifelse(x,{z=y;a=b},z<-b) # 24 bytes
`if`(x,{z=y;a=b},z<-b) # 22 bytes
if(x)a=b else{z=b;a=y} # 22 bytes
ifelse(x,a<-b,{z=b;a=y}) # 24 bytes
`if`(x,a<-b,{z=b;a=y}) # 22 bytes
if(x){z=y;a=b}else{z=b;a=y} # 27 bytes
ifelse(x,{z=y;a=b},{z=b;a=y}) # 29 bytes
`if`(x,{z=y;a=b},{z=b;a=y}) # 27 bytes
Підсумок
Використовуйте, ifelse
коли вводиться довжина> 1.
Якщо ви повертаєте просте значення, а не виконуєте багато рядків коду, використання `if`
функції, ймовірно, коротше повного if
... else
оператора.
Якщо ви просто хочете отримати одне значення TRUE
, використовуйте if
.
Для виконання довільного коду `if`
і, if
як правило, однакові за кількістю байтів; Рекомендую if
головним чином тому, що це легше читати.