CJam, 77 71 70 69 63 62 byte
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Tất cả các ký tự đều có thể in được, vì vậy sao chép và dán sẽ hoạt động tốt.
Hãy thử trực tuyến trong trình thông dịch CJam .
Ý tưởng
Chúng tôi bắt đầu bằng cách kiểm tra số chữ số n trong đầu vào và đẩy một hình vuông không gian đủ lớn để bao phủ đầu ra. Trong quá trình thực hiện, hình vuông này sẽ được mã hóa thành một mảng hai chiều của chuỗi một ký tự.
Một hình vuông có chiều dài 2n + 1 sẽ vừa phải (nghĩa là không có khoảng trắng xung quanh) để thực hiện đơn giản, nhưng chúng tôi sẽ sử dụng một chiều dài 5n để lưu một vài byte. Rất may, khoảng trắng xung quanh được cho phép.
Nếu chúng ta đảo ngược các dòng của bảy dấu gạch chéo của 8 , chúng ta có được những điều sau đây:
\/
\/\
/\
Biểu diễn của tất cả các chữ số có thể được mã hóa dưới dạng số nguyên 8 bit, trong đó bit thứ i là 0 nếu ký tự thứ i sẽ được thay thế bằng khoảng trắng. Đối với các chữ số từ 0 đến 9 , các số nguyên kết quả là
247 208 235 250 220 190 191 240 255 254
tương ứng với các ký tự ISO-8559-1 sau đây:
÷Ðëúܾ¿ðÿþ
Đối với mỗi chữ số trong đầu vào, sau khi chọn số nguyên 8 bit tương ứng, chúng tôi lặp lại ký tự thứ i của biểu diễn 8 chính xác một lần i , trong đó a i là bit thứ i của số nguyên. Điều này đẩy một chuỗi các chuỗi có một hoặc không ký tự. Bằng cách chia mảng này thành các đoạn có độ dài 3, chúng ta có được một mảng trong đó mỗi phần tử tương ứng với một dòng của biểu diễn.
Bây giờ, chúng tôi tính toán tối đa vectơ của các chuỗi đại diện cho hình vuông và các chuỗi đại diện cho chữ số. Các chuỗi /
và \
lớn hơn chuỗi
, vì vậy chúng sẽ thay thế các khoảng trắng trong hình vuông. Tuy nhiên, chuỗi rỗng nhỏ hơn chuỗi
, do đó, chuỗi rỗng trong biểu diễn chữ số sẽ giữ nguyên khoảng trắng trong hình vuông.
Bây giờ chúng ta xoay các hàng và cột theo hai đơn vị để đặt biểu diễn chữ số sau vào phần thích hợp của hình vuông và lặp lại quy trình cho các chữ số còn lại trong đầu vào.
Cuối cùng, chúng tôi đảo ngược từng hàng và chèn một dòng cấp giữa các hàng riêng lẻ.
Mã
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.
Các phép quay cuối cùng sẽ làm rối loạn đầu ra nếu chiều dài cạnh của hình vuông nhỏ hơn 2n + 3 . Vì 5n ≥ 2n + 3 cho tất cả các số nguyên dương n , hình vuông đủ lớn để ngăn chặn điều này.