Perl6 22/30
Zobaczę, czy Perl6 może wydedukować sekwencję dla mnie.
W tym celu wykorzystałem REPL wbudowany w Perl6
$ 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, widzę wzór, który wydedukował Perl. Po 4, aby uzyskać następną wartość, po prostu dodajesz 3.
1,2,4,*+3...*
To oszczędza jeden znak, dzięki czemu kod uzyskuje nieskończoną listę liczb w sekwencji Stöhra o długości 13 znaków.
Ten kod robi tylko coś pożytecznego w REPL, ponieważ drukuje dla nas sedno wyniku. Aby go wydrukować, w przeciwnym razie musisz wyraźnie powiedzieć Perlowi, aby wydrukował wyniki.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
jest po prostu sposobem na uzyskanie odwołania do kodu, które zwraca wartość 3 dodaną do jego jedynego argumentu. Inne sposoby zapisu to { $_ + 3 }
, lub -> $i { $i + 3 }
, lub { $^i + 3 }
lub sub ($i){ $i + 3 }
)
Najkrótsza droga do stworzenia czegoś wywoływalnym do generowania pierwszych n elementów jest dostać kromkę elementów.
{(1,2,4,*+3...*)[^$_]} # 22
W pustym kontekście wygenerowałoby to pierwsze $_
wartości, a następnie je wyrzucił.
W kontekście innym niż void kontekst tworzy anonimowy blok kodu (podstawowy podprogram bez nazwy), który przyjmuje jeden argument.
# 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;
Jeśli naprawdę uważasz, że musi mieć nazwę kwalifikującą się do tego wyzwania, prawdopodobnie zrobiłbyś to:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Chociaż ponieważ s
jest również używany w przypadku operatora podstawienia, wywołanie tego nie jest opcjonalne. (Przypuszczam, że mogłeś nadać mu inną nazwę)
say s(5);
# 1 2 4 7 10