แสดงผลเขาวงกต ASCII


18

ดู! มันเป็นเขาวงกต ASCII! ซู coolzors, amazeballs และสิ่งของ

+-+-----+---+
| |     |   |
| |  ++   | |
| |  ++ +-+ |
|       |   |
+-------+ | |
|         | |
+---------+-+

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

ถ้าฉันวาดมันได้ใน ...

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

นั่นจะหวานมาก!


กฎ (เพราะกฎนั้นยอดเยี่ยม):

  • เขียนโค้ดเพื่อแปลงสตริงให้เป็นเขาวงกต ascii และส่งออกผลลัพธ์
  • อักขระที่ไม่ใช่ช่องว่างใด ๆ จะถูกอ่านเป็นวอลล์
  • ตัวละครแต่ละตัวจะตัดสินว่าตัวละครตัวไหนที่อยู่บนพื้นฐานของเพื่อนบ้าน (เฉพาะในทิศเหนือ, ใต้, ตะวันออกและตะวันตก)
    • ถ้าถ่านไม่มีเพื่อนบ้านที่ไม่ใช่ช่องว่างมันจะเป็นเครื่องหมายบวก (+)
    • หากถ่านมีเพื่อนบ้านทั้งในแนวตั้ง (เหนือ - ใต้) และแนวนอน (ตะวันออก - ตะวันตก) มันจะเป็นเครื่องหมายบวก (+)
    • หากถ่านมีเพื่อนบ้านในทิศทางแนวตั้ง (เหนือ - ใต้) จะเป็นสัญลักษณ์ท่อ (|)
    • หากถ่านมีเพื่อนบ้านในทิศทางแนวนอน (ตะวันออก - ตะวันตก) เท่านั้นมันจะเป็นเครื่องหมายลบ (-)
  • อินพุตสามารถเป็นสตริงเดี่ยว (โดยมีบรรทัดคั่นด้วยอักขระบรรทัดใหม่หรืออาร์เรย์ของสตริง)
  • อักขระอินพุตทั้งหมดจะเป็นอักขระ ASCII ที่พิมพ์ได้คุณไม่จำเป็นต้องจัดการกับชุดอักขระเพิ่มเติม
  • โปรดใช้ภาษาเก่าที่คุณต้องการ
  • หากมีช่องว่างสีขาวหน้าหนึ่งบรรทัดควรมีจำนวนเท่ากันในแต่ละบรรทัด พื้นที่สีขาวใด ๆ หลังจากแต่ละบรรทัดของการส่งออกเป็นเรื่องปกติ
  • พยายามแก้ไขด้วยจำนวนไบต์ที่น้อยที่สุด

กรณีทดสอบ:

1: กรอบ

การป้อนข้อมูล:

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

เอาท์พุท:

+--------+
|        |
|        |
|        |
+--------+

2: เขาวงกตแบบคลาสสิก

การป้อนข้อมูล:

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

เอาท์พุท:

--------+-------+
        |       |
| --+-+ | ----+ |
|   | | |     | |
| + | | +---- | |
|   | |       | | 
+-- | +----+- | |
|   | |    |  | | 
| --+ | ++ | -+
|     | ++    |  
+-----+-++----+--

3: ไข่สีเขียวชาย

การป้อนข้อมูล:

I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!

เอาท์พุท:

| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++

4: หยาด

การป้อนข้อมูล:

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

เอาท์พุท:

++++ ++++++-
++++ ++++++ 
++++  +++++ 
 +++  +++++ 
 +++   ++++ 
 +++   | ++ 
 ++    | ++ 
 ++    | |  
 ++      |  
 ++         
  |         

1
ไข่เขียวและแฮมที่สามบรรทัดควรจบด้วย---หรือไม่?
LiefdeWen

1
ผลลัพธ์สำหรับเพื่อนบ้านที่ผสมยังไม่ชัดเจน ไม่แน่ใจว่าทำไม icicles จะมี-s ใด ๆเลยหรือทำไมเขาวงกตแบบคลาสสิคไม่มีสี่+s ในแถวด้านล่าง
Neil

1
เราอนุญาตให้ใช้อินพุตเป็นสี่เหลี่ยมจัตุรัสที่มีช่องว่าง (เช่นเมทริกซ์) หรือไม่ การส่งออกได้รับอนุญาตให้มีพื้นที่ว่างรอบพิเศษหรือไม่ นอกจากนี้คุณหมายถึงจริงๆsmallest number of charactersไม่ใช่ไบต์?
dzaima

1
ผมคิดว่า 1) เขาวงกตคลาสสิกที่ควรจะมี+ในช่วงกลางของแถวที่ 1 2) ที่!ของ Icicles -ควรถูกแทนที่ด้วย คุณช่วยกรุณาตรวจสอบสิ่งเหล่านี้อีกครั้งได้ไหม
Arnauld

1
โดยwhitespaceคุณหมายถึงพื้นที่เพียงแค่? ฉันไม่ต้องการที่จะสนับสนุนแท็บและคุณอาจไม่ต้องการให้ฉันเปลี่ยนบรรทัดใหม่ด้วย
โจคิง

คำตอบ:


11

APL (Dyalog Unicode) , 57 35 ไบต์SBCS

-22 ขอบคุณที่เป็นทางออกที่นิยายของ NGN

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อการเมทริกซ์ตัวละครเป็นอาร์กิวเมนต์

{⊃'+-|+'↓⍨25 4 2⊃¨⊂⍱∘⌽⍨' '≠,⍵}⌺3 3

ลองออนไลน์!

{... }⌺3 3 ในแต่ละละแวก 3-by-3 ใช้ฟังก์ชั่นต่อไปนี้:

,⍵ ravel (แผ่)

' '≠ บูลีนที่ไม่เว้นวรรค

⍱∘⌽⍨ NOR เป็นแบบย้อนกลับ (รวมทั้งไม่ด้านบน NOR และไม่เหลือ NOR ขวา)

5 4 2⊃¨⊂เลือก 5 วัน 4 วันที่ 2 และครั้งที่องค์ประกอบจากรายชื่อทั้งหมด
  คือตัวเองว่างเปล่าไม่มีแนวตั้งแนวนอนไม่มี

2⊥ ประเมินในฐาน 2 (ไบนารี)
  เช่น≥4: ตัวเปล่า 3: ไม่มีเพื่อนบ้าน 2: ไม่มีเพื่อนบ้านแนวนอน; 1: ไม่มีแนวตั้ง; 0: มีทั้งคู่

'+-|+'↓⍨ ปล่อยองค์ประกอบหลายอย่างจากสตริงนี้ว่า
  ตนเองว่างเปล่า: ; เพียงอย่างเดียว: +; เพื่อนบ้านแนวตั้งเท่านั้น: |+; แนวนอน: -|+; ทั้งสอง:+-|+

 เลือกองค์ประกอบแรก (แผ่นที่มีช่องว่างหากไม่มี)
  เช่นตัวเองที่ว่างเปล่า: ; เพียงอย่างเดียว: +; เพื่อนบ้านแนวตั้งเท่านั้น: |; แนวนอน: -; ทั้งสอง:+


วิธีการแก้ปัญหาเก่า

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อการเมทริกซ์ตัวละครเป็นอาร์กิวเมนต์

{' +-|+'⊃⍨1⍳⍨(' '=5⊃,⍵),(∧/,⊢)∨/2 21' '≠(90 1)/,⍵}⌺3 3

ลองออนไลน์!

{... }⌺3 3 ในแต่ละละแวก 3-by-3 ใช้ฟังก์ชั่นต่อไปนี้:

,⍵ ravel (แผ่)

(... )/ ตัวกรองโดยใช้หน้ากากต่อไปนี้:

  9⍴0 1 เปลี่ยนรูปร่าง[0,1]เป็นความยาว 9 ทุกรอบ (เลือก N, W, E, S)

' '≠ บูลีนที่ไม่เว้นวรรค

1⌽ หมุนไปทางซ้ายหนึ่งก้าว [W,E,S,N]

2 2⍴ เปลี่ยนรูปร่างเป็นเมทริกซ์ 2 คูณ 2 [[W,E],[S,N]]

∨/ การลดแถวหรือฉลาดกว่า: [horizontal,vertical]

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้:

   ตัวตน; [horizontal,vertical]

  ∧/, นำหน้าด้วยการลดและ; [both,horizontal,vertical]

(), เพิ่มรายละเอียดต่อไปนี้:

  ,⍵ ravel (แบน) บริเวณใกล้เคียง

  5⊃ เลือก 5 THองค์ประกอบ (ตัวเอง)

  ' '= บูลีนถ้าเว้นวรรค (เช่นว่างเปล่า)

 ตอนนี้เรามี [empty,both,horizontal,vertical]

1⍳⍨ ดัชนีซ้ายสุด 1 (ให้ 5 ถ้าไม่มีเพื่อนบ้าน)

' +-|+'⊃⍨ ใช้มันเพื่อเลือกสัญลักษณ์

   




5

MATLAB, 113 110 101 ไบต์

function F(A)
B=A>32
c=[1 1 1]
f=@(c)conv2(B,c,'s')>1
h=f(c)
v=f(c')
char((13*h+92*v-94*(h&v)).*B+32)

แปลงอินพุตเป็นโลจิคัลใช้การแปลงในแนวนอนและแนวตั้งและรวมเอาต์พุตเพื่อสร้างตัวอักษรที่สอดคล้องกัน

3 ไบต์ถูกบันทึกโดย @Adriaan สำหรับบอกฉันว่าคุณสามารถบล็อกผลลัพธ์ใน PPCG: P

บันทึกแล้ว 9 ไบต์ด้วยความเห็น @flawr จำนวนมาก!



2

เรติน่า 0.8.2 , 92 ไบต์

\S
0
(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1
T`d`+|`\b.\b
T`d`-+

ลองออนไลน์! ต้องป้อนสี่เหลี่ยม ลิงค์มีกรณีทดสอบ คำอธิบาย:

\S
0

เปลี่ยนที่ไม่ใช่ช่องว่างทั้งหมดเป็น0s

(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1

ค้นหาทั้งหมด0ด้วยอีกอันที่0อยู่ด้านบนหรือด้านล่างในคอลัมน์เดียวกันและเปลี่ยนเป็น 1 1ตอนนี้กลายเป็นสถานที่ที่มีเพื่อนบ้านตามแนวตั้งในขณะที่0s ไม่มีเพื่อนบ้านแนวตั้ง

T`d`+|`\b.\b

ค้นหาตัวเลขทั้งหมดโดยไม่มีเพื่อนบ้านในแนวนอน 0s ไม่มีเพื่อนบ้านตามแนวตั้งอย่างใดอย่างหนึ่งเพื่อให้พวกเขากลายเป็น+s ในขณะที่1กำลังมีเพื่อนบ้านตามแนวตั้งเพื่อให้พวกเขากลายเป็น|s

T`d`-+

ตัวเลขที่เหลือมีเพื่อนบ้านแนวนอน 1s ยังมีเพื่อนบ้านตามแนวตั้งเพื่อให้พวกเขากลายเป็น+s ในขณะที่0เพียงมีเพื่อนบ้านในแนวนอนเพื่อให้พวกเขากลายเป็น-s


1

Python 3 , 336 ไบต์

def g(s):
 h,j,s=' +|-+','',s.splitlines()
 s+=['']
 for n in range(len(s)):
  s[n]+=' '
  for i in range(len(s[n])-1):
   l,r,k=s[n][i-1],s[n][i+1],0
   try:u=s[n-1][i]
   except:u=' '
   try:d=s[n+1][i]
   except:d=' '
   if not s[n][i]==' ':
    k+=1
    if not u==d==' ':k+=1
    if not l==r==' ':k+=2
   j+=h[k]
  j+='\n'
 print(j)

ลองออนไลน์!

ฉันต้องใช้รหัสจำนวนมากเพื่อจัดการกับข้อผิดพลาดของ edge edge


1

C (gcc) , 143 ไบต์

char**y,*z,h,v;f(char**x){for(y=x;*y;++y)for(z=*y;*z;++z)if(*z-32){h=z[1]-32|z[-1]-32;v=y[1][z-*y]-32|y[-1][z-*y]-32;*z=h?v?43:45:(v?'|':43);}}

ลองออนไลน์!

ฟังก์ชั่น f แก้ไขอาร์เรย์ของสตริงในสถานที่ พื้นที่รอบ ๆ อาเรย์จะต้องมีการบุด้วยช่องว่าง (ข้อ จำกัด เล็กน้อย) แม้ว่าสิ่งนี้จะไม่เป็นไปตามข้อกำหนดที่โซลูชันส่วนใหญ่ใช้ แต่ก็เป็นไปตามกฎถ้าเราบอกว่าเราแสดงบรรทัดใหม่ด้วยช่องว่างสองช่อง (และใช้สตริงที่ลงท้ายด้วยบรรทัดใหม่)

Ungolfed

f(char**x){
    char **y;
    for (y = x; *y; ++y) {
        char *z;
        for (z = *y; *z; ++z) {
            if (*z != ' ') {
                if (z[1] != ' ' || z[-1] != ' ') {
                    // Horizontal exists
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '+';
                    else
                        *z = '-';
                } else {
                    // Horizontal doesn't exist
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '|';
                    else
                        *z = '+';
                }
            }
        }
    }
}

นี่เป็นความท้าทายที่สนุกของการคำนวณทางคณิตศาสตร์ การใช้การทำซ้ำตัวชี้แบบ C เป็นการง่ายที่จะได้เพื่อนบ้านที่เป็นแนวนอน แต่คนที่อยู่ในแนวดิ่งนั้นยากกว่า โชคดีที่ตัวชี้ y ยังอยู่รอบ ๆ (ซึ่งชี้ไปที่ค่าเริ่มต้นของ z) เพื่อให้ฉันสามารถอนุมานดัชนีของฉันจากมันและใช้เพื่อเข้าถึงองค์ประกอบเดียวกันในแถวที่แตกต่างกัน มันรู้สึกว่าการเขียนผิดมากy[-1][z-*y]เพราะมันต้องเผชิญกับสไตล์ที่สมเหตุสมผล!


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