ส่งออกตัวเลขใน PrettyFont


13

ฉันได้ออกแบบแบบอักษรใหม่ที่ฉันเรียกว่า PrettyFont ฉันใช้เวลามากในการทำให้สมบูรณ์แบบ แต่เนื่องจากฉันเป็นคนทำงานฉันไม่มีเวลาทำมันให้เสร็จ ดังนั้นจึงมีเพียง 4 ตัวอักษรในขณะนี้ วันหนึ่งเมื่อฉันรวยขึ้นมันจะกลายเป็นเป้าหมายตลอดชีวิตของฉันที่จะทำให้มันเสร็จ แต่ตอนนี้ ...

นี่คือ PrettyFont: (0, 1, 2, 3)

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

อักขระแต่ละตัวมีความกว้าง 4 พิกเซลและสูง 5 พิกเซล ในขณะนี้! ฉันต้องการให้คุณเขียนโปรแกรมที่ให้ผลเป็นตัวเลขใน PrettyFont เพื่อให้ฉันสามารถเริ่มส่งการออกแบบเพื่อพิมพ์ได้

กฎ:

อินพุตเป็นหมายเลขสตริงในฐาน 4 (เฉพาะอักขระ 0-3) ตัวอย่างเช่น "01321" โปรแกรมควรสามารถจัดการอย่างน้อย 10 อักขระในสตริง คะแนนโบนัสจะถูกกำหนดให้กับโปรแกรมที่รับจำนวนเต็มฐาน 10 จริงแทนที่จะเป็นสตริง แก้ไขคำชี้แจง: โบนัสจำนวนเต็มหมายความว่าเราสามารถป้อนหมายเลขฐาน 10 ใด ๆ เช่น 54321 และโปรแกรมจะแปลงเป็นฐาน 4 และส่งออก (ในกรณีนี้ 31100301)

ผลลัพธ์จะเป็นหมายเลขที่พิมพ์ด้วย PrettyFont ตัวอย่างอินพุตและเอาต์พุต:

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

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

 ## 
  # 
  # 
  # 
 ###

โบนัสมากสำหรับโปรแกรมที่สามารถแสดงผลได้ในแบบแถวเดี่ยวเช่นนี้:

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

อักขระ '#' ไม่ใช่ข้อกำหนดและสามารถแทนที่ด้วยอักขระใดก็ได้

ในเอาต์พุตแนวตั้งจำเป็นต้องมีแถวว่างระหว่างแต่ละอักขระ PrettyFont หากใครสร้างเอาต์พุตในแนวนอนต้องใช้อักขระช่องว่างหนึ่งตัว '' หรือแท็บอักขระระหว่างอักขระ PrettyFont แต่ละตัว

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดชนะ! (ฉันต้องการมันสั้นเพราะคอมพิวเตอร์ในสำนักงานของฉันมีพื้นที่เก็บข้อมูล จำกัด )


1
มันไม่เหมือนกันจริง ๆ แต่ความแตกต่างพื้นฐานเพียงอย่างเดียวระหว่างสิ่งนี้กับcodegolf.stackexchange.com/questions/3628/…เป็นตารางการค้นหา
ปีเตอร์เทย์เลอร์

PrettierFont -banner -c '#' 0123
Drake Clarris

1
ด้วยความกว้าง 4 พิกเซลคุณจะมีปัญหากับ 'M'
Cameron MacFarland

มีตัวอักษรกี่ตัวที่ใช้เป็นฐานในการป้อนข้อมูล 10 ตัว?
กำหนด

ฉันไม่แน่ใจจริงๆ ฉันต้องการเห็นวิธีแก้ไขเพิ่มเติมบางอย่างเพื่อให้ได้แนวคิดว่าจะทำอย่างไรได้ยาก ฉันไม่เก่งเรื่องรหัสกอล์ฟมากนัก ... ชื่นชมคำแนะนำ!
Accatyyc

คำตอบ:


11

k ( 118 117 72 71 69 66 ตัวอักษร)

ฉันยังไม่ได้พยายามมากนักในการเล่นกอล์ฟนี้แต่ก็สามารถบรรลุผลลัพธ์ในแนวนอนที่ต้องการในจำนวนตัวอักษรไม่มากเกินไป:

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

รับอินพุตจาก stdin พิมพ์เอาต์พุตไปที่ stdout

แก้ไข: โดยการใช้รูปแบบการบีบอัดในผลลัพธ์ "บิตแมป" ฉันได้ลดลงเป็น 72 บิตแมปถูกสร้างขึ้นโดยการแปลง 64 บิต ints เป็นไบนารี่และแมป 0s และ 1s เป็น "#" หรือ "" ฉันจะทำมันออกมาจากฐานสิบหกเช่นไม่กี่ของการแก้ปัญหาอื่น ๆ แต่ผมคิดว่าเรื่องนี้จะจบลงได้อีกต่อไป กลายเป็น hex จะดีกว่า

เอาต์พุตตัวอย่างสำหรับ 012301:

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

// แก้ไข: -6 อักขระ


ประทับใจ รหัสที่สั้นที่สุด! มันอาจพอดีกับไดรฟ์จัดเก็บข้อมูลที่ จำกัด ของฉัน ทำได้ดีมาก
Accatyyc

ลงไปที่ 71 ระบุว่าการรวม kdb + / q / k exe มีน้ำหนักที่บาง 392kB นี่อาจเหมาะสำหรับไดรฟ์เก็บข้อมูลที่ จำกัด ของคุณ;)
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)]

ขออภัยแนวตั้งไม่น่าสนใจสำหรับฉัน

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

ยอดเยี่ยม! ไม่ได้คาดหวังว่าจะมีตัวละครน้อยในแนวนอน งานที่ดี.
Accatyyc

1
ขอบคุณ. ฉันคิดว่าความคิดของฉัน (เลขฐานสิบหกและกะ) ควรจะสั้นลงในการนำ Ruby ไปใช้
Ev_genus

10

J, 84 82 81 80 75 69 ตัวอักษร

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

รับอินพุตจากคีย์บอร์ด:

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

ตัวเลข Magic FTW (หรือที่สองในกรณีนี้) :-)


ดีมาก ... ดีมาก ... ฉันประทับใจ! คำตอบที่ดีมากมายในวันนี้ บางทีงานพิมพ์ของฉันอาจจะไม่เป็นไร
Accatyyc

คุณสามารถเข้ารหัสตัวเลขทั้งหมดเป็นเลขฐานสองและทำการเปลี่ยนรูปร่างเพื่อให้ได้เมทริกซ์จำนวนที่สอดคล้องกัน
FUZxxl

@FZZxxl ฉันพยายามค้นหาหมายเลขสำหรับ 80 บิตเต็ม แต่#:ดูเหมือนจะไม่ทำงานกับขนาดของตัวเลขนั้น #:1166416635908028473935870และ#:1166416635908028473931775ทั้งคู่ก็ให้คำตอบเดียวกันกับฉัน
Gareth

8

C - 164 151 ตัวอักษรแนวนอน

บน IDEone: http://ideone.com/gljc3

รหัส (164 ไบต์):

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

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข - 151 ไบต์

ฉันเพิ่มข้อเสนอแนะจากความคิดเห็นแล้วบางส่วน มันไม่ปลอดภัยอย่างแน่นอน (อาร์เรย์ความยาว 0 ที่ฉัน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)));}

หมายเหตุi=puts("")เป็นพฤติกรรมที่ไม่ได้กำหนดไว้ตั้งแต่ฉันรักษาvoidเป็นint! มันส่งคืน0MinGW เวอร์ชันของฉันอย่างสม่ำเสมอแต่มันกลับมา1ที่คอมไพเลอร์ IDEOne ที่ใช้

ยอมรับทศนิยมฐานเอาท์พุต 4 (167 ไบต์)

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! ที่จะทำงานภายในไม่กี่นาทีบน CPU ตัวเก่าของฉัน สิ่งที่ดี.
Accatyyc

คุณไม่สามารถบันทึก 3 ตัวอักษรโดยการลบ "! = 0"
a3nm

ใช่ขอบคุณ ฉันไม่ได้จับอันนั้น
Kaslai

ใส่getsภายในfor(บันทึก 1) ย้ายputsไปที่ส่วนเพิ่มภายนอกforและบันทึกวงเล็บปีกกา บันทึกวงเล็บ: (n[i]-48)*5+j-> เคล็ดลับเช่นเดียวกันกับn[i]*5-240+j +4*(..
ugoren

ตกลงลงมาที่ 153 ไบต์ ไม่เลวสำหรับ CI เดา
Kaslai

7

ทับทิม0123ตัวอักษร + โบนัส ([0123] เทียบกับ '#')

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}

ตัวอย่าง:

% 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 

แก้ไข: Ruby, 87 chars

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

ป้อนคำอธิบายรูปภาพที่นี่


โฆษณาที่สร้างสรรค์! ดีมาก. นี่จะดูเหลือเชื่อในการออกแบบของฉัน มี upvote
Accatyyc

หากิน! จะใช้เวลาพอสมควรในการทำความเข้าใจ
จัดการ

5

ทับทิม

แนวตั้ง: 116 อักขระ

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}

วิ่งตัวอย่าง:

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

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

 ## 
  # 
  # 
  # 
 ###

แนวนอน: 150 148 ตัวอักษร

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

วิ่งตัวอย่าง:

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*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 

ฉันจะเข้ารหัสมันแบบนั้น อย่าคิดว่าฉันสามารถเอาชนะนี่เป็นภาษาของฉันได้!
กริฟ

4

Mathematica 174 145 139 118 119 123 ตัวอักษร

ตอนนี้ทำงานกับอินพุตในฐาน 10 (โบนัสจำนวนเต็ม) รุ่นก่อนหน้านี้สามารถพบได้ในการแก้ไข


ใช้ ArrayPlot :

ด้วยการที่ArrayPlotเราสามารถแปลง 1 และ 0 เป็นสี่เหลี่ยมจัตุรัสสีดำและสีขาวได้โดยตรงช่วยประหยัดสองสามตัวอักษรในกระบวนการ ตัวอย่างเช่นด้วย n = 58021 ซึ่งคือ32022211ในฐาน 4:

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

โบนัสจำนวนเต็ม


คำอธิบาย

อินพุตคือพารามิเตอร์โปรแกรม, n.

ศูนย์สามารถแสดงด้วยหรือคู่ฐานสิบหก{{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} f999f

นิพจน์,, f999f62227f924ff171fเก็บข้อมูลเพื่อแสดงตัวเลขทั้งหมด {0,1,2,3} (หมายเหตุ: มันเริ่มต้นด้วยf999fซึ่งเราสังเกตเห็นว่าเป็นศูนย์ในการปลอมตัว) เนื่องจาก Mathematica ไม่รู้จักสิ่งนี้เป็นตัวเลขฉันจึงใช้ 89998622278924881718(ในสี่จำนวนเต็มสตริง) แทนแบ่งตัวเลขเป็นตัวเลขจำนวนเต็มแล้วจึงใช้ 15 ในทุก ๆ ที่ที่ปรากฏ 8 (นั่นทำให้ฉันสามารถใช้ตัวเลขแทนสตริงได้ตลอด)


1
เอาต์พุตของคุณไม่ตรงกับอินพุต
นาย Lister

คุณไม่สามารถแปลงให้เป็นโบนัสแนวตั้งได้หรือไม่
กริฟ

ตามที่ฉันเข้าใจกฎโบนัสสำหรับการกำหนดค่าแนวนอน
DavidC

นายลิสเตอร์จับดี ฉันคัดลอกและวางรูปภาพของศูนย์ในตำแหน่ง 1
DavidC

ฉันอ่านผิด
กริฟ

3

Mathematica , 112 107 103

ฉันใช้วิธีของดาวิด

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

กราฟิกทางคณิตศาสตร์

105 กับโบนัส:

(สำหรับn = 54321)

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

กราฟิกทางคณิตศาสตร์


ดีมากจริงๆ ตัวละครน้อยมากพร้อมโบนัส การทำงานที่ดี!
Accatyyc

3

APL ( 58 57)

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

เอาท์พุท:

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

2

Python 2.7

แนวตั้ง 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'

แนวนอน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])

ทั้งสองรับอินพุตเป็นสตริงที่ยกมาบน stdin

ตัวอย่าง:
$. / pretty
"0123"


คุณทำงานนี้ได้อย่างไร ฉันได้รับข้อผิดพลาด Python 2: "TypeError: วัตถุ 'int' ไม่สามารถทำซ้ำได้" Python 3: "TypeError: 'builtin_function_or_method' วัตถุไม่สามารถถอดรหัสได้"
จัดการ

@ การทำงานนี้อยู่ใน python 2.7 ฉันได้แก้ไขคำตอบเพื่อให้ชัดเจน
แมตต์

@Manatwork ดูเหมือนว่าคุณอาจป้อนหมายเลขโดยไม่ต้องใส่เครื่องหมายคำพูดล้อมรอบเช่น: 0123 คุณควรลองใส่ "0123" บน stdin
แมตต์

ทำให้มันทำงานตอนนี้ ขออภัยเคล็ดลับการอ้างนั้นไม่ชัดเจนสำหรับฉัน
จัดการ

@ manatwork ในเวอร์ชัน python ก่อน 3 ฟังก์ชัน input () ประเมินค่าอินพุตเหมือนกับเป็นนิพจน์ของ python หากไม่มีเครื่องหมายคำพูดอยู่โปรแกรมจะพยายามวนซ้ำจำนวนเต็มเพื่อแจ้งข้อผิดพลาดที่คุณได้รับ
แมตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.