Convertir le dessin de la boîte ASCII en Unicode

16

Je poste sans vergogne une demande pour quelque chose que je trouverais réellement utile. La tâche consiste à prendre un dessin de boîte ascii arbitraire comme celui-ci

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

... et le transformer en quelque chose de plus beau en utilisant des caractères de dessin de boîte unicode, par exemple

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

Plus en détail:

  • convertir uniquement + - | caractères - les autres caractères ne doivent pas être modifiés
  • utilisation

    • BOÎTE DESSINS LUMINEUX VERTICAL (U + 2502) │
    • BOÎTE DESSINS LUMINEUX HORIZONTAL (U + 2500) ─
    • DESSINS DE BOÎTE LUMIÈRE ARC VERS LE BAS ET DROITE (U + 256D) ╭
    • DESSINS DE BOÎTE LIGHT ARC BAS ET GAUCHE (U + 256E) ╮
    • DESSINS DE BOÎTE LUMIÈRE ARC EN HAUT ET GAUCHE (U + 256F) ╯
    • DESSINS DE BOÎTE LUMIÈRE ARC VERS LE HAUT ET DROITE (U + 2570) ╰
    • BOÎTE DESSINS LÉGÈRE VERTICALE ET GAUCHE (U + 2524) ┤
    • BOÎTE DESSINS LUMINEUX VERTICAL ET DROIT (U + 251C) ├
    • DESSINS DE BOÎTE LÉGERS ET HORIZONTAUX (U + 252C) ┬
    • DESSINS DE BOÎTE LUMINEUX ET HORIZONTAUX (U + 2534) ┴
    • DESSINS DE BOÎTE LÉGÈRE VERTICALE ET HORIZONTALE (U + 253C) ┼

    • - toujours remplacé par U + 2500

    • | toujours remplacé par U + 2502
    • + est remplacé par un caractère unicode qui dépend des 4 caractères nord, sud, est et ouest de celui-ci (s'ils existent)
    • <et> sont traités comme des segments de mur verticaux si au nord ou au sud d'un + (de sorte que vous pouvez avoir des flèches se terminant dans les murs verticaux d'une boîte)
    • v et ^ sont traités comme des segments de mur horizontaux s'ils sont à l'est ou à l'ouest d'un + (de sorte que vous pouvez avoir des flèches se terminant dans les murs horizontaux d'une boîte)
    • + est traité comme un segment de mur si au nord, au sud, à l'est ou à l'ouest d'un + (de sorte que les lignes puissent se connecter à côté d'un coin de boîte)

Cas de test

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

Devient

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

Le code le plus court gagne!

Alex Zeffertt
la source
1
Où est «l'intersection», c'est-à-dire si le +a des lignes autour d'elle partout?
Leaky Nun
1
Vous voulez probablement dire Unicode plutôt que UTF-8
Luis Mendo
1
Pourrions-nous avoir des cas de test? Particulièrement pour les cas de bord comme lorsque deux boîtes touchent un bord ou un coin (ou une clarification que cela ne se produira jamais)
trichoplax
2
Ce serait bien de publier les sorties requises pour ces cas de test.
manatwork
2
Ugh, je composais juste une réponse :-(
Neil

Réponses:

2

JavaScript (ES6), 236 octets

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
la source