Raccourcissez votre boucle infinie
Lorsque vous devez utiliser une boucle infinie, vous pouvez penser à utiliser un while
, mais l'utilisation d'une étiquette à la place est plus courte de 2 octets:
while''do end
::a::goto a
Utilisez le moins d'espace possible
Il y a une chose simple que vous pourriez (ab) utiliser pour supprimer encore plus d'espaces de votre code. Les spécifications de Lua sont claires sur le nom que vous donnez aux variables: elles doivent commencer par une lettre. Cela implique que, parfois, vous pouvez sauter des espaces entre les nombres et les fonctions / variables
x=0>1 and 0or 1print(x)
La possibilité de supprimer l'espace dépend de la lettre qui suit le chiffre, voici la lettre qui ne vous permettra pas de faire ceci:
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)
En l'utilisant et en prêtant attention à la façon dont vous appelez vos variables, vous pouvez libérer la plupart de vos codes source sans espace.
Reprenant un exemple déjà ici, et en utilisant ce conseil, voici un octet de plus que vous pouvez raser :).
print(a and-1 or-2)
print(a and-1or-2)
Utilisez la bonne méthode de saisie
Si nous regardons le passe-partout et le coût pour chaque type principal d'entrée, voici ce que nous avons:
function f(x)x end
io.read()
arg[1]
Chacune de cette méthode nous permet de prendre 1 entrée, la fonction étant celle qui a le coût le plus élevé (mais nous permet de prendre un tableau en entrée)
Nous pouvons maintenant voir que l'utilisation de l'argument de ligne de commande est la voie à suivre si vous voulez jouer au golf, mais sachez que cela peut être encore plus court
arg[1]
...
Les ...
sont un peu spéciaux dans lua, c'est une variable contenant le contenu décompressé de arg
, ou les paramètres décompressés dans le cas d'une fonction variadique.
Lorsque vous devrez obtenir plusieurs entrées et utiliser chacune d'elles, il peut être utile de les enregistrer dans une variable. Voici quelques façons de sauvegarder 2 entrées dans des variables
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
et voici l'appel le plus court que vous auriez pu faire sans les variables:
... -- 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
À partir du moment où vous avez 3 arguments, ou lorsque vous utilisez 2 arguments, avec un utilisé deux fois, vous gagnez déjà des octets à cause de a,b=...
! :)
N'utilisez presque jamais si!
Il n'y a presque aucun cas où l'utilisation d'une instruction if / elseif / if coûtera moins cher qu'un ternaire. le passe-partout pour une telle déclaration est vraiment lourd:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Avec un exemple simple, vous économisez déjà 12 octets, quand vous devez faire des elseifs, cela devient de plus en plus important, alors soyez conscient de cela!
De plus, les ternaires à lua sont spéciaux , il y a des conditions dans leur fonctionnement, pour ceux qui sont intéressés, je l'expliquerai ci-dessous:
Les ternaires en lua sont de la forme <condition> and <case true: have to be a true value> or <case false: can be anything>
Tout d'abord, voyons la table de vérité du or
. A or
peut être considéré comme une fonction: il renvoie toujours une valeur, voici la valeur qu'il renvoie:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
C'est ce qui nous permet de construire notre ternaire.
C'est and
ce qui nous permet d'évaluer la condition, elle reviendra toujours y
si la valeur est x and y
vraie.
Le problème avec cela est qu'il échouera si nous voulons qu'un nil
ou false
soit retourné lorsque la condition est false
. Par exemple, ce qui suit renvoie toujours 5, bien que la condition soit vraie.
v = true and false or 5
Voici une évaluation étape par étape d'un ternaire pour expliquer comment cela fonctionne (il sera utile lorsque vous devrez les imbriquer :))
-- 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