CJam, 77 71 70 69 63 62 byte
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Semua karakter dapat dicetak, jadi salin dan tempel harus berfungsi dengan baik.
Cobalah online di juru bahasa CJam .
Ide
Kami mulai dengan memeriksa jumlah digit n dalam input dan mendorong kuadrat ruang yang cukup besar untuk menutupi output. Dalam implementasinya, kuadrat ini akan dikodekan sebagai array dua dimensi string satu karakter.
Kuadrat panjang 2n +1 akan tepat (yaitu, tidak ada spasi putih di sekitarnya) untuk implementasi langsung, tetapi kami akan menggunakan salah satu dari panjang 5n untuk menyimpan beberapa byte. Untungnya, ruang putih di sekitarnya diizinkan.
Jika kita membalikkan garis tujuh representasi garis miring 8 , kita memperoleh yang berikut:
\/
\/\
/\
Representasi semua digit dapat dikodekan sebagai bilangan bulat 8-bit, di mana bit ke - 0 adalah jika karakter ke- i harus diganti dengan spasi. Untuk digit 0 hingga 9 , bilangan bulat yang dihasilkan adalah
247 208 235 250 220 190 191 240 255 254
yang sesuai dengan karakter ISO-8559-1 berikut:
÷Ðëúܾ¿ðÿþ
Untuk setiap digit pada input, setelah memilih 8-bit integer yang sesuai, kita ulangi i th karakter representasi 8 tepatnya sebuah i kali, di mana sebuah i adalah i th bit dari integer. Ini mendorong array string baik karakter satu atau nol. Dengan membagi array ini menjadi potongan-potongan dengan panjang 3, kita mendapatkan sebuah array di mana setiap elemen sesuai dengan garis representasi.
Sekarang, kita menghitung maksimum dari string yang mewakili kuadrat dan string yang mewakili digit. String /
dan \
lebih besar dari string
, sehingga mereka akan mengganti spasi di dalam kotak. String kosong, bagaimanapun, lebih kecil dari string
, jadi string kosong dalam representasi digit akan mempertahankan spasi di kotak.
Kami sekarang memutar baris dan kolom dengan dua unit untuk menempatkan representasi digit berikut di bagian yang tepat dari kuadrat dan mengulangi proses untuk digit yang tersisa di input.
Akhirnya, kami membalikkan setiap baris dan menyisipkan umpan baris di antara masing-masing baris.
Kode
r_, e# Read a token from STDIN and push the length of a copy.
5*_ e# Multiply the length by 5 and push a copy.
Sa* e# Repeat the array [" "] that many times.
a* e# Repeat the array [[" " ... " "]] that many times.
\{ e# For each character C in the input:
~ e# Push eval(C), i.e., the digit the character represents.
"÷Ðëúܾ¿ðÿþ"
e# Push the encodings of all 10 seven slash representations.
= e# Select the proper one.
i2b e# Push the resulting characters code point in base 2, i.e., its bits.
S e# Push " ".
"\/"4* e# Push "\/\/\/\/".
+W< e# Concatenate and eliminate the last character.
.* e# Vectorized repetition.
e# For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and " \/\/\/\" on
e# the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].
3/ e# Divide the representation into chunks of length 3, i.e., its lines.
..e> e# Compute the twofold vectorized maximum, as explained above.
2fm> e# Rotate each line to characters to the right.
2m> e# Rotate the lines two units down.
}/
Wf% e# Reverse each line.
N* e# Place linefeeds between them.
Rotasi terakhir akan mengacaukan output jika panjang sisi persegi lebih kecil dari 2n + 3 . Karena 5n ≥ 2n + 3 untuk semua bilangan bulat positif n , kuadratnya cukup besar untuk mencegah hal ini.