dc , 46 bajtów
[[{}]]sx256?^dd3^8d^1-/8092541**r255/BF*+d0=xP
Wypróbuj online!
Wejście na stdin, wyjście na stdout.
Działa to poprzez obliczenie formuły dla pożądanego wyniku jako liczby podstawowej-256. Komenda P w dc jest następnie używana do wypisania liczby base-256 jako łańcucha.
Dalsze wyjaśnienia:
Niech n będzie wejściem n. Program dc oblicza sumę
A = piętro (256 ^ n / 255) * 125 (BF jest interpretowane przez dc jako 11 * 10 + 15 = 125)
i
B = podłoga ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Dla:
Zauważ, że 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) równa się (256 ^ n-1) / 255 według wzoru dla postępu geometrycznego, a to równa się podłodze (256 ^ n / 255 ). Jest to więc liczba składająca się z n 1 w bazie 256.
Po pomnożeniu go przez 125, aby uzyskać A, wynikiem jest liczba składająca się z n 125 w podstawie 256 (oczywiście 125 jest pojedynczą cyfrą w podstawie 256). Prawdopodobnie lepiej jest zapisać cyfry w bazie 256 jako liczby szesnastkowe; 125 jest szesnastkowym 7D, więc A jest liczbą podstawową-256 składającą się z n 7D z rzędu.
B jest podobny:
Tym razem zauważ, że 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) równa się (16777216 ^ n - 1) / 16777215, a to równa się podłodze (16777216 ^ n / 16777215).
Teraz 256 ^ 3 = 16777216 i 8 ^ 8-1 = 16777215, więc to właśnie obliczamy jako floor ((256 ^ n) ^ 3 / (8 ^ 8-1)).
Z reprezentacji szeregów geometrycznych liczba ta w podstawie 256 wynosi 100100100 ... 1001, gdzie n cyfr to 1, a pozostałe cyfry to 0.
Mnożymy to przez 8092541, czyli 7B7B7D w systemie szesnastkowym. W bazie 256 jest to trzycyfrowa liczba składająca się z cyfr 7B, 7B i 7D (dla wygody zapisuje te cyfry szesnastkowo).
Wynika z tego, że produkt zapisany w bazie 256 jest liczbą 3n cyfr składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy.
Mnoży się to przez 256 ^ n, co daje 4n-cyfrową liczbę podstawową-256, składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy, po których następuje n 0. To jest B.
Dodanie A + B daje teraz 4n-cyfrową liczbę podstawową-256 składającą się z 3 cyfr 7B 7B 7D powtórzonych n razy, a następnie n 7D. Ponieważ 7B i 7D są odpowiednio kodami ASCII {
i }
jest to ciąg składający się z n kopii, {{}
a następnie n kopii }
, co jest dokładnie tym, czego chcemy dla n> 0. Polecenie P w dc wypisuje liczbę podstawową 256 jako ciąg, tak jak potrzebujemy.
Niestety n = 0 należy traktować jako szczególny przypadek. Powyższe obliczenia dają wynik 0 dla n = 0; w takim razie właśnie zakodowałem wydruk napisu {}
.