Perl6 22/30
Voy a ver si Perl6 puede deducir la secuencia por mí.
Para hacer eso utilicé el REPL integrado en 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, veo el patrón que dedujo Perl. Después de 4 para obtener el siguiente valor, solo agrega 3.
1,2,4,*+3...*
Lo que ahorra un carácter haciendo que el código obtenga una lista infinita de los números en la secuencia Stöhr de 13 caracteres de longitud.
Este código solo hace algo útil en REPL ya que imprime la esencia del resultado para nosotros. Para que se imprima, de lo contrario, deberá indicarle explícitamente a Perl que imprima los resultados.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
es simplemente una forma de obtener una referencia de código que devuelve 3 agregados a su único argumento. Otras formas de escribirlo serían { $_ + 3 }
, o -> $i { $i + 3 }
, o { $^i + 3 }
o sub ($i){ $i + 3 }
)
La forma más corta de crear algo invocable para generar los primeros n elementos es obtener una porción de los elementos.
{(1,2,4,*+3...*)[^$_]} # 22
En un contexto vacío que generaría los primeros $_
valores, los tiraría rápidamente
En cualquier otra cosa que no sea el contexto vacío, crea un bloque de código anónimo (una subrutina básica sin nombre) que toma un argumento.
# 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 realmente crees que tiene que tener un nombre para calificar como válido para este desafío, probablemente harías esto:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Aunque desde s
también se usa para el operador de sustitución, para llamar a esto, los parens no son opcionales. (Podría haberle dado un nombre diferente, supongo)
say s(5);
# 1 2 4 7 10