ตัวเลข ASCII Art ของชาวมายัน


14

ความท้าทายนี้ง่ายมาก กำหนดตัวเลขให้ส่งออกการแทนค่า ASCII-art ของตัวเลขโดยใช้ระบบตัวเลขฐานมายา 20

ระบบมายาคืออะไร

Mayans ใช้ฐาน 20 เพื่อเก็บตัวเลขดังนั้นตำแหน่งแรกคือตำแหน่ง1ของสถานที่ถัดไป20จากนั้นตามด้วย400s เป็นต้น

ดังนั้นตัวเลขของชาวมายัน1อยู่1ในฐาน 10 แต่10จริง ๆ แล้ว20อยู่ในฐาน 10 207อยู่807ในฐาน 10 เป็นต้น

0และพวกเขาเป็นตัวแทนของตัวเลขของพวกเขาเป็นสัญลักษณ์ที่มีสัญลักษณ์พิเศษ

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

นั่นคือศูนย์ของพวกเขา (อย่างน้อยครึ่ง Picascii ครึ่งอาร์ทีเอของฉันอาร์ตเนสอาร์ต)

นั่นคือภาพที่แท้จริงของสัญลักษณ์มายันศูนย์ 1

นี่คือห้า:

--------------------------------
|                              |
--------------------------------

และ 4:

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  

ในที่สุดเมื่อต้องการรวมเข้าด้วยกัน:

 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

ดังนั้นพวกเขาจึงมีx//5บาร์และx%5จุดที่อยู่ด้านบนของบาร์ และถ้าx=0พวกเขาใช้เชลล์ / ก้อนแทนพื้นที่ว่าง

สำหรับภาพมากขึ้นลองหน้าวิกิพีเดียของภาพมายาจำนวน

19แต่นี้เป็นเพียงตัวเลขขึ้นไป เราไม่ได้รับอนุญาตให้มีมากกว่า4บาร์และ4จุดใน 'เรื่อง' เดียว ... ดังนั้นเราจึงขึ้นไป!

ผลลัพธ์สำหรับ 20 คือ:

 ----
|    |
|    |
 ----



 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 

โปรดทราบว่าโดยปกติจะไม่ถูกต้องเนื่องจากมี1และ0ในเวลาเดียวกัน แต่3(โปรดทราบว่าคำตอบของคุณต้องขึ้นบรรทัดใหม่อย่างน้อย 3) ก่อน0ค่าเฉลี่ยของสถานที่ใหม่

เรื่องราวด้านล่างมีจุดความหมายและความหมายบาร์1 5แต่จริง ๆ แล้วมันมีจุดความหมายและบาร์หมาย20^020^0 * 5

แต่ละเรื่องราวมีพลัง จุดเรื่องที่สองหมายถึง20( 20^1) และ100( 20^1 * 5)

ดังนั้นจำนวน506สามารถแสดงเป็น:

 ----  
|    | 
|    | 
 ----  




--------------------------------
|                              |
--------------------------------




 ----  
|    | 
|    | 
 ----  
--------------------------------
|                              |
--------------------------------

(20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506นี่คือ

ภารกิจของคุณคุณควรเลือกหรือไม่เลือก (ไม่สำคัญ) คือการแสดงผลลัพธ์ ASCII ของหมายเลขฐาน -10

กฎอื่น ๆ :

  • พื้นที่นำหน้า / ส่วนท้ายไม่เป็นไรตราบใดที่จุดแถบและเปลือกยังคงอยู่
  • แถบจุดและเปลือกจะต้องตรงกับที่กรณีทดสอบมี ไม่มีการปรับขนาด
  • นำ '0's ก็โอเค (เปลือกนำบนเอาต์พุต)
  • คุณไม่จำเป็นต้องมีการขึ้นบรรทัดใหม่ 3 ครั้งระหว่างค่าสถานที่หรือเรื่องราวแต่ละแห่งอย่างน้อย 3 บรรทัด

กรณีทดสอบ:

15

--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------  

12

 ----   ----  
|    | |    | 
|    | |    | 
 ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



4

 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  


0

 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- 


24

 ----  
|    | 
|    | 
 ----  




 ----   ----   ----   ----  
|    | |    | |    | |    | 
|    | |    | |    | |    | 
 ----   ----   ----   ----  



33



 ----  
|    |  
|    | 
 ----  




 ----   ----   ----  
|    | |    | |    | 
|    | |    | |    | 
 ----   ----   ----  
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------



20



 ----  
|    | 
|    | 
 ----  




 -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------| 
|                   |
|                   |
 -------------------  

1: พวกเขายังใช้หัวของพระเจ้าสำหรับสัญลักษณ์ แต่สำหรับความท้าทายนี้เปลือก / ขนมปัง / หน้าอก Zeldaจะถูกนำมาใช้


but for this challenge the shell/bread will be used.. ไม่ใช่เปลือกไม่ใช่ขนมปัง ลิงก์ LOZ ไปยังหน้าอกที่ผ่านมา
Bald Bantha


@epicTCK .... ที่เป็นจริงอย่างน่าทึ่งเช่นนั้น ...
Rɪᴋᴇʀ

คำตอบ:


4

ทับทิม, 223 180 177 179 ไบต์

ฟังก์ชั่นไม่ระบุชื่อส่งคืนสตริงหลายบรรทัด

ลืมเพิ่มระยะห่างพิเศษที่จำเป็นและการสอบถามซ้ำ ยังเล่นกอล์ฟอีกเล็กน้อยโดยการขยับสิ่งต่าง ๆ รอบ ๆ

f=->n{s=?|;e=' ';n<20?(n<1?[t=e+d=?-*19,a=s+(e*4+s)*4,a,s+d+s,b=s+e*19+s,b,t]:((r=n%5)>0?[t=" ----  "*r,m="|    | "*r,m,t]:[])+[a=?-*32,s+e*30+s,a]*(n/5))*$/:f[n/20]+$/*5+f[n%20]}

คุณเป็นนักกอล์ฟที่สุด ยินดีด้วย!
Rɪᴋᴇʀ

6

Python 3.5, 404 400 392 312 311 308 290 281 285 281 ไบต์:

( ขอบคุณAdnanสำหรับเคล็ดลับในการบันทึก 9 ไบต์ ( 290->281) และNeilสำหรับเคล็ดลับในการบันทึก 4 ไบต์ ( 285->281)! )

def u(z):
 p=[];P=print;S,N,M,X=' -|\n'
 while not p or z:p+=[z%20];z=z//20
 E=lambda i:(S+N*4+S)*i+X+((M+S*4+M)*i+X)*2+(S+N*4+S)*i+X;F=N*32+X+M+S*30+M+X+N*32+X;[P(S+N*19+S+X+M+((S*4+M)*4+X+M)*2+N*19+M+X+(M+S*19+M+X)*2+S+N*19+S+X*3)if y<1else P(E(y%5)+F*(y//5)+X*3)for y in p[::-1]]

ลองออนไลน์! (Ideone)

การวิเคราะห์

สำหรับวัตถุประสงค์ของการวิเคราะห์นี้เราจะใช้ชุดอักขระ 0123456789ABCDEFGHIJเพื่อแสดงตัวเลขแต่ละตัวในฐาน 20

ดังนั้นฉันจะไปและแปลงฐาน 10 เป็นฐาน 20 โดยใช้หนึ่งในสองอัลกอริทึมที่ฉันมี อัลกอริทึมแรกที่ผมคิดว่าการใช้เป็นสิ่งที่ผมเรียกพลังขั้นตอนวิธี นี่ไม่ใช่สิ่งที่ฉันใช้ในรหัสแม้ว่ามันจะทำให้มันยาวเกินกว่าที่ควรจะเป็นดังนั้นฉันจะไม่พูดถึงเรื่องนี้ อย่างไรก็ตามฉันได้สร้างสคริปต์ไพ ธ อนที่แปลงจำนวนเต็มใด ๆ ในฐาน 10 เป็นฐานอื่น ๆ ที่ให้ไว้โดยใช้วิธีนี้ซึ่งคุณสามารถใช้ที่นี่ใน repl.it สิ่งที่ฉันใช้แทนความท้าทายนี้คือสิ่งที่ฉันเรียกอัลกอริธึมการหารซึ่งฉันคิดว่ามันอธิบายได้ค่อนข้างดีที่นี่. แต่โดยทั่วไปสิ่งที่เกิดขึ้นคือการใช้เลขฐาน 10 ที่ให้มาและหารด้วยฐานที่ต้องการแปลงตัวเลขเป็นซึ่งในกรณีนี้คือ 20 จนกระทั่งส่วนที่เหลือเป็น 0 หรือ 1 จากนั้นก็หารด้วยส่วนที่เหลือ ตามลำดับจากการดำเนินการของแผนกสุดท้ายและส่วนที่เหลือทั้งหมดจากการดำเนินการของแผนกอื่น ๆ ในลำดับจากครั้งสุดท้ายไปก่อน ตัวเลขทั้งหมดเหล่านี้จะถูกรวมเข้าด้วยกันและลำดับการรวมที่ย้อนกลับคือฐาน 10 ของคุณในฐาน 20! เพื่อแสดงสิ่งนี้สมมติว่าคุณต้องการแปลงเลขฐาน 10 431เป็นฐาน 20 ดังนั้นสิ่งที่เราจะทำคือ:

[]=list we will put all remainders and the last quotient in
R = Remainder

1. 431/20 = 21 R11 [B (B=11 in base 20)]
2. 21/20 = 1 R1 [Add the remainder and quotient: B11]

แล้วในที่สุดเราจะใช้รายการที่เรามีซึ่งในกรณีนี้มีB11และย้อนกลับ11Bเพื่อที่ตอนนี้เรามี ในการทำเช่นนี้เราได้รับคำตอบสุดท้ายแล้ว! 431 ในฐาน 10 แปลงเป็นฐาน 20 11Bซึ่งได้รับการยืนยันการใช้สคริปต์หลามของฉันที่ใช้อัลกอริทึมอำนาจซึ่งผมใช้ร่วมกันแล้วเชื่อมโยงไปข้างต้น แต่ผมจะทำมันอีกครั้งที่นี่ นี่คือสิ่งที่ใช้อัลกอริธึมการหารที่อธิบายไว้ในคำตอบนี้และส่งคืนคำตอบเดียวกับพาวเวอร์หนึ่ง

กระบวนการทั้งหมดนี้เป็นหลักสิ่งที่เกิดขึ้นในสคริปต์ของฉันในครั้งนี้วง:while while not p or z:p+=[z%20];z=z//20แตกต่างเพียงว่าตัวเลข>9จะไม่ได้แสดงเป็นตัวอักษร แต่แทนที่จะเป็นตัวเอง

ย้ายหลังจากที่ฐาน 10 จำนวนได้รับการแปลงฐาน 20 สำหรับแต่ละหลักในฐาน 20 จำนวนเต็มซึ่งเราจะเรียกg, g mod 5จุดจะถูกพิมพ์ออกมาแล้วg//5บาร์จะถูกพิมพ์ออกมา จากนั้นโปรแกรมจะพิมพ์บรรทัดว่าง 3 บรรทัดและเลื่อนไปยังตัวเลขถัดไป อย่างไรก็ตามหากตัวเลขเป็นหลักจะ0มีการพิมพ์ "ก้อน" เดี่ยวตามด้วยบรรทัดใหม่ 3 บรรทัดจากนั้นโปรแกรมจะย้ายไปยังตัวเลขถัดไป เอาเลขฐาน 20 11Bเราไปที่หลักแรก หลักแรกเป็น1และดังนั้นจึงจะพิมพ์ 0 บาร์ตั้งแต่1//5=0และ 1 1%5=1จุดตั้งแต่ ดังนั้นเราจะได้สิ่งนี้ก่อน:

 ---- 
|    |
|    |
 ---- 

จากนั้น 3 บรรทัดใหม่ ย้ายไปที่ตัวเลขสองเราก็เห็นว่ามันคือ 1 ดังนั้นมันจะออกมาในสิ่งเดียวกัน:

 ---- 
|    |
|    |
 ---- 

และ 3 บรรทัดใหม่ Bในที่สุดการย้ายเข้าสู่หลักที่ผ่านมาเราจะเห็นว่ามันเป็น ตั้งแต่B=11ในฐาน 20 โปรแกรมเอาท์พุท 1 จะจุดตั้งแต่11%5=1และบาร์ 2 11//5=2ตั้งแต่ ดังนั้นตอนนี้เราได้รับ:

 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

ในที่สุดเมื่อนำทั้งหมดนี้มารวมกันเราจะได้สิ่งนี้:

 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 




 ---- 
|    |
|    |
 ---- 
--------------------------------
|                              |
--------------------------------
--------------------------------
|                              |
--------------------------------

และนั่นคือตัวเลขมายาสำหรับ 431! ในที่สุดคุณก็มีหมายเลขฐาน 10 ของคุณแสดงในฐาน 20 ตัวเลขมายา

หมายเหตุ:คุณอาจสังเกตเห็นว่ามีlambdaฟังก์ชั่นในรหัสของฉันหรือไม่ ฟังก์ชั่นนี้ใช้สำหรับการสร้างจุดเนื่องจากต้องมีเอาต์พุตหลายจุดติดกัน


ฉันไม่แน่ใจว่าเป็นไปได้ แต่คุณสามารถทำS,N,M,X=' -|\n'แทนได้S,N,M,X=' ','-','|','\n'หรือไม่?
Adnan

@Adnan ที่เป็นไปได้
Rɪᴋᴇʀ

@Adnan จริงเหรอ? ว้าวฉันไม่รู้ ขอบคุณ!
R. Kap

401มีศูนย์ภายใน
Neil

@ Neil Oh ถูกต้อง ขอบคุณสำหรับหัวขึ้น. ตอนนี้ได้รับการแก้ไขแล้ว
R. Kap

3

Python 3, 243 ไบต์

s,v,h,x=' |-\n';P=print
t=s+h*19+s+x
def m(n):
 n//20and m(n//20);r=n%20
 if r:
  for a,b,f in[(r%5*' ----  ',r%5*'|    | ',1),('-'*32,'|'+' '*30+'|',r//5)]:P(*((a,b,b,a)*f),sep=x)
 else:P(t+2*(v+(4*s+v)*4+x)+v+h*19+v+x+2*(v+s*19+v+x)+t)
 P(x)

อภิปรายผล

n//20and m(n//20)โทรm()ซ้ำถ้ามีพลังที่สูงกว่า 20 ที่จะจัดการ การสอบถามซ้ำจะเสร็จสิ้นก่อนที่จะพิมพ์ค่าสถานที่ปัจจุบันเพื่อให้สามารถพิมพ์ได้สูงขึ้นก่อน

หากค่าของตำแหน่งปัจจุบันไม่ใช่ศูนย์ (r! = 0) for a,b,f-loop จะพิมพ์หน่วยและตามด้วยห้า aเป็นแถวแรก / แถวbที่สองและแถวที่สาม print(*((a,b,b,a)*f),sep=x)เคล็ดลับคือใน สำหรับหน่วย f = 1 ส่งผลให้print(*(a,b,b,a),sep=x)ซึ่งพิมพ์ 4 แถวที่ประกอบขึ้นเป็นสัญลักษณ์หน่วย (x คือ '\ n') สำหรับ fives f = จำนวนของ fives ที่จะพิมพ์ (r // 5) ดังนั้น tuple (a, b, b, a) จะได้รับการคูณ (เช่นซ้ำ) โดยจำนวน fives ที่จะพิมพ์ ถ้า f = 2 เราจะได้รับprint(*(a,b,b,a,a,b,b,a),sep=x)ซึ่งพิมพ์สองสัญลักษณ์สำหรับห้า

หากค่าสถานที่ปัจจุบันเป็น 0 สัญลักษณ์ศูนย์จะถูกพิมพ์


ฉันต้องให้รางวัลแก่อาร์แคป แต่นี่อาจสมควรได้รับความโปรดปรานของตัวเอง! งานที่ดี!
Rɪᴋᴇʀ

2

Python 411 ไบต์

w,m=input(),[]
for i in[20**i for i in range(int(w**0.25))][::-1]:m.append(w/i);w=w%i
for i in m or[0]:print(lambda x,y='\n',w=' ----  ',z='|    | ':w*(x%5)+y+z*(x%5)+y+z*(x%5)+y+w*(x%5)+y+('-'*32+'\n|'+' '*30+'|\n'+'-'*32+y)*(x/5)if x else''' -------------------
|    |    |    |    |
|    |    |    |    |
|-------------------|
|                   |
|                   |
 ------------------- ''')(i),'\n\n\n'

ฉันสร้างสิ่งนี้เพื่อสร้างกรณีทดสอบคุณสามารถใช้เป็นเกณฑ์มาตรฐานได้ Sorta golfed


คุณสามารถถอดออกได้ 26 ไบต์โดยลบช่องว่างออกและอีก 4 รายการด้วยการs=math.sqrtโทรออกs(s(w))แทนmath.sqrt(math.sqrt(w))
James

@DrGreenEggsandHamDJ ขอบคุณ ฉันไม่คิดว่าฉันได้รับ 26 ไบต์จากที่ว่าง?
Rɪᴋᴇʀ

โอ้ขออภัยการนับข้อผิดพลาดที่ฉันหมายถึง 25 w**0.25ยิ่งกว่าs(s(w))นั้นอีก แม้ว่ามันจะนานขึ้น?
James

@DrGreenEggsandHamDJ ใช่ฉันหายเชลล์สตริงศูนย์ในการขนส่งจากไฟล์ที่จะตอบ
Rɪᴋᴇʀ

2

JavaScript (ES6), 254 ไบต์

f=(n,r=(s,n=19)=>s.repeat(n))=>(n>19?f(n/5>>2)+`


`:``)+(n%5?`${r(s=` ----  `,n%5)}
${t=r(`|    | `,n%5)}
${t}
${s}
`:``)+r(`${s=r(`-`,32)}
|${r(` `,30)}|
${s}
`,n/5&3)+(n%20?``:` ${s=r(`-`)}
${t=r(`|    `,4)}|
${t}|
|${s}|
|${t=r(` `)}|
|${t}|
 ${s}
`)

ฉันไม่สามารถทำงานนี้ได้? Missing } in template expressionมันมีข้อผิดพลาด ฉันไม่รู้ js มากฉันจะแก้ไขได้อย่างไร
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋฉันไม่ดีฉันย้ายรหัสบางส่วนและวางโดยไม่ตั้งใจในสถานที่ที่ไม่ถูกต้อง ตอนนี้ได้รับการแก้ไขแล้ว
Neil

1

Python 3, 213 ไบต์

มากับรุ่นที่สั้นกว่าโดยใช้วิธีการที่แตกต่างกัน:

s,v,h,x=' |-\n'
t=s+h*19+s
k=4*s+v
w=v+4*k
y=v+s*19+v
a=' ----  '
b=v+k+s
c=h*32
d=v+s*30+v
m=lambda n:m(n//20)+([n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4]+n%20//5*[c,d,d,c]if n%20else[t,w,w,v+h*19+v,y,y,t])+[x,x]if n else[]

คำอธิบาย

9 บรรทัดแรกหรือมากกว่านั้นสร้างสตริงที่ใช้สร้างสัญลักษณ์

s,v,h,x = ' |-\n'
k = '    |'

    # parts for a unit
a = ' ----  '
b = '|    | '

    # parts for a five
c = '--------------------------------'
d = '|                              |'

    # parts for a zero
t = ' ------------------- '
w = '|    |    |    |    |'
y = '|                   |'

แกนหลักของการแก้ปัญหาคือฟังก์ชั่นวนซ้ำmซึ่งสร้างรายการของสตริงหนึ่งสตริงสำหรับแต่ละบรรทัดในเอาต์พุต แผนผังmดูเหมือนว่า:

m(n//20) + (ones + fives if n%20 else zero) + [x,x] if n else []

m สามารถเขียนใหม่เช่น:

def m(n):
  if n:
    ans = m(n//20)                             # process high digits first

    if n%20:                                   # if there is a base-20 digit
      ans += [n%5*a,n%5*b,n%5*b,n%5*a][:n%5*4] # add strings for the 'ones' if any
      ans += n%20//5 * [c, d, d, c]            # add strings for the 'fives' if any

    else:
      ans += [t,w,w,v+h*19+v,y,y,t]            # otherwise, add strings for a `zero`

    ans += [x,x]                               # blank lines between digit groups

  else:
    ans = []                                   # base case

  return ans

การเรียกซ้ำm(n//20)เกิดขึ้นก่อนเพื่อให้ตัวเลขที่สำคัญที่สุดถูกทำก่อน

[n%5*a,n%5*b,n%5*b,n%5*a]เป็นสตริงสำหรับสัญลักษณ์ของคน aเป็นแถวบนสุดสำหรับสัญลักษณ์เดียว n%5คือหมายเลขหนึ่งสัญลักษณ์สำหรับหลักนี้ ดังนั้นn%5*aเป็นสตริงสำหรับชั้น (และล่าง) แถวของn%5คน ในทำนองเดียวกัน 'n% 5 * b` เป็นสตริงสำหรับแถวที่ 2 (และ 3)

นิพจน์[:n%5*4]ทำหน้าที่เหมือนifเพื่อหลีกเลี่ยงบรรทัดว่างพิเศษในเอาต์พุตหากไม่มี 'บรรทัด' ใด ๆ ไม่จำเป็น แต่ทำให้ผลลัพธ์ดูดีขึ้น

n%20//5คือจำนวนสัญลักษณ์สำหรับห้าที่จำเป็น [c,d,d,c]เป็นสตริงที่จะทำให้หนึ่งสัญลักษณ์สำหรับห้า

[t,w,w,v+h*19+v,y,y,t] คือสตริงที่จะทำให้สัญลักษณ์เป็นศูนย์

[x,x] ใส่อย่างน้อยสามบรรทัดว่างระหว่างกลุ่มของตัวเลขมายา


คุณสามารถให้คำอธิบายเกี่ยวกับวิธีการทำงานของมันได้หรือไม่?
Rɪᴋᴇʀ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.