Keluarkan angka dalam PrettyFont

13

Saya telah merancang font baru yang saya sebut PrettyFont. Saya telah meluangkan banyak waktu untuk menyempurnakannya, tetapi karena saya seorang pekerja, saya tidak punya waktu untuk menyelesaikannya. Karena itu hanya berisi 4 karakter sekarang. Suatu hari ketika saya menjadi kaya itu akan menjadi tujuan seumur hidup saya untuk menyelesaikannya, tetapi untuk saat ini ...

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

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

Setiap karakter memiliki lebar 4 piksel dan tinggi 5 piksel. Sekarang! Saya ingin Anda menulis saya sebuah program yang menampilkan nomor di PrettyFont sehingga saya dapat mulai mengirim desain untuk dicetak.

Aturan:

Input adalah nomor string dalam basis 4 (hanya karakter 0-3), misalnya "01321". Program harus dapat menangani setidaknya 10 karakter dalam string. Poin BONUS diberikan kepada program yang mengambil basis 10 integer yang sebenarnya, bukan string. Klarifikasi EDIT : bonus integer berarti bahwa seseorang dapat memasukkan nomor basis 10, seperti 54321, dan program akan mengubahnya menjadi basis 4 dan menghasilkannya (dalam hal ini 31100301).

Outputnya akan menjadi angka yang dicetak dengan PrettyFont. Contoh input dan output:

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

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

 ## 
  # 
  # 
  # 
 ###

Bonus besar untuk program yang dapat menampilkannya dalam mode baris tunggal seperti ini:

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

Karakter '#' bukan keharusan, dan dapat digantikan oleh karakter apa pun.

Dalam output vertikal, baris kosong diperlukan antara setiap karakter PrettyFont. Jika ada yang membuat output horizontal, satu karakter spasi putih '' atau karakter tab diperlukan di antara setiap karakter PrettyFont.

Ini golf kode, kode terpendek menang! (Saya membutuhkannya pendek karena komputer kantor saya memiliki penyimpanan terbatas.)

Accatyyc
sumber
1
Ini bukan duplikat, tetapi satu-satunya perbedaan mendasar antara ini dan codegolf.stackexchange.com/questions/3628/… adalah tabel pencarian.
Peter Taylor
PrettierFont -banner -c '#' 0123
Drake Clarris
1
dengan lebar 4 piksel Anda akan mengalami masalah dengan 'M'
Cameron MacFarland
Berapa banyak bonus untuk mengambil 10 angka dasar sebagai input?
defhlt
Saya tidak begitu yakin. Saya perlu melihat beberapa solusi lagi untuk mendapatkan gambaran betapa sulitnya melakukannya. Saya tidak terlalu pandai kode golf sendiri jadi ... Saran dihargai!
Accatyyc

Jawaban:

11

k ( 118 117 72 71 69 66 karakter)

Saya belum melakukan banyak upaya untuk bermain golf ini tetapi itu mencapai output horizontal yang diinginkan dalam karakter yang tidak terlalu banyak:

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

Mengambil input dari stdin, mencetak output ke stdout.

sunting: Dengan menerapkan bentuk kompresi pada output "bitmap", saya telah menguranginya menjadi 72. Bitmap sekarang dibangun dengan mengubah int 64bit ke biner dan memetakan 0s dan 1s menjadi "#" atau "". Saya bisa melakukannya dari hex seperti beberapa solusi lain tetapi saya pikir ini akan berakhir lebih lama . Ternyata hex lebih baik.

Output sampel untuk 012301:

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

// edit: -6 char

skeevey
sumber
Impresif. Kode terpendek! Mungkin muat di drive penyimpanan terbatas saya. Kerja bagus.
Accatyyc
Turun ke 71. Mengingat bahwa gabungan kdb + / q / k berbobot 392kB, ini mungkin ideal untuk drive penyimpanan terbatas Anda;)
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)]

Maaf, vertikal tidak menarik bagi saya.

???/golf.py
1230012301203012030102301230
 ##  #### #### #### ####  ##  #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### ####
  #  #  #    # #  # #  #   #  #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  #    # #  #
  #    #   ### #  # #  #   #    #   ### #  #   #    #  #  #  ### #  #   #    #  #  #  ### #  #   #  #  #   #   ### #  #   #    #   ### #  #
  #   #      # #  # #  #   #   #      # #  #   #   #   #  #    # #  #   #   #   #  #    # #  #   #  #  #  #      # #  #   #   #      # #  #
 ### #### #### #### ####  ### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### ####
Ev_genus
sumber
Yang keren! Tidak mengharapkan begitu sedikit karakter untuk karakter horizontal. Pekerjaan yang baik.
Accatyyc
1
Terima kasih. Saya kira ide saya (hex-number dan shift) harus lebih pendek dalam implementasi Ruby.
Ev_genus
10

J, 84 82 81 80 75 69 karakter

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

Mengambil input dari keyboard:

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

Angka ajaib FTW (atau untuk tempat kedua dalam kasus ini) :-)

Gareth
sumber
Sangat bagus ... sangat bagus ... Saya terkesan! Banyak jawaban bagus hari ini. Mungkin hasil cetakan desainer saya akan baik-baik saja.
Accatyyc
Anda bisa menyandikan semua digit ke dalam satu nomor biner dan melakukan pembentukan ulang pada hasilnya untuk mendapatkan matriks nomor yang sesuai.
FUZxxl
@ FUZxxl Saya memang mencoba mencari nomor untuk 80 bit penuh, tetapi #:tampaknya tidak berhasil untuk ukuran angka itu. #:1166416635908028473935870dan #:1166416635908028473931775keduanya memberikan jawaban yang sama untuk saya.
Gareth
8

C - 164 151 karakter horisontal

Di IDEone: http://ideone.com/gljc3

Kode (164 byte):

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("");}}

masukkan deskripsi gambar di sini

EDIT - 151 byte

Saya menambahkan saran dari komentar dan kemudian beberapa. Itu tidak sepenuhnya aman (0-length array yang saya gets()masuki ...) sekalipun.

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)));}

Catatan, i=puts("")adalah perilaku yang tidak terdefinisi karena saya memperlakukan voidsebagai int! Secara konsisten kembali 0pada versi saya MinGW, tetapi kembali 1pada penggunaan IDEOne kompiler.

Menerima desimal, basis output 4 (167 byte)

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)));}
Kaslai
sumber
Ooh, yang pendek di C! Itu pasti akan berjalan di bawah satu menit pada CPU lama saya. Bagus
Accatyyc
Tidak bisakah Anda menyimpan 3 karakter dengan menghapus "! = 0"?
a3nm
Ya terima kasih Saya tidak menangkap yang itu.
Kaslai
Masukkan ke getsdalam for(simpan 1). Pindah putske forselisih eksternal dan simpan kawat gigi. Simpan paranthesis: (n[i]-48)*5+j-> n[i]*5-240+j, trik yang sama dengan +4*(...
ugoren
Oke turun ke 153 byte. Tidak terlalu buruk untuk menebak CI.
Kaslai
7

Ruby, 0123 karakter + bonus ([0123] 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}

Contoh:

% 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}

masukkan deskripsi gambar di sini

defhlt
sumber
Yang kreatif! Sangat bagus. Ini akan terlihat luar biasa dalam desain saya. Dapatkan upvote.
Accatyyc
Rumit! Aku butuh waktu untuk memahaminya.
manatwork
5

Rubi

Vertikal: 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}

Contoh dijalankan:

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}'
####
   #
 ###
   #
####

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

 ## 
  # 
  # 
  # 
 ###

Horisontal: 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*$/

Contoh dijalankan:

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*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 
manatwork
sumber
Saya akan menyandikannya seperti itu. Jangan berpikir saya bisa mengalahkan ini bahasa saya sekalipun!
Griffin
4

Mathematica 174 145 139 118 119 123 karakter

Sekarang berfungsi dengan input pada basis 10 (bonus Integer). Versi sebelumnya dapat ditemukan dalam suntingan.


Menggunakan ArrayPlot :

Dengan ArrayPlotkita dapat secara langsung mengkonversi 1 dan 0 ke kotak hitam dan putih, menghemat beberapa karakter dalam proses. Misalnya, dengan n = 58021, yaitu 32022211 pada basis 4:

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

bonus bilangan bulat


Penjelasan

Input adalah parameter program n,.

Nol dapat diwakili oleh {{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} atau oleh mitra hex f999f.

Ekspresi,, f999f62227f924ff171fmenyimpan informasi untuk menampilkan semua angka {0,1,2,3}. (Catatan: dimulai dengan f999f, yang seperti yang kita catat, adalah nol dalam penyamaran.) Karena Mathematica tidak mengenali ini sebagai angka, saya menggunakan 89998622278924881718(dalam empat string bilangan bulat) sebagai gantinya, memecah angka menjadi angka integernya, dan kemudian menggunakan 15 di setiap tempat 8 muncul. (Itu memungkinkan saya menggunakan angka alih-alih string.)

DavidC
sumber
1
Output Anda tidak cocok dengan input.
Tuan Lister
Tidak bisakah Anda memindahkannya untuk bonus vertikal?
Griffin
Seperti yang saya pahami aturannya, bonus untuk konfigurasi horizontal.
DavidC
Tuan Lister Tangkapan yang bagus. Saya menyalin dan menempel gambar nol di tempat 1.
DavidC
Saya salah, salah baca.
Griffin
3

Mathematica , 112 107 103

Pandangan saya tentang metode David.

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

Grafik Mathematica

105 dengan BONUS:

(untuk n = 54321)

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

Grafik Mathematica

Tuan Wisaya
sumber
Memang sangat bagus. Begitu sedikit karakter dengan bonus. Kerja bagus!
Accatyyc
3

APL ( 58 57)

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

Keluaran:

0123
 #### ## #### #### 
 # # # # # # 
 # # # # ### 
 # # # # # 
 #### ### #### #### 
marinus
sumber
2

Python 2.7

Vertikal 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'

Horisontal 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])

Keduanya mengambil input sebagai string yang dikutip pada stdin

contoh:
$. / cantik
"0123"

Mat
sumber
Bagaimana Anda menjalankan ini? Saya mendapatkan kesalahan. Python 2: "TypeError: objek 'int' tidak dapat diubah", Python 3: "TypeError: objek 'builtin_function_or_method' objek tidak dapat disubkripsikan".
manatwork
@manatwork Ini dengan python 2.7, saya telah mengedit jawaban untuk menjelaskannya.
Matt
@manatwork Juga, sepertinya Anda mungkin telah memasukkan angka tanpa tanda kutip di sekitarnya yaitu: 0123. Anda harus mencoba memasukkan "0123" di stdin.
Matt
Sudah bekerja sekarang. Maaf, trik mengutip itu tidak jelas bagi saya.
manatwork
@manatwork dalam versi python sebelum 3 fungsi input () mengevaluasi input seolah-olah itu adalah ekspresi python. Jika tanda kutip tidak ada di sana, program mencoba untuk beralih di atas integer, memberi Anda kesalahan yang Anda dapatkan.
Matt