Konwertuj rysunek ramki ASCII na Unicode


16

Bezwstydnie wysyłam prośbę o coś, co naprawdę byłoby dla mnie przydatne. Zadanie polega na zrobieniu dowolnego rysunku ascii box w ten sposób

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

... i zamień go w coś piękniejszego, używając znaków rysujących w polu Unicode, np

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

Bardziej szczegółowo:

  • konwertuj tylko + - | znaki - inne znaki powinny pozostać niezmienione
  • posługiwać się

    • RYSUNKI PUDEŁKA ŚWIATŁO PIONOWE (U + 2502) │
    • RYSUNKI PUDEŁKOWE JASNE POZIOME (U + 2500) ─
    • RYSUNKI PUDEŁKA ŚWIATŁO ŁUK W DÓŁ I PRAWO (U + 256D) ╭
    • RYSUNKI POLA ŚWIATŁO ŁUK W DÓŁ I W LEWO (U + 256E) ╮
    • RYSUNKI PUDEŁKA ŚWIATŁO ŁUK W GÓRĘ I W LEWO (U + 256F) ╯
    • RYSUNKI PUDEŁKA ŚWIATŁO ŁUK W GÓRĘ I PRAWO (U + 2570) ╰
    • RYSUNKI PUDEŁKA LEKKIE PIONOWE I LEWE (U + 2524) ┤
    • RYSUNKI PUDEŁKA LEKKIE PIONOWE I PRAWE (U + 251C) ├
    • RYSUNKI PUDEŁKA ŚWIATŁO W DÓŁ I POZIOME (U + 252C) ┬
    • RYSUNKI POLE PODŚWIETLENIE I POZIOME (U + 2534) ┴
    • RYSUNKI PUDEŁKA LEKKIE PIONOWE I POZIOME (U + 253C))

    • - zawsze zastępowane U + 2500

    • | zawsze zastępowane przez U + 2502
    • + zostaje zastąpiony znakiem Unicode, który zależy od 4 znaków na północ, południe, wschód i zachód od niego (jeśli istnieją)
    • <i> są traktowane jako pionowe segmenty ściany, jeśli na północ lub południe od + (tak, że możesz mieć strzałki kończące się w pionowych ścianach pudełka)
    • v i ^ są traktowane jako poziome segmenty ściany, jeśli są na wschód lub na zachód od + (tak, że możesz mieć strzałki kończące się w poziomych ścianach pudełka)
    • + jest traktowany jako segment ściany, jeśli znajduje się na północ, południe, wschód lub zachód od + (aby linie mogły łączyć się obok rogu pola)

Przypadki testowe

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

Staje się

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

Najkrótszy kod wygrywa!


1
Gdzie jest „skrzyżowanie”, tzn. Czy +wszędzie wokół są linie?
Leaky Nun

1
Prawdopodobnie masz na myśli raczej Unicode niż UTF-8
Luis Mendo

1
Czy możemy mieć jakieś przypadki testowe? Szczególnie w przypadkach na krawędziach, np. Gdy dwa pola dotykają krawędzi lub narożnika (lub wyjaśnienie, że tak się nigdy nie stanie).
trichoplax

2
Byłoby miło opublikować wymagane dane wyjściowe dla tych przypadków testowych.
manatwork

2
Ugh, właśnie tworzyłem odpowiedź :-(
Neil

Odpowiedzi:


2

JavaScript (ES6), 236 bajtów

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`
`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.