Перетворити малюнок вікна 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) ├
    • КРЕСЛЕННЯ КОРОБКІВ СВІТЛО ВІДОМАНІ І ГОРИЗОНТАЛЬНІ (U + 252C) ┬
    • КРЕСЛЕННЯ КОРОБКІВ СВІТЛО І ГОРИЗОНТАЛЬНІ (U + 2534) ┴
    • КРЕСЛЕННЯ КОРОБКІВ СВЯТИЙ І ГОРИЗОНТАЛЬНИЙ (U + 253C) ┼

    • - завжди замінено на U + 2500

    • | завжди замінюється на U + 2502
    • + замінюється символом unicode, який залежить від 4 символів на північ, південь, схід і захід від нього (якщо вони існують)
    • <і> трактуються як вертикальні відрізки стіни, якщо північ або південь від + (так що у вас можуть бути стрілки, що закінчуються у вертикальних стінках коробки)
    • v і ^ трактуються як відрізки горизонтальної стіни, якщо схід або захід від + (так що ви можете мати стрілки, що закінчуються в горизонтальних стінках коробки)
    • + трактується як сегмент стіни, якщо північ, південь, схід або захід від + (щоб лінії могли з'єднуватися поруч із куточком коробки)

Тестові шафи

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

Стає

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

Найкоротший код виграє!


1
Де знаходиться "перехрестя", тобто якщо +навколо нього є скрізь лінії?
Лина монашка

1
Ви, мабуть, маєте на увазі Unicode, а не UTF-8
Луїс Мендо

1
Чи могли б ми мати кілька тестових випадків? Особливо для крайових випадків, наприклад, коли два вікна торкаються краю або кута (або пояснення, що цього ніколи не відбудеться).
трихоплакс

2
Було б добре розмістити необхідні результати для цих тестових випадків.
манатура

2
Тьфу, я тільки складав відповідь :-(
Ніл

Відповіді:


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`
`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.