)K`0
"$+"+¶<`.+
$.(*__2*$-1*
Experimente online!
Com base em 0, então a entrada n fornece os primeiros n + 1 resultados.
Explicação
Usa a recursão do OEIS:
a(n) = a(n-1) + 2*a(n-2) + 1
Vamos seguir o programa:
)K`0
Este é um estágio constante: descarta a entrada e define a cadeia de trabalho como 0
o valor inicial da sequência. O )
quebra esta fase em um grupo. Esse grupo em si não faz nada, mas quase todas as etapas (incluindo as de grupo) registram o resultado em um log, e precisaremos de duas cópias 0
desse log para que o programa funcione.
"$+"+¶<`.+
$.(*__2*$-1*
Há várias configurações aqui: "$+"+
envolve o palco em um loop. O "$+"
é tratado como uma substituição e $+
refere-se à entrada do programa, ou seja, n . Isso significa que o loop é executado n vezes.
Em seguida, ¶<
agrupa cada iteração em um estágio de saída, que imprime a entrada do estágio com um avanço de linha à direita (para que a primeira iteração imprima o zero, a segunda iteração imprima o resultado da primeira iteração e assim por diante).
O estágio em si substitui toda a cadeia de trabalho pela substituição na última linha. Esse utiliza um parêntese de fechamento implícito e argumentos implícitos para o operador de repetição *
, portanto, é realmente a abreviação de:
$.($&*__2*$-1*_)
O material dentro dos parênteses pode ser dividido em três partes:
$&*_
: fornece uma sequência de a (n-1) _
s.
_
: dá um único _
.
2*$-1*_
: fornece uma sequência de 2 * a (n-1) _
. O $-1
refere-se ao penúltimo resultado no log de resultados, ou seja, a iteração do loop antes do último. É por isso que precisamos fazer cópias do zero no log, caso contrário, isso se refere à entrada do programa na primeira iteração.
Em seguida, $.(…)
mede o comprimento da sequência resultante. Em outras palavras, calculamos a(n) = a(n-1) + 1 + 2*a(n-2)
passando por unário (na verdade, não: $.(…)
é preguiçoso e, na verdade, não avalia seu conteúdo, se é possível determinar o comprimento resultante diretamente por meio da aritmética, portanto isso é bastante eficiente).
O resultado da iteração final do loop (o n + 1 o elemento da sequência) é impresso devido à saída implícita de Retina no final do programa.