ASCIIボックス描画をUnicodeに変換します


16

私は、私が実際に役立つと思うものへのリクエストを恥知らずに投稿しています。タスクは、このような任意のアスキーボックスの描画を取ることです

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

...そして、ユニコードボックス描画文字を使用して、より美しいものに変換します。たとえば、

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

さらに詳細に:

  • 変換のみ+-| 文字-他の文字は変更しないでください
  • 使用する

    • 箱型図垂直ライト(U + 2502)│
    • ボックスドローイングライト水平(U + 2500)─
    • 箱の図ライトアークダウンおよび右(U + 256D)╭
    • 箱の図ライトアークダウンと左(U + 256E)╮
    • ボックス図面ライトアークアップおよび左(U + 256F)╯
    • ボックス図面ライトアークアップおよび右(U + 2570)╰
    • 箱の図軽い垂直および左(U + 2524)┤
    • 箱の図軽い垂直および右(U + 251C)├
    • ボックス図面ライトダウンおよび水平(U + 252C)┬
    • ボックス図面ライトアップおよび水平(U + 2534)┴
    • 箱の図軽垂直および水平(U + 253C)┼

    • -常にU + 2500に置き換えられます

    • | 常にU + 2502に置き換えられます
    • +は、その北、南、東、西の4文字(存在する場合)に依存するUnicode文字に置き換えられます
    • <および>は、+の北または南の場合、垂直の壁セグメントとして扱われます(そのため、矢印をボックスの垂直の壁で終わらせることができます)
    • vと^は、+の東または西の場合、水平の壁セグメントとして扱われます(したがって、ボックスの水平の壁で終わる矢印を使用できます)。
    • +は、+の北、南、東、または西のいずれかである場合、壁セグメントとして扱われます(したがって、線はボックスコーナーの隣に接続できます)

テストケース

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

になる

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

最短のコードが勝ちます!


1
「交差点」は+どこにありますか。つまり、周囲に線がある場合ですか
漏れの修道女

1
おそらくUTF-8 ではなくUnicodeを意味します
ルイスメンドー

1
テストケースはありますか?特に、2つのボックスがエッジまたはコーナーで接触するようなエッジケースの場合(または、これが絶対に起こらないことの明確化)。
trichoplax

2
これらのテストケースに必要な出力を投稿していただければ幸いです。
マナトワーク

2
うーん、私はちょうど答えを作っていた:
ニール

回答:


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.