Укороти свой бесконечный цикл
Когда вам нужно использовать бесконечный цикл, вы можете подумать об использовании a while
, но вместо этого использование метки короче на 2 байта:
while''do end
::a::goto a
Используйте как можно меньше места
Есть простая вещь, которую вы можете (ab) использовать, чтобы убрать еще больше пробелов из вашего кода. Спецификации Lua ясны в отношении имени, которое вы даете переменным: они должны начинаться с буквы. Это означает, что иногда вы можете пропустить пробелы между числами и функциями / переменными
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 байтов, когда вам приходится делать какие-то другие операции, это становится все более и более важным, так что имейте это в виду!
Кроме того, троицы в lua являются особыми , есть некоторые условия, как они работают, для тех, кто заинтересован, я объясню это ниже:
Тройки в Луа имеют форму <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