Verkürzen Sie Ihre Endlosschleife
Wenn Sie eine Endlosschleife verwenden müssen, können Sie an die Verwendung von a denken while
, aber stattdessen ist die Verwendung eines Labels um 2 Byte kürzer:
while''do end
::a::goto a
Verwenden Sie so wenig Platz wie möglich
Es gibt eine einfache Sache, mit der Sie (ab) noch mehr Leerzeichen aus Ihrem Code entfernen können. Die Angaben von Lua zu dem Namen, den Sie Variablen geben, sind eindeutig: Sie müssen mit einem Buchstaben beginnen. Manchmal kann man Leerzeichen zwischen Zahlen und Funktionen / Variablen überspringen
x=0>1 and 0or 1print(x)
Die Möglichkeit, das Leerzeichen zu entfernen, hängt von dem Buchstaben ab, der auf die Zahl folgt. Mit dem folgenden Buchstaben können Sie dies nicht tun:
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)
Indem Sie dies verwenden und darauf achten, wie Sie Ihre Variablen aufrufen, können Sie die meisten Ihrer Quellcodes platzsparend gestalten.
Wenn Sie hier bereits ein Beispiel aufgreifen und diesen Rat befolgen, ist hier ein weiteres Byte, das Sie abschneiden könnten :).
print(a and-1 or-2)
print(a and-1or-2)
Verwenden Sie die richtige Eingabemethode
Wenn wir uns die vorformulierten und Kosten für jeden aussehen Haupt Art von Input, hier ist , was wir haben:
function f(x)x end
io.read()
arg[1]
Jede dieser Methoden erlaubt es uns, 1 Eingabe zu nehmen, wobei die Funktion die teuerste ist (aber es erlaubt uns, eine Tabelle als Eingabe zu nehmen).
Wir können jetzt sehen, dass die Verwendung von Befehlszeilenargumenten der richtige Weg ist, wenn Sie Golf spielen möchten. Beachten Sie jedoch, dass es sogar noch kürzer sein kann
arg[1]
...
Das ...
ist etwas Besonderes in lua, es ist eine Variable, die den entpackten Inhalt von arg
oder die entpackten Parameter im Falle einer variadischen Funktion enthält.
Wenn Sie mehr als eine Eingabe benötigen und jede von ihnen verwenden müssen, kann es sinnvoll sein, sie in einer Variablen zu speichern. Hier sind einige Möglichkeiten zum Speichern von 2 Eingaben in Variablen
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
und hier sind die kürzesten Aufrufe, die Sie ohne die Variablen hätten machen können:
... -- 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
Ab dem Punkt, an dem Sie 3 Argumente haben, oder wenn Sie 2 Argumente verwenden, wobei eines zweimal verwendet wird, gewinnen Sie aufgrund von bereits Bytes a,b=...
! :)
Fast nie verwenden, wenn!
Es gibt so gut wie keine Fälle, in denen die Verwendung einer if / elseif / if-Anweisung weniger kostet als eine ternäre Anweisung. Das Boilerplate für eine solche Aussage ist wirklich schwer:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Mit einem einfachen Beispiel sparen Sie bereits 12 Bytes, wenn Sie ein paar elseifs machen müssen, wird es immer wichtiger, also seien Sie sich dessen bewusst!
Auch Ternaries in Lua sind etwas Besonderes , es gibt einige Bedingungen, wie sie funktionieren. Für Interessierte erkläre ich es hier:
Ternaries in lua sind von der Form <condition> and <case true: have to be a true value> or <case false: can be anything>
Sehen wir uns zunächst die Wahrheitstabelle der or
. A or
kann als eine Funktion betrachtet werden: Es gibt immer einen Wert zurück. Hier ist der Wert, den es zurückgibt:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Das ist es, was uns erlaubt, unser Dreistöckchen zu konstruieren.
Das and
ist es, was es uns ermöglichen , den Zustand zu beurteilen, es wird immer wieder zurückkehren , y
wenn x and y
auswertet auf true.
Das Problem dabei ist, dass es fehlschlagen wird, wenn wir eine nil
oder false
eine Rückgabe wünschen, wenn die Bedingung erfüllt ist false
. Beispielsweise wird das Folgende immer 5 zurückgeben, obwohl die Bedingung erfüllt ist.
v = true and false or 5
Hier ist eine schrittweise Auswertung eines Ternärs, um zu erklären, wie es funktioniert (nützlich, wenn Sie sie verschachteln müssen :))
-- 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