ASCII 상자 그리기를 유니 코드로 변환


16

나는 실제로 유용하다고 생각되는 것에 대한 요청을 뻔뻔스럽게 게시하고 있습니다. 이 작업은 다음과 같이 임의의 ASCII 상자 그리기를 취하는 것입니다

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

... 그리고 유니 코드 상자 그리기 문자를 사용하여 더 아름다운 것으로 바꿉니다.

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

더 자세하게:

  • + 만 변환 | 문자-다른 문자는 변경하지 않아야합니다
  • 사용하다

    • 상자 도면 라이트 수직 (U + 2502) │
    • 상자 그림 LIGHT HORIZONTAL (U + 2500) ─
    • 상자 그림 LIGHT ARC DOWN 및 RIGHT (U + 256D) ╭
    • 상자 그림 LIGHT ARC DOWN 및 LEFT (U + 256E) ╮
    • 상자 그림 LIGHT ARC UP AND LEFT (U + 256F) ╯
    • 상자 그림 LIGHT ARC UP AND RIGHT (U + 2570) ╰
    • 상자 도면 라이트 수직 및 왼쪽 (U + 2524) ┤
    • 상자 그림 조명 수직 및 우측 (U + 251C) ├
    • 박스 도면 소등 및 수평 (U + 252C) ┬
    • BOX 도면 점등 및 수평 (U + 2534) ┴
    • 상자 그림 빛 수직 및 수평 (U + 253C) ┼

    • -항상 U + 2500으로 교체

    • | 항상 U + 2502로 교체
    • +는 북쪽, 남쪽, 동쪽 및 서쪽의 4 자 (존재하는 경우)에 따라 달라지는 유니 코드 문자로 대체됩니다.
    • <및>는 +의 북쪽 또는 남쪽 인 경우 수직 벽 세그먼트로 처리되므로 상자의 수직 벽에서 화살표가 종료 될 수 있습니다.
    • v와 ^는 +의 동쪽 또는 서쪽 인 경우 수평 벽 세그먼트로 처리됩니다 (상자의 수평 벽에서 화살표로 끝나는 화살표가있을 수 있음)
    • +는 북쪽, 남쪽, 동쪽 또는 서쪽의 + 인 경우 벽 세그먼트로 취급됩니다 (따라서 상자 모서리 옆에 선을 연결할 수 있음)

테스트 케이스

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

된다

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

최단 코드 승리!


1
"교차점"은 어디에 있습니까, 즉 +주위에 선이 있다면?
Leaky Nun

1
당신은 아마 의미 유니 코드 가 아닌 UTF-8
루이스 Mendo

1
테스트 사례가 있을까요? 특히 두 개의 상자가 가장자리 나 모서리에 닿는 경우 (또는 이러한 상황이 발생하지 않을 것이라는 설명)와 같은 가장자리의 경우에 특히 그렇습니다.
trichoplax

2
해당 테스트 사례에 필요한 출력을 게시하는 것이 좋습니다.
manatwork

2
어, 나는 방금 답을 작성하고 있었다 :-(
Neil

답변:


2

자바 스크립트 (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`
`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.