Chuyển đổi bản vẽ hộp ASCII thành Unicode


16

Tôi xấu hổ đăng một yêu cầu cho một cái gì đó tôi thực sự sẽ thấy hữu ích. Nhiệm vụ là lấy một hộp ascii tùy ý vẽ như thế này

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

... và biến nó thành một thứ gì đó đẹp hơn bằng cách sử dụng các ký tự vẽ hộp unicode, vd

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

Chi tiết hơn:

  • chỉ chuyển đổi + - | ký tự - các ký tự khác không thay đổi
  • sử dụng

    • HỘP VÒI ÁNH SÁNG CHỨNG NHẬN (U + 2502)
    • HỘP VÒI ÁNH SÁNG HORIZONTAL (U + 2500) ─
    • HỘP BẢN V LIGHT LIGHT ARC XUỐNG VÀ QUYỀN (U + 256D)
    • HỘP BẢN V LIGHT LIGHT ARC DOWN VÀ LEFT (U + 256E)
    • HỘP VÒI ÁNH SÁNG ARC LÊN VÀ TRÁI (U + 256F)
    • HỘP VÒI ÁNH SÁNG ARC LÊN VÀ QUYỀN (U + 2570)
    • HỘP VÒI ÁNH SÁNG VÀ TRÁI PHIẾU (U + 2524)
    • HỘP VÒI ÁNH SÁNG VÀ QUYỀN (U + 251C)
    • HỘP VÒI ÁNH SÁNG XUỐNG VÀ HORIZONTAL (U + 252C)
    • HỘP VÒI ÁNH SÁNG LÊN VÀ HORIZONTAL (U + 2534)
    • HỘP VÒI ÁNH SÁNG CHỨNG VÀ ÁNH SÁNG (U + 253C)

    • - luôn được thay thế bằng U + 2500

    • | luôn được thay thế bằng U + 2502
    • + được thay thế bằng một ký tự unicode phụ thuộc vào 4 ký tự bắc, nam, đông và tây của nó (nếu chúng tồn tại)
    • <và> được coi là các đoạn tường thẳng đứng nếu ở phía bắc hoặc phía nam của dấu + (để bạn có thể có mũi tên chấm dứt trong các bức tường thẳng đứng của hộp)
    • v và ^ được coi là các phân đoạn tường ngang nếu phía đông hoặc phía tây của dấu + (để bạn có thể có mũi tên chấm dứt trong các bức tường ngang của hộp)
    • + được coi là một đoạn tường nếu ở phía bắc, nam, đông hoặc tây của dấu + (để các đường có thể kết nối bên cạnh một góc hộp)

Tủ thử

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

Trở thành

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

Mã ngắn nhất sẽ thắng!


1
"Giao lộ" ở đâu, tức là nếu +có các đường bao quanh nó ở khắp mọi nơi?
Nữ tu bị rò rỉ

1
Bạn có thể có nghĩa là Unicode chứ không phải UTF-8
Luis Mendo

1
Chúng tôi có thể có một số trường hợp thử nghiệm? Đặc biệt đối với các trường hợp cạnh như hai hộp chạm vào một cạnh hoặc góc (hoặc làm rõ rằng điều này sẽ không bao giờ xảy ra).
trichoplax

2
Sẽ được tốt đẹp để gửi các đầu ra cần thiết cho các trường hợp thử nghiệm.
manatwork

2
Ugh, tôi chỉ đang soạn một câu trả lời :-(
Neil

Câu trả lời:


2

JavaScript (ES6), 236 byte

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`
`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.