แปลงรูปวาดกล่อง ASCII เป็น Unicode


16

ฉันลงคอขอสิ่งที่ฉันจะพบว่ามีประโยชน์ ภารกิจคือการวาดกล่อง ASCII ตามอำเภอใจเช่นนี้

     |
+----+----+
| state A +---+
+---------+   |
              |
         +----v----+
         | state B |
         +---------+

... และแปลงให้เป็นสิ่งที่สวยงามยิ่งขึ้นโดยใช้อักขระการวาดกล่องยูนิโค้ดเช่น

     │
╭────┴────╮
│ state A ├───╮
╰─────────╯   │
              │
         ╭────v────╮
         │ state B │
         ╰─────────╯

รายละเอียดเพิ่มเติม:

  • แปลงเฉพาะ + - | อักขระ - อักขระอื่นควรไม่เปลี่ยนแปลง
  • ใช้

    • กล่อง DRAWINGS แนวตั้งแสง (U + 2502) │
    • BOX DRAWINGS LIGHT HORIZONTAL (U + 2500) ─
    • BOX DRAWINGS LIGHT ARC DOWN และ RIGHT (U + 256D) ╭
    • BOX DRAWINGS LIGHT ARC DOWN และ LEFT (U + 256E) ╮
    • BOX DRAWINGS LIGHT ARC UP and LEFT (U + 256F) ╯
    • BOX DRAWINGS LIGHT ARC UP and RIGHT (U + 2570) ╰
    • BOX DRAWINGS แนวตั้งแสงและซ้าย (U + 2524) ┤
    • กล่อง DRAWINGS แสงแนวตั้งและขวา (U + 251C) ├
    • BOX DRAWINGS LIGHT และ HORIZONTAL (U + 252C) ┬
    • BOX DRAWINGS LIGHT UP และ HORIZONTAL (U + 2534) ┴
    • BOX DRAWINGS แนวตั้งแนวตั้งและแนวนอน (U + 253C) ┼

    • - แทนที่ด้วย U + 2500 เสมอ

    • | แทนที่ด้วย U + 2502 เสมอ
    • + ถูกแทนที่ด้วยอักขระ Unicode ที่ขึ้นอยู่กับ 4 ตัวอักษรทิศเหนือทิศใต้ทิศตะวันออกและทิศตะวันตกของมัน (ถ้ามี)
    • <และ> จะถือว่าเป็นเซ็กเมนต์กำแพงตามแนวตั้งหากทิศเหนือหรือทิศใต้ของ + (เพื่อให้คุณสามารถมีลูกศรสิ้นสุดในผนังแนวตั้งของกล่อง)
    • v และ ^ จะถือว่าเป็นเซ็กเมนต์กำแพงแนวนอนหากทิศตะวันออกหรือทิศตะวันตกของ + (เพื่อให้คุณสามารถมีลูกศรสิ้นสุดในผนังแนวนอนของกล่อง)
    • + จะถือว่าเป็นส่วนของผนังถ้าทิศเหนือใต้ตะวันออกหรือตะวันตกของ + (เพื่อให้สายสามารถเชื่อมต่อถัดจากมุมกล่อง)

Testcases

+-+     +---+   +---+   |
| +--   |ABC|  -+   |  +++
+-+     ++--+   +---+  +-+
         |
         +--->
  |           +--+
+-v+   +---+  |  |  +-----+
|Hi|  ->   |  +^-+  |world<-----+
+--+   +---+   |    +-----+     |
               |                +--
   |
---+---
   |

กลายเป็น

╭─╮     ╭───╮   ╭───╮   │
│ ├──   │ABC│  ─┤   │  ╭┴╮
╰─╯     ╰┬──╯   ╰───╯  ╰─╯
         │
         ╰───>
  │           ╭──╮
╭─v╮   ╭───╮  │  │  ╭─────╮
│Hi│  ─>   │  ╰^─╯  │world<─────╮
╰──╯   ╰───╯   │    ╰─────╯     │
               │                ╰──
   │
───┼───
   │

รหัสที่สั้นที่สุดชนะ!


1
"จุดตัด" อยู่ที่ไหนถ้าคือ+มีเส้นล้อมรอบทุกที่?
แม่ชีที่รั่วไหล

1
คุณอาจหมายถึงUnicodeมากกว่าUTF-8
Luis Mendo

1
เรามีกรณีทดสอบบ้างไหม? โดยเฉพาะอย่างยิ่งสำหรับกรณีขอบเช่นที่สองกล่องสัมผัสที่ขอบหรือมุม (หรือชี้แจงว่าสิ่งนี้จะไม่เกิดขึ้น)
trichoplax

2
ยินดีที่จะโพสต์ผลลัพธ์ที่ต้องการสำหรับกรณีทดสอบเหล่านั้น
จัดการ

2
อืมฉันเพิ่งเขียนคำตอบ :-(
Neil

คำตอบ:


2

JavaScript (ES6), 236 ไบต์

s=>`
${s}
`.split`
`.map((l,i,a)=>l.replace(/[+-|]/g,(c,j)=>c>`-`?`│`:c>`+`?`─`:`┼┬├╭┤╮??┴?╰?╯`[g(a[i-1][j])+g(l[j-1],1)*2+g(l[j+1],1)*4+g(a[i+1][j])*8]),g=(c,f)=>(f?`+-^v`:`+<>|`).indexOf(c)<0).slice(1,-1).join`
`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.