Encurte seu loop infinito
Quando você precisa usar um loop infinito, pode pensar em usar a while
, mas o uso de um rótulo é menor em 2 bytes:
while''do end
::a::goto a
Use o menor espaço possível
Há uma coisa simples que você pode (ab) usar para remover ainda mais espaços do seu código. As especificações de Lua são claras sobre o nome que você atribui às variáveis: elas precisam começar com uma letra. Isso implica que, às vezes, você pode pular espaços entre números e funções / variáveis
x=0>1 and 0or 1print(x)
A possibilidade de remover o espaço depende da letra após o número, aqui está a letra que não permitirá que você faça isso:
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)
Ao usar isso e prestar atenção em como você chama suas variáveis, você pode tornar a maioria dos seus códigos-fonte sem espaço.
Pegando um exemplo já aqui, e usando este conselho, aqui está mais um byte que você pode raspar :).
print(a and-1 or-2)
print(a and-1or-2)
Use o método de entrada correto
Se olharmos para o padrão e o custo de cada tipo principal de entrada, eis o que temos:
function f(x)x end
io.read()
arg[1]
Cada um desses métodos nos permite obter 1 entrada, com a função com o custo mais alto (mas nos permite tomar uma tabela como entrada)
Agora podemos ver que o uso do argumento da linha de comando é o caminho a seguir, se você deseja jogar golfe, mas esteja ciente: ele pode ser ainda mais curto
arg[1]
...
Eles ...
são um pouco especiais em lua, é uma variável que contém o conteúdo descompactado de arg
ou os parâmetros descompactados no caso de uma função variável .
Quando você precisar obter mais de uma entrada e usar cada uma delas, pode ser bom salvá-las em uma variável. Aqui estão algumas maneiras de salvar 2 entradas em variáveis
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 aqui está a chamada mais curta que você poderia ter feito sem as variáveis:
... -- 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
Do ponto em que você tem 3 argumentos, ou quando você usa 2 argumentos, com um usado duas vezes, você já está ganhando bytes devido a a,b=...
! :)
Quase nunca use se!
Quase não há casos em que o uso de uma instrução if / elseif / if custará menos que um ternário. o padrão para essa afirmação é realmente pesado:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Com um exemplo simples, você já salva 12 bytes; quando precisar fazer outras coisas, isso se tornará cada vez mais importante; portanto, esteja ciente disso!
Além disso, os ternários em lua são especiais , há alguma condição em como eles funcionam, para os interessados, explicarei abaixo:
Os ternários em lua têm a forma <condition> and <case true: have to be a true value> or <case false: can be anything>
Primeiro de tudo, vamos ver a tabela verdade do or
. A or
pode ser considerado como uma função: sempre retorna um valor, eis o valor que retorna:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Isso é o que nos permite construir nosso ternário.
O and
é o que nos permite avaliar a condição, ele sempre retornará y
se x and y
avalia a verdade.
O problema com ele é que ele irá falhar se queremos uma nil
ou false
estar de retorno quando a condição é false
. Por exemplo, o seguinte sempre retornará 5, apesar da condição ser verdadeira.
v = true and false or 5
Aqui está uma avaliação passo a passo de um ternário para explicar como ele funciona (será útil quando você precisar aninhar :))
-- 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