Скоротіть нескінченну петлю
Коли вам доведеться використовувати нескінченний цикл, ви можете подумати про використання while
, але замість цього мітка коротша на 2 байти:
while''do end
::a::goto a
Використовуйте якомога менше місця
Існує проста річ, яку ви могли б (ab) використати, щоб видалити ще більше пробілів із коду. Характеристики Луа чіткі щодо імені, яке ви даєте змінним: Вони повинні починатися з літери. Це означає, що іноді можна пропускати пробіли між числами та функціями / змінними
x=0>1 and 0or 1print(x)
Можливість вилучення пробілу залежить від літери, яка слідує за номером, ось лист, який не дозволить вам це зробити:
a,b,c,d,e,f -- They would be interpreted as hexadecimal
x -- only fail when after a 0, other number are fine
-- (0x indicates the following is an hexadecimal number)
Використовуючи це та звертаючи увагу на те, як ви називаєте свої змінні, ви можете зробити більшість вихідних кодів просторовими.
Збираючи приклад вже тут, і користуючись цією порадою, ось ще один байт, який ви могли б побрити :).
print(a and-1 or-2)
print(a and-1or-2)
Використовуйте правильний метод введення
Якщо ми подивимось на котлову та вартість кожного основного типу входу, ось що ми маємо:
function f(x)x end
io.read()
arg[1]
Кожен з цих методів дозволяє нам взяти 1 вхід, при цьому функція є найвищою вартістю (але дозволяє приймати таблицю як вхід)
Тепер ми можемо бачити, що використання аргументу командного рядка - це шлях, якщо ви хочете займатися гольфом, але пам’ятайте: він може бути ще коротшим
arg[1]
...
Вони ...
дещо особливі в lua, це змінна, що містить розпакований вміст arg
або розпаковані параметри у разі варіативної функції.
Коли вам доведеться отримати більше одного вводу та використовувати кожен з них, це може бути добре зберегти їх у змінній. Ось кілька способів збереження 2 вхідних даних у змінних
a=arg[1]b=arg[2] -- highly un-efficient, costs 8 bytes by variable
a,b=unpack(arg) -- costs 15, but at least doesn't depends on the number of argument
a,b=... -- only costs 7
і ось найкоротший дзвінок, який ви могли зробити без змінних:
... -- using a allow a gain of 1-2 bytes at each use
arg[2] -- using b allow a gain of 4-5 bytes at each use
З моменту, коли у вас є 3 аргументи, або коли ви використовуєте 2 аргументи, причому один використовується два рази, ви вже набираєте байти завдяки a,b=...
! :)
Майже ніколи не використовуйте, якщо!
Немає випадків, коли використання оператора if / elseif / if обійдеться менше, ніж потрійний. котельня для такої заяви справді важка:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Простим прикладом ви вже економите 12 байт, коли вам доведеться робити ще кілька фішок, це стає все більш важливим, тому пам’ятайте про це!
Крім того, тернари в Луа є особливими , є певна умова, як вони працюють, для тих, хто цікавиться, я поясню це нижче:
Тернарії в луа мають форму <condition> and <case true: have to be a true value> or <case false: can be anything>
Перш за все, давайте подивимось таблицю істинності or
. A or
може розглядатися як функція: воно завжди повертає значення, ось значення, яке воно повертає:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Саме це дозволяє нам сконструювати наш тернар.
Це and
те, що дозволяє нам оцінити умову, вона завжди повернеться, y
якщо x and y
оцінить до істини.
Проблема з ним полягає в тому, що він не вийде, якщо ми хочемо повернути nil
або false
повернутись, коли це стан false
. Наприклад, наступні завжди повертатимуть 5, незважаючи на те, що умова є істинною.
v = true and false or 5
Ось покрокове оцінювання потрійника, щоб пояснити, як він працює (це стане в нагоді, коли вам доведеться їх вкладати :))
-- let's use our dumb ternary
= true and false or 5
-- and statement will be evaluated first, leading to
= false or 5
-- and we saw how the or works
= 5