Perl6 22/30
Je vais voir si Perl6 peut déduire la séquence pour moi.
Pour ce faire, j'ai utilisé le REPL intégré à 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, je vois le motif que Perl a déduit. Après 4 pour obtenir la valeur suivante, vous ajoutez simplement 3.
1,2,4,*+3...*
Ce qui enregistre un caractère faisant le code pour obtenir une liste infinie des nombres dans la séquence de Stöhr de 13 caractères.
Ce code ne fait que quelque chose d'utile dans le REPL car il imprime l' essentiel du résultat pour nous. Pour le faire imprimer autrement, vous devrez explicitement dire à Perl d'imprimer les résultats.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
est simplement un moyen d'obtenir une référence de code qui renvoie 3 ajoutés à son seul argument. D'autres façons de l'écrire seraient { $_ + 3 }
, ou -> $i { $i + 3 }
, ou { $^i + 3 }
ou sub ($i){ $i + 3 }
)
Le moyen le plus court de créer quelque chose Callable pour générer les n premiers éléments est d'obtenir une tranche des éléments.
{(1,2,4,*+3...*)[^$_]} # 22
Dans un contexte vide qui générerait les premières $_
valeurs, puis les jeter rapidement.
Dans tout autre contexte que vide, il crée un bloc de code anonyme (un sous-programme de base sans nom) qui prend un 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;
Si vous pensez vraiment qu'il doit avoir un nom pour être considéré comme valide pour ce défi, vous feriez probablement ceci:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Bien que depuis s
soit également utilisé pour l'opérateur de substitution, pour appeler cela, les parens ne sont pas facultatifs. (Vous auriez pu lui donner un nom différent je suppose)
say s(5);
# 1 2 4 7 10