Welche allgemeinen Tipps haben Sie zum Golfen in Lua? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas spezifisch für Lua sind (z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
21
Antworten:
Zusätzlich zu den bereits veröffentlichten sind hier einige Tricks, die ich im Laufe der Zeit gesammelt habe, in keiner bestimmten Reihenfolge ...
Bei Funktionsaufrufen, bei denen nur ein Parameter durch ein Symbol begrenzt ist (
"
für Zeichenfolgen,{
für Tabellen), muss der Parameter nicht in Klammern gesetzt werden.Zum Beispiel können Sie stattdessen
print("hello")
einfach Folgendes tun:print"hello"
Entfernen Sie so viel Leerzeichen wie möglich - dies besonders einfach nach einem Symbol zu tun ist , dass schließt Strings (oder vor einer Öffnung), Funktionsaufrufe, Tische ...
Statt die
print(42) a=1
Sie tun könnenprint(42)a=1
. Ein anderes Beispiel:print(a and-1 or-2)
.Verwenden Sie den ternären Operator, wenn Sie können! Stattdessen
if a>0 then print("hello") else print("goodbye") end
lieberprint(a>0 and "hello" or "goodbye")
. Mehr Infos hier .(Dies kann tatsächlich noch besser werden:
print(a>0 and"hello"or"goodbye")
)Verwenden Sie den syntaktischen Zucker mit Doppelpunktaufruf, wenn Sie: statt
string.rep(str,12)
tun könnenstr:rep(12)
. Das funktioniert auch bei Nicht-Variablen so (und nur so):("a"):rep(5)
Anstatt
tonumber(str)
nur zu tunstr+0
Für Funktionen ohne Parameter können Sie Folgendes ausführen, anstatt sie auf die übliche Weise zu definieren (
function tick() blabla() end
)ticks=loadstring"blabla()"
:, wodurch je nach Inhalt mindestens 1 Byte gespart werden. Wenn Sie mehrere Funktionen definieren, lokalisieren Sie diese zuvorloadstring
in einer 1-Zeichen-Variablen, und Sie sparen eine Menge Bytes. Dank an Jim Bauwens für diesen Trick.Lua betrachtet leere Zeichenfolgen (und im
0
Gegensatz zu anderen Sprachen) als wahr in bedingten Tests.while 1 do ... end
Sparen Sie zum Beispiel 1 Byte durch Schreiben , anstatt dies zu tunwhile''do ... end
quelle
str+0
Äquivalent ist~~str
, kann nützlich sein, weil es Vorrang hatIch habe schon an einen gedacht. Ich weiß nicht, ob es in anderen Sprachen funktioniert, aber ich kenne nur Lua, mit dem Sie Funktionen in Variablen speichern können. Wenn also zB
string.sub
in Ihrem Programm mehrfach verwendet wird, verwenden Sie zBs=string.sub
.quelle
s=("").sub
oders=a.sub
für jede Variable,a
die einen Zeichenfolgenwert enthält.Es ist eine ziemlich ausführliche Sprache zum Golfen ... aber einige allgemeine Tipps, die mir einfallen, sind:
if
...then
...else
...end
eine große Verschwendung ist.for i=1,5 do
.#
Betreiber ist ziemlich gut zum Golfen (und im Allgemeinen).quelle
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: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
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:
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 :).
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:
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
Das
...
ist etwas Besonderes in lua, es ist eine Variable, die den entpackten Inhalt vonarg
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
und hier sind die kürzesten Aufrufe, die Sie ohne die Variablen hätten machen können:
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:
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
. Aor
kann als eine Funktion betrachtet werden: Es gibt immer einen Wert zurück. Hier ist der Wert, den es zurückgibt: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
wennx and y
auswertet auf true.Das Problem dabei ist, dass es fehlschlagen wird, wenn wir eine
nil
oderfalse
eine Rückgabe wünschen, wenn die Bedingung erfüllt istfalse
. Beispielsweise wird das Folgende immer 5 zurückgeben, obwohl die Bedingung erfüllt ist.Hier ist eine schrittweise Auswertung eines Ternärs, um zu erklären, wie es funktioniert (nützlich, wenn Sie sie verschachteln müssen :))
quelle
Ich habe auch einige Tipps zusammengestellt. Ich bin sicher, einige von mir werden sich mit den bereits genannten überschneiden, aber ich werde sie trotzdem in den Prozess der Erstellung einer vollständigeren Antwort einbeziehen.
Weisen Sie Variablen wiederholte Funktionen zu
Mit Lua können Sie Variablen Funktionen zuweisen. Sogar Variablen mit einem Zeichen. Das heißt, wenn Sie die Funktion
string.sub(x, y)
mehr als zweimal wiederholen , profitieren Sie davon, wenn Sie sie einer Variablen zuweisen.Ohne Zuordnung zu einer Variablen (69 Zeichen):
Zuweisen zu einer Variablen (51 Zeichen):
Es gibt Fälle, in denen Sie noch einen Schritt weiter gehen können. Lua erlaubt einem OOP die Manipulation von Strings wie folgt:
str:sub(x, y)
oderstr.sub(x, y)
Dies eröffnet neue Optionen für unseren Code. Sie können der Funktion eine Variable zuweisen, indem Sie wie gezeigt auf sie verweisen (46 Zeichen).Verwenden Sie die effizienteste Methode zum Parsen von Zeichenfolgen
Möglicherweise verwenden Sie eine
for
Schleifestring.sub
, um Zeichen für Zeichen in Lua zu iterieren. Manchmal funktioniert das am besten, je nach Ihren Anforderungen, aber manchmal funktioniert string.gmatch auch mit weniger Zeichen. Hier ist ein Beispiel für beide:Und wenn man Golf spielt, ist der Unterschied bemerkenswerter:
Umstrukturierungszuweisungen zur Optimierung des Leerraums
In Lua müssen Sie kein Leerzeichen zwischen eine geschlossene Klammer oder ein Anführungszeichen am Ende und das nächste Zeichen setzen. Bisher habe ich zwei Fälle gefunden, in denen eine Umstrukturierung vor diesem Hintergrund die Zeichen schneidet.
Variablen zuweisen:
If-Anweisungen:
Geben Sie die wenigsten Zeichen zurück, die möglich sind
Wenn Sie einen wahren oder falschen Wert zurückgeben müssen, müssen Sie anscheinend mindestens 5 Zeichen für den Rückgabewert verwenden. In Wirklichkeit funktioniert Folgendes genauso gut:
quelle
nil
und dasfalse
Ergebnis falsch in lua, alles andere ist wahr, so dass Ihre Tipps zu ersetzenx==0
,x==""
undx==''
durchx
falsch. Ich ändere es gerade aufnil
:).Dies sind (meiner Meinung nach) nur Lua-Optimierungen:
Zeichenfolgen werden bei arithmetischen Operationen automatisch in Zahlen umgewandelt. Achten Sie auf bedingte Anweisungen, die nicht automatisch konvertiert werden. Dies ist ideal, um Benutzereingaben als Zahlen zu verwenden und dabei Platz zu sparen.
Das Umschalten des Inhalts zweier Variablen erfordert keine temporäre Variable.
a,b=b,a
vertauscht die Werte von a und b.Um das oben Gesagte zu erweitern, kann jedes alphanumerische Zeichen ein nicht alphanumerisches Zeichen berühren. Es
a,b=io.read():match"(.+)/(.+)"u,v=a,b
ist also ein perfektes, funktionierendes Skript, auch wenn Leerzeichen fehlen.quelle
Kombinieren Sie Zuweisungen lokaler Variablen
Anstatt:
Verwenden Sie die parallele Zuordnung:
6 Bytes für jede Variable gespeichert!
Deklarieren Sie lokale Variablen über nicht verwendete Funktionsparameter
Anstatt:
Verwenden
6 Bytes gespeichert (minus 1-2 Bytes für jede Variable, die dupliziert werden könnte).
quelle
local
beim Golfen gerechtfertigt ist, weil Sie nur einen anderen Namen verwenden müssen. Wir könnten ALLE Namen von bis zu 7 Zeichen UND Tabellen mit Zeichenfolgenindizes von bis zu 7 Zeichenkombinationen verwenden, bevor wir auf etwas stoßen, das von der Verwendung von Einheimischen profitieren könnteVariadische Funktionen
Die Hauptvariablenfunktion, die Sie stören wird, ist
print()
. Wenn Sie es beispielsweise verwenden,String.gsub()
wird die von Ihnen geänderte Zeichenfolge UND die Häufigkeit dergsub
Auslösung gedruckt .Um diese zweite Ausgabe zu unterdrücken, kapseln Sie Ihre
gsub
In-Parens ein, um zu erzwingen, dass nur ein Wert zurückgegeben wirdquelle
Wissen, wie man ausgibt
Es gibt zwei Hauptmethoden für die Ausgabe in lua
Wenn Sie mehrere Male verketten müssen, können Sie dies verkürzen, indem Sie
io.write()
anstelle des Standardverkettungsoperators eine Variable mit einem Buchstaben verwenden..
Sie erhalten 2 Bytes bei jedem Anruf, während Sie im Voraus bezahlen
Sie befinden sich bereits in der dritten Verkettung und erhalten ab der vierten Byte.
quelle
print
und nichtprintf
!Eine Reihe von Tipps in keiner bestimmten Reihenfolge:
string
ist ein ziemlich langer Name. Effizient('').char
ist das gleiche wiestring.char
. Noch bessere Ergebnisse können erzielt werden, wenn Sie es zusammen mit einem Semikolon für Variablen: verwendena=...; print(a:sub(1, 5))
. Einigestring
Funktionen verwenden jedoch keine Zeichenfolgen als Eingabe.tonumber
und+0
oft nur Bytes verschwenden.load'your function code here'
statt verwendenfunction()your function code here end
. Auf Funktionsargumente zugreifen mit...
inside auf .a:gsub('.',load'my function')
scheint der kürzeste Weg zu iterieren Zeichen in einer Zeichenfolge zu seina:find('.',1,1)
(um dieses Problem zu testen, versuchen Sie,%
an verschiedenen Stellen in Ihre Eingabe aufzunehmen und die Ergebnisse zu überprüfen). Unzählige Ideen gingen kaputt, weil Lua versuchte, Eingaben als Muster zu analysieren.nil
ist drei Bytes,_
ist eins (es ist nur ein zufälliger Name, der höchstwahrscheinlich nicht existiert). Außerdem wird jede Ziffer als Wahrheitswert verwendet.x and i or o
. Es ist nicht nur ein ternärer Operator - es ist ein vollständiger logischer Ausdruck. Tatsächlich bedeutet dies Folgendes: "Wennx
es wahr ist, versuchen Sie esi
. Wenn entweder x oder i falsch ist, geben Sie o zurück." Wenni
also nicht wahr ist, ist das Ergebniso
. Es können auch beideand
oderor
Teile weggelassen werden (x and i
,x or o
).math.floor
:5.3//1==5.0
. Bitte beachten Sie, dass die resultierende Zahl immer der Art der Eingabe eins (Integer / Float) folgt.quelle