PrettyFont'ta bir sayı çıktılayın


13

PrettyFont dediğim yeni bir yazı tipi tasarladım. Mükemmelleştirmek için çok zaman harcadım, ama çalışan bir adam olduğum için bitirmek için zamanım yok. Bu yüzden şu anda sadece 4 karakter içeriyor. Bir gün zengin olduğumda, onu bitirmek yaşam boyu hedefim olacak, ama şimdilik ...

Bu PrettyFont: (0, 1, 2, 3)

####  ##  #### ####
#  #   #  #  #    #
#  #   #    #   ###
#  #   #   #      #
####  ### #### ####

Her karakter 4 piksel genişliğinde ve 5 piksel yüksekliğindedir. Şimdi! Yazdırmak için tasarım göndermeye başlayabilmem için bana PrettyFont'ta bir sayı çıkaran bir program yazmanızı istiyorum.

Kurallar:

Giriş, taban 4'teki bir dize numarasıdır (yalnızca 0-3 karakterleri), örneğin "01321". Program dizede en az 10 karakter işleyebilmelidir. BONUS noktaları, bir dize yerine gerçek bir temel 10 tamsayısını alan programa verilir. AÇIKLAMA DÜZENLEME : tamsayı bonusu, birinin 54321 gibi herhangi bir 10 taban numarasını girebileceği anlamına gelir ve program onu ​​4 tabanına dönüştürür ve çıktı verir (bu durumda 31100301).

Çıktı PrettyFont ile basılan numara olacaktır. Örnek giriş ve çıkış:

> "321"
####
   #
 ###
   #
####

####
#  #
  # 
 #  
####

 ## 
  # 
  # 
  # 
 ###

Programın tek bir satırda çıktı alabileceği devasa bonus:

> "321"
#### ####  ## 
   # #  #   # 
 ###   #    # 
   #  #     # 
#### ####  ### 

'#' Karakteri bir gereklilik değildir ve herhangi bir karakterle değiştirilebilir.

Dikey çıktıda, her PrettyFont karakteri arasında boş bir satır gerekir. Yatay çıktı yapan biri varsa, her PrettyFont karakteri arasında bir boşluk karakteri '' veya bir sekme karakteri gerekir.

Bu kod golf, en kısa kod kazanır! (Kısaca ihtiyacım var çünkü ofis bilgisayarımda depolama alanı sınırlı.)


1
Tam olarak bir kopya değil, ancak bu ve codegolf.stackexchange.com/questions/3628/… arasındaki tek temel fark arama tablosudur.
Peter Taylor

PrettierFont -banner -c '#' 0123
Drake Clarris

1
4 piksel genişliğinde 'M' ile ilgili sorunlar yaşayacaksınız
Cameron MacFarland

10 baz sayısını girdi olarak almak için kaç karakter bonusu vardır?
defhlt

Gerçekten emin değilim. Bunu yapmanın ne kadar zor olabileceği hakkında bir fikir edinmek için biraz daha çözüm görmem gerekiyor. Ben kendimi kod golf çok iyi değilim ... Öneriler takdir!
Accatyyc

Yanıtlar:


11

k ( 118 117 72 71 69 66 karakter)

Henüz golf oynamak için çok çaba göstermedim, ancak çok fazla karakterde istenen yatay çıktıya ulaşmadı:

-1'" "/:'+(5 4#/:4 20#"# "@,/0b\:'0x066609ddd806db00e8e0)"I"$'0:0;

Stdin'den girdi alır, çıktıyı stdout'a yazdırır.

edit: "bitmap" çıktısında bir sıkıştırma biçimi uygulayarak, ben bunu 72'ye düşürdüm. Bitmap şimdi 64bit ints ikiliye dönüştürülerek ve 0s ve 1s "#" veya "" eşleme inşa edilmiştir. Bunu diğer çözümlerden birkaçı gibi hex'ten yapabilirim, ancak bunun daha uzun süreceğini düşünüyorum . Altıgen daha iyi çıkıyor.

012301 için örnek çıktı:

####  ##  #### #### ####  ##
#  #   #  #  #    # #  #   #
#  #   #    #   ### #  #   #
#  #   #   #      # #  #   #
####  ### #### #### ####  ###

// düzenle: -6 karakter


Etkileyici. En kısa kod! Sınırlı depolama sürücüme sığabilir. Aferin.
Accatyyc

Birleştirilmiş kdb + / q / k exe'nin ince bir 392kB ağırlığında olduğu göz önüne alındığında, bu sınırlı depolama sürücünüz için ideal olabilir;)
skeevey

10

Python3 (124)

s=input();[print(*["".join(" #"[0xf171ff429f72226f999f>>(20*int(x)+4*y+i)&1]for i in(3,2,1,0))for x in s])for y in range(5)]

Üzgünüm, dikey benim için ilginç değildi.

???/golf.py
1230012301203012030102301230
 ##  #### #### #### ####  ##  #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### ####
  #  #  #    # #  # #  #   #  #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  #    # #  #
  #    #   ### #  # #  #   #    #   ### #  #   #    #  #  #  ### #  #   #    #  #  #  ### #  #   #  #  #   #   ### #  #   #    #   ### #  #
  #   #      # #  # #  #   #   #      # #  #   #   #   #  #    # #  #   #   #   #  #    # #  #   #  #  #  #      # #  #   #   #      # #  #
 ### #### #### #### ####  ### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### ####

Harika bir tane! Yatay karakter için çok az karakter beklemiyordum. İyi iş.
Accatyyc

1
Teşekkürler. Sanırım Ruby uygulamasında fikrim (onaltılık sayı ve vardiyalar) daha da kısa olmalı.
Ev_genus

10

J, 84 82 81 80 75 69 karakterler

' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487

Klavyeden giriş alır:

   ' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487 63487
0123210
 ####  ##  #### #### ####  ##  ####
 #  #   #  #  #    # #  #   #  #  #
 #  #   #    #   ###   #    #  #  #
 #  #   #   #      #  #     #  #  #
 ####  ### #### #### ####  ### ####

Sihirli numaralar FTW (veya bu durumda ikinci sırada) :-)


Çok hoş ... çok hoş ... Çok etkilendim! Bugün çok iyi cevaplar. Belki de tasarımcı baskılarım iyi olacak.
Accatyyc

Tüm rakamları tek bir ikili sayıya kodlayabilir ve karşılık gelen sayı matrislerini elde etmek için sonuç üzerinde yeniden şekillendirme yapabilirsiniz.
FUZxxl

@FUZxxl Tam 80 bit için sayı bulmaya çalıştım, ancak bu sayı için #:işe yaramadı. #:1166416635908028473935870ve #:1166416635908028473931775ikisi de benim için aynı cevabı veriyor.
Gareth

8

C - 164155 karakter yatay

IDEone'da: http://ideone.com/gljc3

Kod (164 bayt):

i,j;main(){char n[99];gets(n);for(;j<5;++j){for(i=0;n[i];++i)printf("%.4s ","#####  # ##   #  ### #     #"+4*("01110233340135006460"[(n[i]-48)*5+j]-48));puts("");}}

resim açıklamasını buraya girin

DÜZENLEME - 151 bayt

Yorumlardan önerileri ve ardından bazılarını ekledim. Gerçi tam olarak güvenli değil (içinde bulunduğum 0 uzunluklu dizi gets()...).

char i,j=5,n[];main(){for(gets(n);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}

Not i=puts("")ben tedavi ediyorum çünkü tanımsız davranıştır voidolarak int! Sürekli 0MinGW 1sürümüme döner, ancak IDEOne tarafından kullanılan derleyiciye döner .

Ondalık kabul eder, temel 4 çıkışını (167 bayt)

char i,j=5,n[];main(p){for(itoa(atoi(gets(n)),n,4);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}

Ooh, C'de kısa bir tane! Eski CPU'mda bir dakikadan kısa bir süre içinde çalışacak. İyi bir.
Accatyyc

"! = 0" 'ı kaldırarak 3 karakter kaydedemediniz mi?
a3nm

Evet, teşekkürler. Bunu yakalamadım.
Kaslai

Put getsiçinde for(1 kaydet). Dıştaki artışa putsgeçin forve parantezleri kaydedin. Parantezleri kaydedin: (n[i]-48)*5+j-> n[i]*5-240+j, ile aynı hile +4*(...
ugoren

Tamam, 153 bayta kadar. CI için pek fena değil.
Kaslai

7

Ruby, 0123 karakter + bir bonus ('#' ile vs)

f=15
0.upto(4){|n|$*[0].chars{|x|$><<"%4s "%eval(:f6ff929192279241f7ff[x.to_i+4*n]).to_i.to_s(2).tr(?0,' ').tr(?1,x)}
puts}

Misal:

% ruby ./font.rb 01231231
0000  11  2222 3333  11  2222 3333  11  
0  0   1  2  2    3   1  2  2    3   1  
0  0   1    2   333   1    2   333   1  
0  0   1   2      3   1   2      3   1  
0000  111 2222 3333  111 2222 3333  111
% ruby ./font.rb 01231231102020103201301203212302230
0000  11  2222 3333  11  2222 3333  11   11  0000 2222 0000 2222 0000  11  0000 3333 2222 0000  11  3333 0000  11  2222 0000 3333 2222  11  2222 3333 0000 2222 2222 3333 0000 
0  0   1  2  2    3   1  2  2    3   1    1  0  0 2  2 0  0 2  2 0  0   1  0  0    3 2  2 0  0   1     3 0  0   1  2  2 0  0    3 2  2   1  2  2    3 0  0 2  2 2  2    3 0  0 
0  0   1    2   333   1    2   333   1    1  0  0   2  0  0   2  0  0   1  0  0  333   2  0  0   1   333 0  0   1    2  0  0  333   2    1    2   333 0  0   2    2   333 0  0 
0  0   1   2      3   1   2      3   1    1  0  0  2   0  0  2   0  0   1  0  0    3  2   0  0   1     3 0  0   1   2   0  0    3  2     1   2      3 0  0  2    2      3 0  0 
0000  111 2222 3333  111 2222 3333  111  111 0000 2222 0000 2222 0000  111 0000 3333 2222 0000  111 3333 0000  111 2222 0000 3333 2222  111 2222 3333 0000 2222 2222 3333 0000 

EDIT: Ruby, 87 karakter

0.upto(4){|n|$*[0].bytes{|x|$><<"%04b0"%:f6ff929192279241f7ff[x-48+4*n].to_i(16)}
puts}

resim açıklamasını buraya girin


Yaratıcı bir tane! Çok hoş. Bu tasarımlarımda harika görünecek. Bir oy verin.
Accatyyc

Zor! Anlamak için biraz zaman alacak.
manatwork

5

Yakut

Dikey: 116 karakter

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}

Örnek çalışma:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"};$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}'
####
   #
 ###
   #
####

####
#  #
  # 
 #  
####

 ## 
  # 
  # 
  # 
 ###

Yatay: 150 148 karakter

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
o=(0..4).map{""}
$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}}
$><<o*$/

Örnek çalışma:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr "01"," #"};o=(0..4).map{""};$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}};$><<o*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 

Ben böyle kodlayacaktım. Bu benim dilim olsa yenebilir sanmıyorum!
Griffin

4

Mathematica 174 145 139 118 119 123 karakter

Şimdi taban 10'daki girişle çalışır (Tam sayı bonusu). Daha önceki sürümler düzenlemelerde bulunabilir.


ArrayPlot Kullanımı :

İle ArrayPlot1 ve 0'ları doğrudan siyah beyaz karelere dönüştürebiliriz, böylece birkaç karakter kaydedebiliriz. Örneğin, taban 4'te 32022211 olan n = 58021 ile :

i = IntegerDigits; i[n, 4] /. Thread@Rule[0~Range~3, ArrayPlot /@ ((PadLeft[#, 4] & /@ i[#, 2]) & /@ (i@{89998, 62227, 89248, 81718} /. {8 -> 15}))]

tamsayı bonusu


açıklama

Giriş program parametresidir n,.

Sıfır {{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} , altıgen muadili ile veya onlarla gösterilebilir f999f.

, İfadesi, f999f62227f924ff171f{0,1,2,3} numaralarının tümünü görüntülemek için bilgileri tutar. (Not: f999fbelirttiğimiz gibi, kılık değiştirmiş olarak sıfırdır.) Mathematica bunu bir sayı olarak tanımadığı için, 89998622278924881718(dört tamsayı dizgisinde) yerine tamsayı basamaklarını kırdım ve daha sonra kullandım Her yerde 15 bir 8 ortaya çıktı. (Bu, dizeler yerine rakam kullanmamı sağladı.)


1
Çıktınız girdiyle eşleşmiyor.
Bay Lister

Bunu sadece dikey bonus için devredemez misiniz?
Griffin

Kuralları anladığım için, bonus yatay yapılandırma içindir.
DavidC

Bay Lister İyi yakaladın. Sıfır resmini 1 yerine kopyaladım ve yapıştırdım.
DavidC

Kötü, yanlış okudum.
Griffin

3

Mathematica , 112 107 103

David'in yöntemini benim ele alalım.

i=IntegerDigits;Grid/@i@n/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Mathematica grafikleri

105 BONUS ile:

(için n = 54321)

i=IntegerDigits;Grid/@n~i~4/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Mathematica grafikleri


Gerçekten çok iyi. Bonus ile çok az karakter. İyi iş!
Accatyyc

3

APL ( 58 57)

{' #'[1+5 4⍴1022367 401959 1020495 988959[1+⍎⍵]⊤⍨20⍴2]}¨⍞

Çıktı:

0123
 #### ## #### #### 
 # # # # # # 
 # # # # ### 
 # # # # # 
 #### ### #### #### 

2

Python 2.7

Dikey 160

for i in input():print['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]+'\n'

Yatay 234 216

x=[['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n ***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]for i in input()]
for i in range(5):print' '.join([y.split('\n')[i]for y in x])

Her ikisi de girdiyi stdin'de tırnaklı bir dize olarak alır

örnek:
$. / güzel
"0123"


Bunu nasıl yürütüyorsun? Hatalar alıyorum. Python 2: "TypeError: 'int' nesnesi yinelenemez", Python 3: "TypeError: 'builtin_function_or_method' nesnesi abone edilemez".
manatwork

@manatwork Bu python 2.7'de, bunu netleştirmek için cevabı düzenledim.
Matt

@manatwork Ayrıca, sayıları çevrelerinde tırnak işaretleri olmadan girmiş gibi görünebilir, yani: 0123. Stdin'de "0123" girmeyi denemelisiniz.
Matt

Şimdi çalıştıralım. Üzgünüm, bu alıntı hilesi benim için belli değildi.
manatwork

3'ten önceki python sürümlerinde @manatwork input () işlevi girişi bir python ifadesi gibi değerlendirir. Tırnaklar orada değilse, program size bir tamsayı üzerinde yineleme yapmaya çalışır ve size aldığınız hatayı verir.
Matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.