将ASCII框图转换为Unicode


16

我无耻地发布了对我实际上有用的请求。任务是拍摄像这样的任意ascii框图

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

...并使用unicode框绘图字符将其转换为更漂亮的内容,例如

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

更详细地:

  • 仅转换+-| 字符-其他字符应保持不变
  • 采用

    • 装箱图灯(U + 2502)│
    • 方框图卧式(U + 2500)─
    • 方框图上下左右光弧(U + 256D)╭
    • 方框图上下左右光弧(U + 256E)╮
    • 方框图向上和向左轻弧(U + 256F)╯
    • 方框图右上和右上的弧光(U + 2570)╰
    • 方框图垂直和左侧(U + 2524)┤
    • 箱型图立式和右立(U + 251C)├
    • 方框图LIGHT DOWN和HORIZONTAL(U + 252C)┬
    • 方框图点亮和水平(U + 2534)┴
    • 方框图垂直和水平光源(U + 253C)┼

    • -始终替换为U + 2500

    • | 始终用U + 2502代替
    • +替换为unicode字符,该字符取决于其北,南,东和西4个字符(如果存在)
    • 如果<和>位于+的北或南,则将它们视为垂直壁段(这样,箭头可以终止于框的垂直壁中)
    • 如果v和^在+的东或西,则被视为水平墙段(这样,箭头可以终止于框的水平墙中)
    • 如果+的北,南,东或西,则+被视为墙段(以便线可以在框角附近连接)

测试用例

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

成为

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

最短的代码胜出!


1
“交叉点”在哪里,即,如果+到处都有线条?
Leaky Nun

1
您可能是说Unicode而不是UTF-8
Luis Mendo

1
我们可以有一些测试用例吗?特别是对于边缘情况,例如两个盒子在边缘或拐角处接触(或澄清这将永远不会发生)。
trichoplax

2
为这些测试用例发布所需的输出将是很好的。
manatwork,2013年

2
gh,我只是在编一个答案:-(
尼尔(Neil)

Answers:


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`
`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.