Converti il ​​disegno della casella ASCII in Unicode


16

Sto pubblicando spudoratamente una richiesta per qualcosa che troverei davvero utile. Il compito è quello di prendere un disegno ASCII arbitrario come questo

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

... e trasformalo in qualcosa di più bello usando la casella Unicode che disegna personaggi, ad es

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

Più in dettaglio:

  • converti solo + - | personaggi: gli altri personaggi dovrebbero rimanere invariati
  • uso

    • SCATOLA DISEGNI LUCE VERTICALE (U + 2502) │
    • SCATOLA DISEGNI LUCE ORIZZONTALE (U + 2500) ─
    • SCATOLA DISEGNI ARCO CHIARO GIÙ E DESTRA (U + 256D) ╭
    • SCATOLA DISEGNI ARCO CHIARO GIÙ E SINISTRA (U + 256E) ╮
    • SCATOLA DISEGNI ARCO CHIARO E SINISTRA (U + 256F) ╯
    • SCATOLA DISEGNI ARCO CHIARO SU E DESTRA (U + 2570) ╰
    • SCATOLA DISEGNI CHIARO VERTICALE E SINISTRA (U + 2524) ┤
    • SCATOLA DISEGNI LUCE VERTICALE E DESTRA (U + 251C) ├
    • SCATOLA DISEGNI CHIARI E ORIZZONTALI (U + 252C) ┬
    • DISEGNI SCATOLA ILLUMINATI E ORIZZONTALI (U + 2534) ┴
    • SCATOLA DISEGNI LEGGERI VERTICALI E ORIZZONTALI (U + 253C) ┼

    • - sempre sostituito con U + 2500

    • | sempre sostituito con U + 2502
    • + viene sostituito con un carattere unicode che dipende dai 4 caratteri nord, sud, est e ovest di esso (se esistono)
    • <e> sono trattati come segmenti di muro verticali se a nord o a sud di un + (in modo che si possano avere frecce che terminano in muri verticali di una scatola)
    • v e ^ sono trattati come segmenti di muro orizzontale se est o ovest di un + (in modo da poter avere le frecce che terminano in muri orizzontali di una scatola)
    • + viene trattato come un segmento di muro se nord, sud, est o ovest di un + (in modo che le linee possano connettersi accanto a un angolo della casella)

Casi test

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

diventa

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

Vince il codice più corto!


1
Dov'è l '"intersezione", cioè se +ha delle linee attorno ad esso ovunque?
Perdente suora

1
Probabilmente intendi Unicode anziché UTF-8
Luis Mendo

1
Potremmo avere alcuni casi di test? Soprattutto per i casi limite come quelli in cui due caselle toccano un bordo o un angolo (o chiarimento che ciò non accadrà mai).
trichoplax,

2
Sarebbe bello pubblicare gli output richiesti per quei casi di test.
arte

2
Ugh, stavo solo componendo una risposta :-(
Neil

Risposte:


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`
`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.