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 -n
veya -p
anahtarı 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,bar
ve 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 Z
dikkatinizi 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
, .Int
ve .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**@list
ve 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
, grep
vd.
Araçlarla Yani: ziyade yapmak map {my block},list
daha 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, map
ped, grep
ped 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 .any
ve kullanın .all
. Ayrıca .none
kavş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 .