Convierta el dibujo del cuadro ASCII en Unicode

16

Estoy publicando descaradamente una solicitud de algo que realmente me resultaría útil. La tarea es tomar un dibujo de cuadro ascii arbitrario como este

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

... y conviértalo en algo más hermoso usando caracteres de dibujo de caja Unicode, por ejemplo

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

Con más detalle:

  • convertir solo + - | caracteres: otros caracteres no deben modificarse
  • utilizar

    • DIBUJOS DE CAJA LUZ VERTICAL (U + 2502) │
    • DIBUJOS DE CAJA LUZ HORIZONTAL (U + 2500) ─
    • DIBUJOS DE LA CAJA ARCO DE LUZ ABAJO Y DERECHA (U + 256D) ╭
    • DIBUJOS DE LA CAJA ARCO DE LUZ ABAJO E IZQUIERDA (U + 256E) ╮
    • DIBUJOS DE LA CAJA ARCO DE LUZ ARRIBA E IZQUIERDA (U + 256F) ╯
    • DIBUJOS DE LA CAJA ARCO DE LUZ ARRIBA Y DERECHA (U + 2570) ╰
    • DIBUJOS DE CAJA LUZ VERTICAL E IZQUIERDA (U + 2524) ┤
    • DIBUJOS DE CAJA LUZ VERTICAL Y DERECHA (U + 251C) ├
    • DIBUJOS DE CAJA LUZ ABAJO Y HORIZONTAL (U + 252C) ┬
    • DIBUJOS DE LA CAJA SE ILUMINAN Y HORIZONTALES (U + 2534) ┴
    • DIBUJOS DE CAJA LUZ VERTICAL Y HORIZONTAL (U + 253C) ┼

    • - siempre reemplazado con U + 2500

    • El | siempre reemplazado con U + 2502
    • + se reemplaza con un carácter unicode que depende de los 4 caracteres norte, sur, este y oeste (si existen)
    • <y> se tratan como segmentos de pared verticales si están al norte o al sur de un + (para que pueda tener flechas que terminen en las paredes verticales de una caja)
    • v y ^ se tratan como segmentos de pared horizontales si están al este o al oeste de a + (para que pueda tener flechas que terminen en las paredes horizontales de una caja)
    • + se trata como un segmento de muro si está al norte, sur, este u oeste de un + (para que las líneas puedan conectarse al lado de una esquina de la caja)

Casos de prueba

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

Se convierte

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

¡El código más corto gana!

Alex Zeffertt
fuente
1
¿Dónde está la "intersección", es decir, si +tiene líneas a su alrededor en todas partes?
Leaky Nun
1
Probablemente te refieres a Unicode en lugar de UTF-8
Luis Mendo
1
¿Podríamos tener algunos casos de prueba? Particularmente para casos extremos como donde dos cajas se tocan en un borde o esquina (o aclaración de que esto nunca sucederá).
Trichoplax
2
Sería bueno publicar los resultados requeridos para esos casos de prueba.
manatwork
2
Ugh, estaba componiendo una respuesta :-(
Neil

Respuestas:

2

JavaScript (ES6), 236 bytes

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
fuente