Sonsuz döngünüzü kısaltın
Sonsuz bir döngü kullanmanız gerektiğinde, bir kullanmayı düşünebilirsiniz while
, ancak bir etiket kullanmak yerine 2 bayt daha kısa:
while''do end
::a::goto a
Mümkün olduğunca az yer kullanın
(Ab) kodunuzdan daha fazla boşluk çıkarmak için kullanabileceğiniz basit bir şey var. Lua'nın özellikleri değişkenlere verdiğiniz ad konusunda net: Bir harfle başlamak zorundalar. Bu, bazen, sayılar ve işlevler / değişkenler arasındaki boşlukları atlayabileceğiniz anlamına gelir.
x=0>1 and 0or 1print(x)
Boşluk bırakma olasılığı, sayıyı izleyen harfe bağlıdır, işte size bunu yapmanıza izin vermeyecek harf:
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)
Bunu kullanarak ve değişkenlerinizi nasıl adlandırdığınıza dikkat ederek, kaynak kodlarınızın çoğunu boşluksuz hale getirebilirsiniz.
Zaten burada bir örnek almak ve bu tavsiyeyi kullanmak, işte traş olabileceğiniz bir bayt daha :).
print(a and-1 or-2)
print(a and-1or-2)
Doğru giriş yöntemini kullanın
Her bir ana girdi tipinin kazanına ve maliyetine bakarsak , işte elimizde:
function f(x)x end
io.read()
arg[1]
Bu yöntemin her biri 1 girdi almamıza izin veriyor, işlev en ağır maliyete sahip (ancak girdi olarak bir tablo almamızı sağlıyor).
Şimdi, komut satırı argümanını kullanmanın golf oynamak istiyorsanız gitmenin yolu olduğunu görebiliyoruz, ancak bunun farkında olun: daha da kısa olabilir
arg[1]
...
...
Lua biraz özeldir, bu paketlenmemiş içeriği içeren bir değişken arg
veya variadic fonksiyonu durumunda ambalajsız parametreleri.
Birden fazla giriş almanız ve her birini kullanmanız gerektiğinde, bunları bir değişkene kaydetmeniz iyi olur. İşte 2 girişi değişkenlere kaydetmenin bazı yolları
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
ve işte değişkenler olmadan yapabileceğiniz en kısa çağrı:
... -- 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
3 bağımsız değişkeninizin olduğu noktadan veya 2 bağımsız değişken kullandığınızda, biri iki kez kullanılmışsa, zaten nedeniyle nedeniyle bayt kazanıyorsunuz a,b=...
! :)
Neredeyse asla kullanmayın!
İf / elseif / if ifadesinin kullanılmasının üçlü fiyattan daha düşük maliyetli olduğu hiçbir durum yoktur. Böyle bir ifade için kazan çok ağır:
-- exemple with dumb values
if 1>0then v=1 else v=0 end
v=1>0 and 1or 0
Basit bir örnekle, zaten 12 bayt kurtarıyorsunuz, başka şeyler yapmanız gerektiğinde, bu çok daha önemli hale geliyor, bu yüzden bunun farkında olun!
Ayrıca, Lua'daki özel sayılar özeldir , nasıl çalıştıkları konusunda bir şart var, ilgilenenler için, aşağıda açıklayacağım:
Lua'daki üçlüler biçimindedir <condition> and <case true: have to be a true value> or <case false: can be anything>
Her şeyden önce, hadi doğruluk tablosunu görelim or
. A or
, bir işlev olarak düşünülebilir: her zaman bir değer döndürür, işte döndürdüğü değer:
x | y ||x or y
------||-------
0 | 0 || y
0 | 1 || y
1 | 0 || x
1 | 1 || x
Bu üçlüsümüzü inşa etmemize izin veren şeydi.
and
Her zaman dönecektir bize durumunu değerlendirmek için izin ne y
olursa x and y
değerlendirir true.
Bununla ilgili sorun , şart olduğunda geri dönmeyi istiyorsak nil
ya false
da geri dönmek istiyorsak başarısızlığa uğraması false
. Örneğin, aşağıdaki koşulun doğru olmasına rağmen her zaman 5 değerini döndürür.
v = true and false or 5
İşte nasıl çalıştığını açıklamak için bir üçlünün adım adım değerlendirilmesi (bunları yuvalamanız gerektiğinde faydalı olacaktır :))
-- 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