Perl6 22/30
Ich werde sehen, ob Perl6 die Reihenfolge für mich herleiten kann.
Dazu habe ich den in Perl6 eingebauten REPL verwendet
$ 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, ich sehe das Muster, das Perl abgeleitet hat. Nach 4 addieren Sie einfach 3, um den nächsten Wert zu erhalten.
1,2,4,*+3...*
Das spart ein Zeichen, macht den Code, um eine unendliche Liste der Zahlen in der 13 Zeichen langen Stöhr-Folge zu erhalten.
Dieser Code macht nur in der REPL etwas Sinnvolles, da er das Wesentliche des Ergebnisses für uns ausgibt . Um es zum Drucken zu bringen, müssten Sie Perl explizit anweisen, die Ergebnisse zu drucken.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
ist einfach eine Möglichkeit, eine Codereferenz zu erhalten, die 3 zurückgibt, die zu ihrem einzigen Argument hinzugefügt wurde. Andere Möglichkeiten, sie zu schreiben, wären { $_ + 3 }
, oder -> $i { $i + 3 }
, oder { $^i + 3 }
oder. sub ($i){ $i + 3 }
)
Der kürzeste Weg, um Callable zu erstellen , um die ersten n Elemente zu generieren, besteht darin, einen Teil der Elemente abzurufen .
{(1,2,4,*+3...*)[^$_]} # 22
In einem ungültigen Kontext würden die ersten $_
Werte generiert und dann sofort weggeworfen.
In einem anderen Kontext als void wird ein anonymer Codeblock (eine grundlegende Unterroutine ohne Namen) erstellt, der ein Argument enthält.
# 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;
Wenn Sie wirklich der Meinung sind, dass es einen Namen haben muss, um sich für diese Herausforderung zu qualifizieren, würden Sie dies wahrscheinlich tun:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Da dies s
auch für den Substitutionsoperator verwendet wird, sind die Parens nicht optional. (Sie könnten es einen anderen Namen gegeben haben, nehme ich an)
say s(5);
# 1 2 4 7 10