Casciitum Scribe


23

บทนำ

Cacti มีหลายขนาดรูปร่างและสีที่แตกต่างกัน อย่างไรก็ตามต้นกระบองเพชรที่โดดเด่นที่สุดและต้องมีในทุกเวสเทิร์จะต้องเป็นsaguaro Saguaroคุณสมบัติที่สำคัญคือขนาดและแขนของมันซึ่งได้กำหนดลักษณะแคคตัสโปรเฟสเซอร์ไว้

งานของคุณคือนำ saguaro มาสู่โลก ASCII อย่างไรก็ตาม - เหมือนในโลกแห่งความเป็นจริง - ไม่มี saguaro เหมือนโปรแกรมอื่นดังนั้นโปรแกรมของคุณจะต้องสามารถสร้าง saguaros ด้วยการปรับแต่งแขนที่แตกต่างกัน

ตัวอย่าง saguaro

  • อินพุต: [0b10, 0b11](เป็น[2, 3]ทศนิยม, ความยาวของอินพุต2)
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

ข้อมูลจำเพาะ

Saguaro มักจะมีฐานและส่วนบนเสมอโดยมีจำนวนลำต้นแตกต่างกันไป ส่วนของก้านไม่สามารถมีแขน, แขนด้านขวา, หนึ่งในด้านซ้ายหรือสองแขน

รูปแบบการเติบโตของ Saguaro นั้นเป็นรายการอินพุตที่มีค่าสองบิต 00หมายถึงไม่มีแขน, 01แขนด้านขวา, 10แขนด้านซ้ายและ11สองแขน (ทั้งหมดในไบนารี) ความยาวของรายการอินพุตกำหนดความสูงของ saguaro

ส่วน Saguaro มีลักษณะดังนี้ ส่วนต้นกระบองเพชรล้อมรอบด้วย octothorps #เพื่อความชัดเจนที่จะไม่ถูกพิมพ์ออกมา
ความสูงของ Saguaro อยู่เสมอเท่ากับตัวอักษรสำหรับจำนวนเต็มไม่ติดลบ4+6*kk

#############
#     _     # Saguaro top
#    / \    #
#############
# _  | |  _ # Stem, both arms
#/ \ | | / \# Stem id: 11
#| | | | | |#
#\ \_| |_/ /#
# \__   __/ #
#    \ /    #
#############
# _  | |    # Stem, left arm
#/ \ | |    # Stem id: 10
#| | | |    #
#\ \_| |    #
# \__  |    #
#    \ |    #
#############
#    | |  _ # Stem, right arm
#    | | / \# Stem id: 01
#    | | | |#
#    | |_/ /#
#    |  __/ #
#    | /    #
#############
#    | |    # Stem, no arms
#    | |    # Stem id: 00
#    | |    #
#    | |    #
#    | |    #
#    | |    #
#############
#    | |    # Saguaro base
#    | |    #
#############

อินพุต

ตามที่กล่าวไว้ก่อนหน้านี้อินพุตประกอบด้วยรายการค่าสองบิต (เป็น0, 1, 2, 3ทศนิยม) สามารถให้ในรูปแบบที่เหมาะสม องค์ประกอบแรกของรายการสอดคล้องกับส่วนลำต้นสูงสุดของ saguaro องค์ประกอบที่สองกับส่วนลำต้นสูงสุดอันดับสอง ฯลฯ
หากคุณต้องการคุณสามารถกำหนดความยาวของรายการอินพุตให้เป็นอินพุตเพิ่มเติมได้ โปรดระบุในคำตอบของคุณถ้าคุณทำเช่นนั้น

เอาท์พุต

ASCII saguaro เอาท์พุทของคุณควรสร้างโดยใช้ส่วนสเต็มที่แน่นอนตามที่อธิบายไว้ข้างต้น ช่องว่างต่อท้ายบนบรรทัดและบรรทัดใหม่ต่อท้ายจะถูกละเว้น คุณสามารถพิมพ์ได้มากขึ้นน้อยลงหรือมากตามที่ระบุไว้ข้างต้น

กฎระเบียบ

กรณีทดสอบ

  • ค่าผิดปกติ การป้อนข้อมูล:[0b01, 0b00, 0b01, 0b11]
     _     
    / \    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • สลับแขน การป้อนข้อมูล:[0b10, 0b01, 0b10]
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |    
    | |    

  • แขนที่อุดมสมบูรณ์ การป้อนข้อมูล:[0b11, 0b11]
     _     
    / \    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • ไม่มีแขนหรือที่เรียกว่าหอก การป้อนข้อมูล:[0b00]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • ไม่มีร่างกายบางคนเรียกมันว่ากระบองเพชรเล็ก การป้อนข้อมูล:[]
     _     
    / \    
    | |    
    | |    


ฉันจะรับอินพุตเป็นจำนวนชิ้นส่วนแล้วแต่ละหมายเลขแยกกันได้หรือไม่ (เช่นกรณีทดสอบที่ 1 จะเป็น4 1 0 1 3)
dzaima

เราจะเพิกเฉยช่องว่างต่อท้ายได้ไหม?
Brian H.

@dzaima คุณอาจ
Jonathan Frech

@BrianH ใช่; ช่องว่างต่อท้ายจะถูกละเว้นในทุกบรรทัด
Jonathan Frech

คำตอบ:


10

ถ่าน , 50 49 ไบต์

↘_\¶/F²«J¹¦²Fθ¿﹪÷Iκ⁺¹ι²”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”↓⁶↓²‖T

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน คำอธิบาย:

↘_\¶/

วาดส่วนบน

F²«

วนรอบแต่ละด้าน

J¹¦²

ข้ามไปที่ใต้ขวาของด้านบน

Fθ

วนรอบแต่ละส่วนของก้าน

¿﹪÷Iκ⁺¹ι²

ทดสอบว่ามีแขนหรือไม่

”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”

ถ้าเป็นเช่นนั้นพิมพ์แขน

↓⁶

มิฉะนั้นเพียงพิมพ์เส้นแนวตั้ง

↓²

หลังจากพิมพ์ก้านให้พิมพ์ฐาน

‖T

สะท้อนความพร้อมที่จะวาดอีกด้านหนึ่ง เมื่อทั้งสองฝั่งถูกดึงออกด้านข้างจะสะท้อนกลับไปยังตำแหน่งสุดท้าย


7

JavaScript (ES6), 210 ไบต์

ฉันใช้เวลานานเกินไปในการแก้ปัญหาอื่นก่อนที่จะรู้ว่ามีวิธีที่ดีกว่าซึ่งไม่ได้ทำให้ฉันเสียเวลามากเท่าที่ฉันจะชอบที่จะทำงานเกี่ยวกับเรื่องนี้

a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${`| `[x]} ${`| `[y]}224
    ${`|\\`[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+`|/`[y],s=`
    | |`).join``+s+s

ลองมัน

o.innerText=(f=
a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${"| "[x]} ${"| "[y]}224
    ${"|\\"[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+"|/"[y],s=`
    | |`).join``+s+s
)(i.value=["11","10","01","00"]);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


ในการที่แท้จริง00,01,10,11เป็น input 0,1,2,3แทนการป้อนข้อมูลไบนารีหรือ ใช้กรณีทดสอบ OP สิ่งนี้ล้มเหลว
Brian H.

@BrianH: การอ้างถึงข้อมูลจำเพาะของความท้าทายเกี่ยวกับอินพุต: " สามารถให้ในรูปแบบที่สมเหตุสมผล "
Shaggy

1
แต่จะระบุ "อินพุตประกอบด้วยรายการค่าสองบิต (0, 1, 2, 3 เป็นทศนิยม)" ขวาก่อนที่ ... (BTW im ไม่ downvoting หรือ anythin นี้เป็นคนฉลาดเมามันก็เพียงว่าต่อการตีความของฉันของกฎการป้อนข้อมูลที่ไม่ตรงกับ)
ไบรอันเอช


3

Python 2 , 256 253 ... 205 203 199 ไบต์

r=[('     _',''),('/','\ ')]
for a in input()+[0]:r+=zip(*[['|'*6,'_|    |_,,/|  \/  |\,,||  ||  ||,,\| _\/_ |/,,\ ____ /,,\/'[i::2].split(',')][2-i&a>0]for i in 0,1])
for l in r[:-4]:print'%5s %s'%l

ลองออนไลน์!


เช่นเดียวกับที่คุณทำกับตัวอักษรสตริงอื่น ๆ ในบรรทัดแรกคุณสามารถละเว้นเครื่องหมายแบ็กสแลช
Jonathan Frech

ดูเหมือนว่าคุณสามารถบันทึก 18 ไบต์โดยการลบช่องว่างต่อท้ายทั้งหมด
Shaggy

for ...:\n r...\n r...-> for ...:r...;r...บันทึกสามไบต์
Jonathan Frech

1

PowerShell , 235 ไบต์

param($a)'     _
    / \'
($a|%{((,'1|'*6),('1|  _
1| / \
1|2
1|_/ /
1 __/ 
1/'),(' _ 2
/ \2
| |2
\ \_| |
 \__  |
    \ |'),(' _ 2  _
/ \2 / \
| |22
\ \_| |_/ /
 \__   __/
    \ /'))[$_]})-replace1,'    | '-replace2,' | |'
,'    | |'*2

ลองออนไลน์!

PowerShell ไม่ได้mapหรือzipหรือเป็นวิธีที่ง่ายจริงที่จะย้อนกลับสตริงดังนั้นเราจะเหลืออะไรอย่างอื่น - เปลี่ยนที่เรียบง่ายของส่วนที่ซ้ำแล้วซ้ำอีก

สองบรรทัดแรกรับข้อมูลเป็นอาร์เรย์ของจำนวนเต็มและส่งออกด้านบนของต้นกระบองเพชร จากนั้นเราวนซ้ำผ่าน$aและเลือกเป็นอาร์เรย์ของสี่สายอักขระตามค่าปัจจุบัน สตริงเหล่านั้นจะถูกทิ้งไว้บนไปป์ไลน์จากนั้นเราใช้ของเรา-replaceเพื่อเติมเต็มในจุดที่เหมาะสม จากนั้นเราก็ใส่ก้นแคคตัสลงไปในท่อเช่นกัน

ทุกอย่างถูกรวบรวมจากไปป์ไลน์และWrite-Outputเกิดขึ้นโดยปริยายเมื่อโปรแกรมเสร็จสมบูรณ์แทรกบรรทัดใหม่ระหว่างทุกองค์ประกอบ


1

05AB1E , 76 75 ไบต์

„ _…/ \‚4ú»,v6F'|4ú"_ |/\"•Aö¡Èèj{^ë•5вèJ5ôNè©‚y1›èð'|®∞2äθ‚yÉèJ,}}„| 4úû=,

ลองออนไลน์!


1
ฉันกำลังพยายามที่จะเอาชนะคุณด้วยความสงสัย
Magic Octopus Urn

@ MagicOctopusUrn: โชคดี! หวังว่าคุณจะจัดการมัน (และอาจเปลี่ยนเป็นความชุลมุน: P)
Emigna

หนึ่งในความคิดที่ดีที่จะเอาชนะสิ่งนี้ถูกบีบอัดโดยชอบ 30 ไบต์ b / c ของคำสั่งที่ฉันโพสต์ในการแชท "โอเอซิส / 05AB1E" สนามกอล์ฟที่ดีถ้าฉันลองตอนนี้มันใกล้เกินไปแล้ว
Magic Octopus Urn

1

Java (OpenJDK 8) , 626 566 499 466 398 312 310 308 ไบต์

สามารถตีกอล์ฟได้หนึ่งตัน

a->{String r=" |,",g="    |",n="     _,    / \\,";boolean j,k;for(int e:a)n+=((k=e>1)?" _  |":g)+((j=e%2>0)?" |  _,":r)+(k?"/ \\ |":g)+(j?" | / \\,":r)+(k?"| | |":g)+(j?" | | |,":r)+(k?"\\ \\_|":g)+(j?" |_/ /,":r)+(k?" \\__ ":g)+(j?"  __/,":r)+(k?"    \\":g)+(j?" /,":r);return(n+g+r+g+r).replace(",","\n");}

ลองออนไลน์!


1
คุณสามารถบันทึก 2 ไบต์โดยการเปลี่ยน{j=e>1;k=e%2>0;n+=(k?" _ |":g)+(j?" | _,":r)+ไปn+=((k=e%2>0)?" _ |":g)+((j=e>1)?" | _,":r)+และลบปิด}ของสำหรับวงได้เป็นอย่างดี
Kevin Cruijssen

คุณมี "แขน" ทางที่ผิด 'รอบและ1 2
Shaggy

0

SOGL V0.12 , 56 54 53 ไบต์

5⁷yΙ‚‘∑≡`a#¾‘O.{@.2%i»¹{"⁸G‘6∙;?X"j1>ζ╔²i[n¹‘5n}┼±↔}O

ลองที่นี่!

คำอธิบาย:

..‘                   push the ending part - "    | |\n    | |"
   ..‘O               output the starting part - "     _ \n    / \"
       .{             input times do
         @              push a space
          .2%           push input%2
             i»         push floor(prevInput/2)
               ¹        wrap the two in an array

{                   }   for each of the two numbers
 "..‘                     push "|    " - base stem
     6∙                   multiply vertically 6 times
       ;?       }         if the current item iterating over is truthy (i.e. != 0)
         X                  remove ToS - the regular stem - from the stack 
          "..‘              push "|  _ | / \| | ||_/ / __/ /    " - stem with an arm
              5n            split it into line lengths of 5
                 ┼        add that horizontally to the space pushed earlier (or whatever it's become)
                  ±↔      reverse ToS - the stem currently - horizontally
                     O  output the array of the current part
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.