Perl6 22/30
Perl6'nın diziyi benim için çözüp çözemeyeceğini göreceğim.
Bunu yapmak için Perl6'da yerleşik REPL kullandım
$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...
Hmm, Perl'in çıkardığı modeli görüyorum. 4'den sonra bir sonraki değeri elde etmek için 3 eklersiniz.
1,2,4,*+3...*
13 karakter uzunluğunda Stöhr dizisindeki sayıların sonsuz bir listesini elde etmek için kodu yapan bir karakter kaydeder.
Bu kod, REPL'de sadece bizim için sonucun özünü yazdırdığı için yararlı bir şey yapar . Aksi takdirde yazdırmak için Perl'e sonuçları yazdırmasını açıkça söylemeniz gerekir.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
sadece bağımsız değişkenine eklenen 3 döndüren bir kod başvurusu almanın bir yoludur. Bunu yazmanın diğer yolları { $_ + 3 }
, veya -> $i { $i + 3 }
, veya { $^i + 3 }
veya sub ($i){ $i + 3 }
)
Bir şey oluşturmanın en kısa yolu İlk n öğeyi oluşturmak için çağrılabilir Öğelerin bir dilimini elde etmektir.
{(1,2,4,*+3...*)[^$_]} # 22
İlk $_
değerleri üretecek olan boşluk bağlamında , sonra bunları derhal atın.
Void bağlamından başka bir şeyde, bir argüman alan anonim bir kod bloğu (adsız temel bir alt program) oluşturur.
# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10
# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10
# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;
Bu meydan okuma için geçerli olarak nitelendirilmesi gereken bir isme sahip olduğunu düşünüyorsanız, muhtemelen bunu yaparsınız:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Çünkü olsa s
da bu çağırmak için, ikame operatör için kullanılır parens olmayan isteğe bağlıdır. (Sanırım farklı bir isim vermiş olabilirsiniz)
say s(5);
# 1 2 4 7 10