Skróć swoją nieskończoną pętlę
Kiedy musisz użyć nieskończonej pętli, możesz pomyśleć o użyciu while
, ale zamiast tego użycie etykiety jest krótsze o 2 bajty:
while''do end
::a::goto a
Wykorzystaj jak najmniej miejsca
Jest prosta rzecz, której możesz (ab) użyć, aby usunąć jeszcze więcej spacji z kodu. Specyfikacje Luy jasno określają nazwę, którą nadajesz zmiennym: muszą zaczynać się od litery. Oznacza to, że czasami można pominąć spacje między liczbami a funkcjami / zmiennymi
x=0>1 and 0or 1print(x)
Możliwość usunięcia spacji zależy od litery następującej po numerze, oto litera, która na to nie pozwoli:
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)
Korzystając z tego i zwracając uwagę na to, jak wywołujesz zmienne, możesz zwolnić większość kodu źródłowego.
Pobierając przykład już tutaj i korzystając z tej porady, oto jeszcze jeden bajt, który możesz ogolić :).
print(a and-1 or-2)
print(a and-1or-2)
Użyj właściwej metody wprowadzania
Jeśli spojrzymy na płytę kotłową i koszt każdego głównego typu danych wejściowych, oto, co mamy:
function f(x)x end
io.read()
arg[1]
Każda z tych metod pozwala nam pobrać 1 dane wejściowe, przy czym funkcja jest tą o największym koszcie (ale pozwala nam wziąć tabelę jako dane wejściowe)
Teraz widzimy, że jeśli chcesz grać w golfa, skorzystaj z argumentu wiersza poleceń, ale pamiętaj: może być jeszcze krótszy
arg[1]
...
...
To specjalny bit lua, to zmienna zawierająca rozpakowane treść arg
lub niespakowanego parametry w przypadku zmiennej liczbie argumentów funkcji.
Gdy będziesz musiał uzyskać więcej niż jedno wejście i użyć każdego z nich, dobrze jest zapisać je w zmiennej. Oto kilka sposobów na zapisanie 2 danych wejściowych w zmiennych
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
a oto najkrótsze połączenie, jakie można było wykonać bez zmiennych:
... -- 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
Od momentu, w którym masz 3 argumenty lub gdy używasz 2 argumentów, z jednym argumentem dwukrotnie, zyskujesz już bajty a,b=...
! :)
Prawie nigdy nie używaj, jeśli!
Nie ma prawie żadnych przypadków, w których użycie instrukcji if / elseif / if będzie kosztować mniej niż trójka. płyta dla takiego stwierdzenia jest naprawdę ciężka:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Na prostym przykładzie zapisujesz już 12 bajtów, a kiedy musisz zrobić kilka innych, staje się to coraz ważniejsze, więc pamiętaj o tym!
Ponadto trójskładniki w lua są wyjątkowe , istnieje pewien warunek w ich działaniu, dla zainteresowanych wyjaśnię to poniżej:
Trójskładniki w lua mają formę <condition> and <case true: have to be a true value> or <case false: can be anything>
Przede wszystkim zobaczmy tabelę prawdy or
. A or
można uznać za funkcję: zawsze zwraca wartość, oto wartość, którą zwraca:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
To pozwala nam zbudować nasz trójskładnik.
To, and
co pozwala nam ocenić warunek, zawsze powróci, y
jeśli zostanie x and y
ocenione jako prawdziwe.
Problem polega na tym, że to się nie powiedzie, jeśli chcemy nil
albo false
powrócić, gdy stan jest spełniony false
. Na przykład, następujący wynik zawsze zwróci 5, pomimo spełnienia warunku.
v = true and false or 5
Oto krok po kroku ocena trójskładnika, aby wyjaśnić, jak to działa (przyda się, gdy trzeba je zagnieździć :))
-- 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