dc、46バイト
[[{}]]sx256?^dd3^8d^1-/8092541**r255/BF*+d0=xP
オンラインでお試しください!
stdinの入力、stdoutの出力。
これは、希望する出力の数式を基数256の数値として計算することで機能します。次に、dcのPコマンドを使用して、base-256番号を文字列として出力します。
詳細な説明:
nを入力nとします。dcプログラムは、以下の合計を計算します
A = floor(256 ^ n / 255)* 125(BFはDCによって11 * 10 + 15 = 125として解釈されます)
そして
B = floor((256 ^ n)^ 3 /(8 ^ 8-1))* 8092541 *(256 ^ n)。
のために:
1 + 256 + 256 ^ 2 + ... + 256 ^(n-1)が(256 ^ n-1)/ 255と等しいことを観察します。これは等比数列の式であり、これはfloor(256 ^ n / 255と等しくなります)。したがって、これは基数256のn個の1で構成される数です。
Aを得るために125を掛けると、結果は基数256のn個の125からなる数になります(125は基数256の1桁の数字です)。おそらく、ベース256の数字を16進数として書く方が良いでしょう。125は16進数の7Dであるため、Aは連続したn個の7Dで構成される256を底とする数値です。
Bも同様です。
今回は、1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^(n-1)が(16777216 ^ n-1)/ 16777215に等しく、これがfloor(16777216 ^ n / 16777215)に等しいことを確認します。
現在、256 ^ 3 = 16777216、および8 ^ 8-1 = 16777215であるため、これはfloor((256 ^ n)^ 3 /(8 ^ 8-1))として計算しています。
幾何級数表現から、基数256のこの数は100100100 ... 1001であり、桁のnは1、残りの桁は0です。
これに8092541が乗算されます。これは16進数の7B7B7Dです。基数256では、これは数字7B、7B、および7Dで構成される3桁の数字です(便宜上、これらの数字を16進数で書きます)。
つまり、ベース256で書かれた製品は、3回の数字7B 7B 7Dからなる3n桁の数字で、n回繰り返されます。
これに256 ^ nを掛けると、n回繰り返される3桁の7B 7B 7Dとそれに続くn個の0で構成される4n桁の基数256の数値になります。それはBです。
A + Bを追加すると、n回繰り返される3桁の7B 7B 7Dで構成された4n桁のbase-256数が得られ、その後にn 7Dが続きます。7Bと7Dはそれぞれ{
とのASCIIコードであるため}
、これはのn個のコピーの{{}
後にn個のコピーが続く文字列です。}
n> 0の場合にまさに必要なものです。必要に応じて文字列として。
残念ながら、n = 0は特別なケースとして扱われなければなりません。上記の計算では、n = 0の場合、結果が0になります。その場合、文字列の印刷をハードコーディングしました{}
。