ASCII kutu çizimini Unicode'a dönüştürme


16

Utanmadan aslında yararlı bulacağım bir şey için bir istek gönderiyorum. Görev, keyfi bir ascii kutusu çizimi almaktır.

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

... ve unicode kutu çizim karakterlerini kullanarak daha güzel bir şeye dönüştürün, ör.

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

Daha ayrıntılı olarak:

  • yalnızca dönüştür + - | karakterler - diğer karakterler değiştirilmemelidir
  • kullanım

    • KUTU ÇİZİMLERİ IŞIK DİKEY (U + 2502) │
    • KUTU ÇİZİMLERİ IŞIK YATAY (U + 2500) ─
    • KUTU ÇİZİMLERİ IŞIK ARK AŞAĞI VE SAĞ (U + 256D) ╭
    • KUTU ÇİZİMLERİ IŞIK ARK AŞAĞI VE SOL (U + 256E) ╮
    • KUTU ÇİZİMLERİ IŞIK ARK YUKARI VE SOL (U + 256F) ╯
    • KUTU ÇİZİMLERİ IŞIK ARK YUKARI VE SAĞ (U + 2570) ╰
    • KUTU ÇİZİMLERİ IŞIK DİKEY VE SOL (U + 2524) ┤
    • KUTU ÇİZİMLERİ IŞIK DİKEY VE SAĞ (U + 251C) ├
    • KUTU ÇİZİMLERİ IŞIK AŞAĞI VE YATAY (U + 252C) ┬
    • KUTU ÇİZİMLERİ IŞIK VE YATAY (U + 2534) ┴
    • KUTU ÇİZİMLERİ IŞIK DİKEY VE YATAY (U + 253C) ┼

    • - her zaman U + 2500 ile değiştirilir

    • | her zaman U + 2502 ile değiştirilir
    • +, kuzey, güney, doğu ve batısında 4 karaktere bağlı (varsa) bir unicode karakterle değiştirilir
    • <ve> a + 'nın kuzeyi veya güneyi dikey duvar parçaları olarak kabul edilir (böylece bir kutunun dikey duvarlarında oklar bitebilir)
    • v ve ^, a + 'nın doğusunda veya batısındaysa yatay duvar segmentleri olarak kabul edilir (böylece bir kutunun yatay duvarlarında sonlanan oklar olabilir)
    • + a + 'nın kuzey, güney, doğu veya batısında bir duvar segmenti olarak kabul edilir (böylece çizgiler bir kutu köşesinin yanına bağlanabilir)

testcases

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

Oluyor

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

En kısa kod kazanır!


1
"Kavşak" nerede, yani +etrafında her yerde çizgiler varsa ?
Sızdıran Rahibe

1
Muhtemelen UTF-8 yerine Unicode demek istediniz
Luis Mendo

1
Bazı test senaryolarımız olabilir mi? Özellikle iki kutunun bir kenarda veya köşede temas ettiği kenar kasaları için (veya bunun asla olmayacağına dair açıklama).
trichoplax

2
Bu test senaryoları için gerekli çıktıları göndermek güzel olurdu.
16:41

2
Ugh, sadece bir cevap yazıyordum :-(
Neil

Yanıtlar:


2

JavaScript (ES6), 236 bayt

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`
`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.