Perl6 22/30
Vou ver se o Perl6 pode deduzir a sequência para mim.
Para fazer isso, usei o REPL embutido no 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, eu vejo o padrão que Perl deduziu. Após 4 para obter o próximo valor, basta adicionar 3.
1,2,4,*+3...*
O que salva um caractere criando o código para obter uma lista infinita dos números na seqüência de 13 caracteres de Stöhr.
Esse código só faz algo útil no REPL, pois imprime a essência do resultado para nós. Para imprimi-lo, você teria que dizer explicitamente ao Perl para imprimir os resultados.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
é simplesmente uma maneira de obter uma referência de código que retorna 3 adicionados ao seu único argumento. Outras maneiras de escrevê-lo seriam { $_ + 3 }
, ou -> $i { $i + 3 }
, ou { $^i + 3 }
ou sub ($i){ $i + 3 }
)
A maneira mais curta de criar algo Callable para gerar os primeiros n elementos é obter uma fatia dos elementos.
{(1,2,4,*+3...*)[^$_]} # 22
Em um contexto vazio que geraria os primeiros $_
valores, jogue-os imediatamente fora.
Em qualquer coisa que não seja o contexto nulo, ele cria um bloco de código anônimo (uma sub-rotina básica sem nome) que recebe um 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;
Se você realmente acha que precisa ter um nome para se qualificar como válido para esse desafio, provavelmente faria o seguinte:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Embora como s
também seja usado para o operador de substituição, para chamar isso, os parênteses não são opcionais. (Você poderia ter dado um nome diferente, suponho)
say s(5);
# 1 2 4 7 10