Uyarı : Metin yaklaşıyor. Zamanla topladığım birçok küçük numara.
Çözümlerinizi anonim bloklar olarak yazın
Bu zaten belirtilmişti ama tekrarlamak istiyorum. TIO'da my $f =başlığa, bloğu uygun koda yazabilir ve altbilgiyi a ile başlatabilirsiniz ;. Bu, işi bitirmenin en kısa yolu gibi görünüyor (herhangi bir girdiyi okumayı önemsemeniz gerekmediğinden, argümanlarda size verilmiştir).
Başka bir güzel yol da -nveya -panahtarı kullanmaktır, ancak TIO'da çalışmasını sağlamak için bir yol bulamadım.
Bağımsız değişkenleri iletmek için iki nokta sözdizimini kullanın
Yani, 1 karakter thing.method(foo,bar)yapabilir thing.method:foo,barve kaydedebilirsiniz. Ne yazık ki, bariz nedenlerle sonuçta başka bir yöntem çağıramazsınız, bu nedenle bir bloktaki yalnızca son yöntem için kullanmak mantıklıdır.
Mümkün $_olduğunca kullanın
Bazen tek bir liste argümanı almak bu nedenle birkaç ayrı argümandan daha iyidir. Erişirken $_, yalnızca bir nokta ile başlayarak yöntemleri çağırabilirsiniz: örneğin .sort, eşittir $_.sort.
Bununla birlikte, her bloğun kendine ait olduğunu unutmayın $_, bu nedenle dış bloğun parametreleri iç bloklara yayılmaz. Ana fonksiyonun parametrelerine bir iç bloktan erişmeniz gerekiyorsa, ...
Kullanamıyorsanız ^değişkenleri kullanın$_
Bir ekleme ^desene ve bunun gibi değişken adı arasında: $^a. Bunlar sadece bir blok içinde çalışır. Derleyici, ilk önce blokta bunlardan kaç tanenizi olduğunu sayar, sözlükbilimsel olarak sıralar ve sonra ilk argümanı ilkine, ikincisini ikincisine, vb. Atar. ^Sadece, bir değişken ilk oluşum içinde kullanılır. Bu yüzden {$^a - $^b}2 skaler alır ve çıkarır. Önemli olan tek şey alfabetik düzen, {-$^b + $^a}aynı şey.
Eğer sivri blok sözdizimini (gibi ->$a,$b {$a.map:{$_+$b}}) kullanmak ^istiyorsanız, ana blokta kullanmayacağınız her bir argümanı (gibi {$^b;$^a.map:{$_+$b}}) kullanarak bloğun başlangıcında sahte ifade yazmaktan daha iyi olursunuz (Not) Bu golf oynamak için daha iyi bir yol {$^a.map(*+$^b)}. Sadece konsepti göstermek istedim.)
Operatörler çok güçlüdür ve çoğu zaman işleri halletmenin en kısa yoludur. Özellikle meta operatörleri (bağımsız değişken olarak operatörleri almak operatörler) [], [\], X, <</ >>ve Zdikkatinizi değer. Bir meta-op'un argüman olarak başka bir meta-op alabileceğini unutmayın ( buradaXZ%% kullanmayı başardığım gibi ). Sen kullanabilirsiniz bir harita daha çok daha ucuz olabilen, çok bir yöntem çağrısı için ( yerine , ama dikkat, bunlar aynı değiliz! ). Ve son olarak, bir ikili kullanmadan önce , aynı şeyi çok daha az karakterde yapacağını unutmayın .>>@list>>.method@list.map(*.method)<< >>Z
Birbirine çok fazla meta-op yığarsanız, köşeli parantez kullanarak önceliği belirleyebilirsiniz []. Bu, derleyiciyi karıştırdığı kadar çok operatör yığtığınızda sizi kurtaracaktır. (Bu çok sık gerçekleşmez.)
Son olarak,, Bool, Int veya Str için zorlamak için şeylere gerek yöntemlerini kullanmak istemiyorsanız .Bool, .Intve .Str, daha ziyade operatörleri ?, +ve ~. Ya da daha iyisi, onları Int'ye zorlamak için onları aritmetik bir ifadeye koyun. Bir listenin uzunluğunu almanın en kısa yolu +@list. Bir listenin uzunluğunun gücüne 2 hesaplamak istiyorsanız, sadece söyleyin 2**@listve doğru şeyi yapacak.
Serbest devlet değişkenlerini kullanma $, @ve%
Her blok, her oluşumu $(veya @veya %) yepyeni bir sayısal (veya dizi veya karma) durum değişkeni (değeri devam ederse çağrılar arasında bloğuna bir değişken) karşılık gelir. Kaynak kodda yalnızca bir kez referans verilmesi gereken bir durum değişkenine ihtiyacınız varsa , bu üç arkadaş sizin büyük arkadaşlarınızdır. (Çoğu zaman $.) Örneğin, Ters Matematik Döngüleri yarışmasında, dizinleri dizinin oluşturduğu bir diziden döngüsel olarak seçmek için kullanılabilir $++%6.
Alt formları kullanın map, grepvd.
Araçlarla Yani: ziyade yapmak map {my block},listdaha list.map({my block}). Kullanmayı başarsanız bile list.map:{my block}, bu iki yaklaşım aynı sayıda baytta ortaya çıkar. Ve çoğu zaman, bir yöntemi çağırırken listeyi parantez içine almanız gerekir, ancak bir alt çağırırken değil. Bu nedenle alt yaklaşım her zaman daha iyi veya en azından yöntemle aynı şekilde ortaya çıkar.
Buradaki tek istisna, mapped, grepped vb. Olacak nesnenin bulunduğu zamandır $_. Sonra .map:{}belli ki atıyor map {},$_.
Kullanım kavşakları ( &ve |) yerine &&ve ||.
Açıkçası, onlar 1 byte daha kısadır. Öte yandan, bir boole bağlamına zorlanarak daraltılmaları gerekir. Bu her zaman a ile yapılabilir ?. Burada !op, bool bağlamını zorlayan op, sonucu kullanan ve reddeden bir meta-op'in farkında olmalısınız .
Bir liste var ve kullanmıyorum, bir kavşak çevirmek istiyorsanız [&]ve [|]. Bunun yerine .anyve kullanın .all. Ayrıca .nonekavşak ops tarafından bu kadar kolay taklit edilemez de vardır.
say (3² + 4², 2²⁰, 5⁻²)==> olsa bile Unicode üslerini de kullanabilirsiniz(25 1048576 0.04). Bunun gibi kötüye kullanabileceğiniz Unicode'un tam listesi: docs.perl6.org/language/unicode_texas .