)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 0o 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 0desse 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 $-1refere-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.