Accorcia il tuo ciclo infinito
Quando devi usare un ciclo infinito, potresti pensare di usare a while
, ma invece usare un'etichetta è più breve di 2 byte:
while''do end
::a::goto a
Usa meno spazio possibile
C'è una cosa semplice che potresti (ab) usare per rimuovere ancora più spazi dal tuo codice. Le specifiche di Lua sono chiare sul nome che dai alle variabili: devono iniziare con una lettera. Implica che, a volte, è possibile saltare spazi tra numeri e funzioni / variabili
x=0>1 and 0or 1print(x)
La possibilità di rimuovere lo spazio dipende dalla lettera che segue il numero, ecco la lettera che non ti permetterà di farlo:
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)
Usando questo, e prestando attenzione a come chiamate le vostre variabili, potete liberare spazio nella maggior parte dei vostri codici sorgente.
Raccogliendo un esempio già qui, e usando questo consiglio, ecco un altro byte che potresti radere :).
print(a and-1 or-2)
print(a and-1or-2)
Usa il metodo di input corretto
Se osserviamo la piastra di caldaia e i costi per ciascun tipo principale di input, ecco cosa abbiamo:
function f(x)x end
io.read()
arg[1]
Ognuno di questi metodi ci consente di prendere 1 input, con la funzione che è quella con il costo più pesante (ma ci permette di prendere una tabella come input)
Ora possiamo vedere che l'uso dell'argomento della riga di comando è la strada da percorrere se si desidera giocare a golf, ma attenzione: può essere ancora più breve
arg[1]
...
La ...
sono un po 'speciale in lua, è una variabile che contiene il contenuto di directory del arg
oi parametri imballati in caso di una funzione variadic.
Quando dovrai ottenere più di un input e utilizzarli ciascuno, può essere utile salvarli in una variabile. Ecco alcuni modi per salvare 2 input in variabili
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
e qui ci sono le chiamate più brevi che avresti potuto fare senza le variabili:
... -- 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
Dal punto in cui hai 3 argomenti, o quando usi 2 argomenti, con uno usato due volte, stai già guadagnando byte a causa di a,b=...
! :)
Quasi mai usare se!
Non c'è quasi nessun caso in cui l'uso di un'istruzione if / elseif / if costerà meno di un ternario. il bollettino per tale affermazione è davvero pesante:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Con un semplice esempio, salvi già 12 byte, quando devi fare qualche altra cosa, diventa sempre più importante, quindi fai attenzione!
Inoltre, i ternari in lua sono speciali , ci sono alcune condizioni nel loro funzionamento, per chi è interessato, lo spiegherò di seguito:
I ternari in lua sono della forma <condition> and <case true: have to be a true value> or <case false: can be anything>
Prima di tutto, vediamo la tabella di verità di or
. A or
può essere considerata come una funzione: restituisce sempre un valore, ecco il valore che restituisce:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Questo è ciò che ci consente di costruire il nostro ternario.
Il and
è ciò che ci permette di valutare la condizione, sarà sempre tornare y
se x and y
restituisce true.
Il problema è che fallirà se vogliamo un nil
o false
essere restituito quando la condizione è false
. Ad esempio, quanto segue restituirà sempre 5, nonostante la condizione sia vera.
v = true and false or 5
Ecco una valutazione dettagliata di un ternario per spiegare come funziona (sarà utile quando devi nidificarli :))
-- 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