CJam, 77 71 70 69 63 62 bayt
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Tüm karakterler basılabilirdir, bu nedenle kopyala ve yapıştır işleminin iyi çalışması gerekir.
CJam tercümanında çevrimiçi olarak deneyin .
Fikir
Girişteki n rakamlarını inceleyerek ve çıktıyı kaplayacak kadar büyük bir boşluk karesini iterek başlıyoruz . Uygulamada, bu kare iki boyutlu bir karakter karakter dizisi olarak kodlanacaktır.
Basit bir uygulama için 2n + 1 uzunluğunda bir kare doğru olacaktır (yani çevreleyen beyaz alan yoktur), ancak birkaç bayttan tasarruf etmek için 5n uzunluğundan birini kullanacağız . Neyse ki, çevreleyen boşluklara izin verilir.
8'in yedi eğik çizgi temsilinin satırlarını tersine çevirirsek , aşağıdakileri elde ederiz:
\/
\/\
/\
Tüm rakam temsili I, 8-bitlik bir tamsayı olarak kodlanabilir inci bit 0 ı IFF inci karakter bir boşluk ile yerini almak gerekir. 0 - 9 arasındaki rakamlar için
247 208 235 250 220 190 191 240 255 254
aşağıdaki ISO-8559-1 karakterlerine karşılık gelir:
÷Ðëúܾ¿ðÿþ
Giriş, her basamak için, karşılık gelen 8-bit tam sayı seçtikten sonra, biz i tekrar inci temsilinin karakter 8 tam bir ı kez, bir i i inci tam sayı bit. Bu, bir veya sıfır karakterden oluşan bir dizi dizisini iter. Bu diziyi 3 uzunluktaki parçalara bölerek, her bir öğenin temsil çizgisine karşılık geldiği bir dizi elde ederiz.
Şimdi, kareyi temsil eden dizgelerin vectorized maksimumunu ve rakamı temsil eden dizgileri hesaplıyoruz. Dizeler /
ve \
dizgiden daha büyük
, bu nedenle karedeki boşlukları değiştirecekler. Bununla birlikte, boş dize, dizeden daha küçüktür
, bu nedenle basamak temsilindeki boş dizeler karedeki boşlukları korur.
Şimdi aşağıdaki rakam gösterimini karenin uygun kısmına yerleştirmek için satırları ve sütunları iki birim döndürür ve girişte kalan basamaklar için işlemi tekrar ederiz.
Son olarak, her satırı tersine çeviririz ve ayrı sıralar arasına bir satır beslemesi ekleriz.
kod
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.
Son dönmeler, karenin kenar uzunluğu 2n + 3'ten küçükse çıktısını bozacaktır . Yana 5n ≥ 2n + 3 tüm pozitif tamsayılar için n , kare Bunu önlemek için yeterince büyüktür.