Konvertieren Sie ASCII-Box-Zeichnungen in Unicode

16

Ich poste schamlos eine Anfrage für etwas, das ich tatsächlich nützlich finden würde. Die Aufgabe besteht darin, eine beliebige ASCII-Box wie diese zu zeichnen

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

... und verwandeln Sie es mit Unicode-Zeichen in etwas Schöneres, z

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

Ausführlicher:

  • konvertiere nur + - | Zeichen - andere Zeichen sollten unverändert bleiben
  • verwenden

    • BOX ZEICHNUNGEN HELL VERTIKAL (U + 2502) │
    • BOX ZEICHNUNGEN LICHT HORIZONTAL (U + 2500) ─
    • KASTENZEICHNUNGEN LICHTBOGEN UNTEN UND RECHTS (U + 256D) ╭
    • KASTENZEICHNUNGEN LICHTBOGEN UNTEN UND LINKS (U + 256E) ╮
    • BOX ZEICHNUNGEN LICHTBOGEN OBEN UND LINKS (U + 256F) ╯
    • BOX ZEICHNUNGEN LICHTBOGEN OBEN UND RECHTS (U + 2570) ╰
    • BOX ZEICHNUNGEN HELL VERTIKAL UND LINKS (U + 2524) ┤
    • KASTENZEICHNUNGEN HELL VERTIKAL UND RECHTS (U + 251C) ├
    • KASTENZEICHNUNGEN HELL UND HORIZONTAL (U + 252C) ┬
    • KASTENZEICHNUNGEN LEUCHTEN UND HORIZONTAL (U + 2534) ┴
    • KASTENZEICHNUNGEN HELL VERTIKAL UND HORIZONTAL (U + 253C) ┼

    • - immer durch U + 2500 ersetzt

    • | immer durch U + 2502 ersetzt
    • + wird durch ein Unicode-Zeichen ersetzt, das von den 4 Zeichen im Norden, Süden, Osten und Westen abhängt (sofern vorhanden).
    • <und> werden nördlich oder südlich von einem + als vertikale Wandsegmente behandelt (sodass Pfeile in vertikalen Wänden einer Box enden können).
    • v und ^ werden als horizontale Wandsegmente behandelt, wenn sie östlich oder westlich von einem + liegen (sodass Pfeile in horizontalen Wänden einer Box enden können).
    • + wird als Mauersegment behandelt, wenn entweder Norden, Süden, Osten oder Westen von + (so dass Linien neben einer Kastenecke verbunden werden können)

Testfälle

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

Wird

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

Kürzester Code gewinnt!

Alex Zeffertt
quelle
1
Wo ist die "Kreuzung", dh wenn die +überall mit Linien umrandet ist?
Undichte Nonne
1
Du meinst wahrscheinlich eher Unicode als UTF-8
Luis Mendo
1
Könnten wir einige Testfälle haben? Besonders für Kantenfälle, bei denen sich zwei Kästchen an einer Kante oder Ecke berühren (oder klarstellen, dass dies niemals passieren wird).
Trichoplax
2
Wäre nett, die benötigten Ausgaben für diese Testfälle zu posten.
Manatwork
2
Ugh, ich habe gerade eine Antwort verfasst :-(
Neil

Antworten:

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
quelle