dc , 46 bytes
[[{}]]sx256?^dd3^8d^1-/8092541**r255/BF*+d0=xP
Experimente online!
Entrada em stdin, saída em stdout.
Isso funciona calculando uma fórmula para a saída desejada como um número de base 256. O comando P em dc é usado para imprimir o número da base 256 como uma sequência.
Mais explicações:
Seja n a entrada n. O programa dc calcula a soma de
A = piso (256 ^ n / 255) * 125 (BF é interpretado por dc como 11 * 10 + 15 = 125)
e
B = piso ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Para:
Observe que 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) é igual a (256 ^ n-1) / 255, pela fórmula de uma progressão geométrica, e isso é igual a piso (256 ^ n / 255 ) Portanto, este é o número que consiste em n 1 na base 256.
Quando você o multiplica por 125 para obter A, o resultado é o número que consiste em n 125 na base 256 (é claro que 125 é um dígito na base 256). Provavelmente é melhor escrever os dígitos na base 256 como números hexadecimais; 125 é hexadecimal 7D, então A é o número da base 256 que consiste em n 7Ds seguidos.
B é semelhante:
Desta vez, observe que 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) é igual a (16777216 ^ n - 1) / 16777215, e isso é igual a piso (16777216 ^ n / 16777215).
Agora, 256 ^ 3 = 16777216 e 8 ^ 8-1 = 16777215, então é isso que estamos computando como piso ((256 ^ n) ^ 3 / (8 ^ 8-1)).
A partir da representação geométrica em série, esse número na base 256 é 100100100 ... 1001 com n dos dígitos sendo 1 e o restante dos dígitos sendo 0.
Isso é multiplicado por 8092541, que é 7B7B7D em hexadecimal. Na base 256, este é um número de três dígitos que consiste nos dígitos 7B, 7B e 7D (escrevendo esses dígitos em hexadecimal por conveniência).
Daqui resulta que o produto escrito na base 256 é um número de 3n dígitos que consiste nos 3 dígitos 7B 7B 7D repetidos n vezes.
Isso é multiplicado por 256 ^ n, resultando em um número base-256 de 4n dígitos, consistindo nos 3 dígitos 7B 7B 7D repetidos n vezes, seguidos por n 0's. Isso é B.
A adição de A + B agora gera o número base-256 de 4n dígitos, consistindo nos 3 dígitos 7B 7B 7D repetidos n vezes, seguidos por n 7D's. Como 7B e 7D são os códigos ASCII para {
e}
, respectivamente, essa é a sequência que consiste em n cópias de {{}
seguidas por n cópias de }
, que é exatamente o que queremos para n> 0. O comando P em dc imprime um número base-256 como uma corda, exatamente como precisamos.
Infelizmente, n = 0 deve ser tratado como um caso especial. O cálculo acima produz um resultado de 0 para n = 0; nesse caso, eu apenas codifiquei a impressão da string {}
.