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ść arglub 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 ormoż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, andco pozwala nam ocenić warunek, zawsze powróci, yjeśli zostanie x and yocenione jako prawdziwe.
Problem polega na tym, że to się nie powiedzie, jeśli chcemy nilalbo falsepowró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