cc , 46 bytes
[[{}]]sx256?^dd3^8d^1-/8092541**r255/BF*+d0=xP
Pruébalo en línea!
Entrada en stdin, salida en stdout.
Esto funciona calculando una fórmula para la salida deseada como un número base-256. El comando P en dc se usa para imprimir el número base-256 como una cadena.
Explicación adicional:
Sea n la entrada n. El programa de cc calcula la suma de
A = piso (256 ^ n / 255) * 125 (DC interpreta el BF como 11 * 10 + 15 = 125)
y
B = piso ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Para:
Observe que 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) es igual a (256 ^ n-1) / 255, por la fórmula para una progresión geométrica, y esto es igual al piso (256 ^ n / 255 ) Entonces este es el número que consiste en n 1 en la base 256.
Cuando lo multiplica por 125 para obtener A, el resultado es el número que consiste en n 125 en la base 256 (125 es un solo dígito en la base 256, por supuesto). Probablemente sea mejor escribir los dígitos en la base 256 como números hexadecimales; 125 es hexadecimal 7D, por lo que A es el número base 256 que consiste en n 7D en una fila.
B es similar:
Esta vez observe que 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) es igual a (16777216 ^ n - 1) / 16777215, y esto es igual al piso (16777216 ^ n / 16777215).
Ahora, 256 ^ 3 = 16777216 y 8 ^ 8-1 = 16777215, así que esto es lo que estamos calculando como floor ((256 ^ n) ^ 3 / (8 ^ 8-1)).
A partir de la representación en serie geométrica, este número en la base 256 es 100100100 ... 1001 con n de los dígitos siendo 1 y el resto de los dígitos siendo 0.
Esto se multiplica por 8092541, que es 7B7B7D en hexadecimal. En la base 256, este es un número de tres dígitos que consta de los dígitos 7B, 7B y 7D (escribir esos dígitos en hexadecimal por conveniencia).
Se deduce que el producto escrito en la base 256 es un número de 3 dígitos que consta de los 3 dígitos 7B 7B 7D repetidos n veces.
Esto se multiplica por 256 ^ n, lo que da como resultado un número base-256 de 4 dígitos, que consta de los 3 dígitos 7B 7B 7D repetidos n veces, seguidos de n 0. Eso es B.
Agregar A + B ahora produce el número de base 256 de 4 dígitos que consta de los 3 dígitos 7B 7B 7D repetidos n veces, seguidos de n 7D. Dado que 7B y 7D son los códigos ASCII para {
y }
, respectivamente, esta es la cadena que consta de n copias de {{}
seguido de n copias de}
, que es exactamente lo que queremos para n> 0. El comando P en dc imprime un número base-256 como una cuerda, tal como la necesitamos.
Desafortunadamente, n = 0 tiene que ser tratado como un caso especial. El cálculo anterior produce un resultado de 0 para n = 0; en ese caso, acabo de codificar la impresión de la cadena {}
.