Perl6 22/30
Vedrò se Perl6 può dedurre la sequenza per me.
Per fare ciò ho usato il REPL integrato in 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 ...
Vedo il modello dedotto da Perl. Dopo 4 per ottenere il valore successivo basta aggiungere 3.
1,2,4,*+3...*
Ciò consente di salvare un carattere creando il codice per ottenere un elenco infinito di numeri nella sequenza Stöhr lunga 13 caratteri.
Questo codice fa solo qualcosa di utile nel REPL poiché stampa l' essenza del risultato per noi. Per farlo stampare altrimenti dovresti dire esplicitamente a Perl di stampare i risultati.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
è semplicemente un modo per ottenere un riferimento al codice che restituisce 3 aggiunto al suo unico argomento. Altri modi per scrivere sarebbe { $_ + 3 }
, o -> $i { $i + 3 }
, o { $^i + 3 }
o sub ($i){ $i + 3 }
)
Il modo più breve per creare qualcosa di Callable per generare i primi n elementi è quello di ottenere una fetta degli elementi.
{(1,2,4,*+3...*)[^$_]} # 22
Nel vuoto contesto ciò genererebbe i primi $_
valori, quindi li getterebbe via prontamente.
In qualcosa di diverso dal contesto vuoto crea un blocco di codice anonimo (una subroutine di base senza un nome) che accetta un argomento.
# 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;
Se pensi davvero che debba avere un nome per essere considerato valido per questa sfida, probabilmente lo faresti:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Sebbene poiché s
sia utilizzato anche per l'operatore di sostituzione, per chiamare questo i genitori non sono opzionali. (Avresti potuto dargli un nome diverso suppongo)
say s(5);
# 1 2 4 7 10