Ubah gambar kotak ASCII menjadi Unicode

16

Saya tanpa malu memposting permintaan untuk sesuatu yang benar-benar bermanfaat bagi saya. Tugasnya adalah mengambil kotak ascii gambar sewenang-wenang seperti ini

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

... dan mengubahnya menjadi sesuatu yang lebih indah menggunakan karakter menggambar kotak unicode, misalnya

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

Lebih detail:

  • konversikan hanya + - | karakter - karakter lain tidak boleh berubah
  • menggunakan

    • KOTAK GAMBAR CAHAYA VERTIKAL (U + 2502) │
    • KOTAK GAMBAR HORIZONTAL CAHAYA (U + 2500) ─
    • GAMBAR KOTAK CAHAYA ARC BAWAH DAN KANAN (U + 256D) ╭
    • KOTAK GAMBAR CAHAYA ARC BAWAH DAN KIRI (U + 256E) ╮
    • KOTAK GAMBAR CAHAYA DAN KIRI CAHAYA (U + 256F) ╯
    • GAMBAR KOTAK CAHAYA ARC UP DAN KANAN (U + 2570) ╰
    • GAMBAR KOTAK CAHAYA VERTIKAL DAN KIRI (U + 2524) ┤
    • GAMBAR KOTAK CAHAYA VERTIKAL DAN KANAN (U + 251C) ├
    • GAMBAR KOTAK BAWAH CAHAYA DAN HORISONTAL (U + 252C) ┬
    • GAMBAR KOTAK YANG TERANG DAN HORIZONTAL (U + 2534) ┴
    • GAMBAR KOTAK CAHAYA VERTIKAL DAN HORIZONTAL (U + 253C) ┼

    • - selalu diganti dengan U + 2500

    • | selalu diganti dengan U + 2502
    • + diganti dengan karakter unicode yang tergantung pada 4 karakter di utara, selatan, timur, dan barat (jika ada)
    • <dan> diperlakukan sebagai segmen dinding vertikal jika utara atau selatan tanda + (sehingga Anda dapat memiliki panah yang berakhir di dinding vertikal kotak)
    • v dan ^ diperlakukan sebagai segmen dinding horizontal jika timur atau barat + (sehingga Anda dapat memiliki anak panah yang berakhir di dinding horizontal kotak)
    • + diperlakukan sebagai segmen dinding jika salah satu dari utara, selatan, timur atau barat + (sehingga garis dapat terhubung di sebelah sudut kotak)

testcases

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

Menjadi

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

Kode terpendek menang!

Alex Zeffertt
sumber
1
Di mana "persimpangan", yaitu jika +memiliki garis di mana-mana?
Leaky Nun
1
Anda mungkin maksudkan Unicode daripada UTF-8
Luis Mendo
1
Bisakah kita memiliki beberapa test case? Terutama untuk kasus tepi seperti di mana dua kotak menyentuh di tepi atau sudut (atau klarifikasi bahwa ini tidak akan pernah terjadi).
trichoplax
2
Akan menyenangkan untuk memposting output yang diperlukan untuk kasus uji tersebut.
manatwork
2
Ugh, aku baru saja menyusun jawaban :-(
Neil

Jawaban:

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`
`
Neil
sumber