Unicode dikdörtgenler


10

verilmiş

  • bir akarakter matrisiu=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"
  • gibi bir submatrix koordinatları x, y, w, h(sol, üst genişlik> 1, yükseklik> 1)
  • bir kalınlık t(olduğu gibi 1 ) veya 2'de (olduğu gibi )

varolan çizgileri dikkate alarak alt kalınlık için belirtilen kalınlıkta bir iç kenarlık oluşturun.

x=4;y=1;w=2;h=3;t=2;
a=[' ┌───┐',
   '┌┼┐  │',
   '│└┼──┘',
   '└─┘   ']

// output
r=[' ┌───┐',
   '┌┼┐ ┏┪',
   '│└┼─╂┨',
   '└─┘ ┗┛']

Bir çizgi parçasının üzerine yazarken, yeni kalınlık eski kalınlıktan daha büyük olmalıdır t.

Bu Takdir edersiniz ki bu yüzden, giriş ayrıştırma veya Unicode Kolmogorov karmaşıklığı bulma konusunda değil a, u, x, y, w, h, tdeğişkenler olarak size sunulmaktadır. Ayrıca, sonucu , aynı türde olduğu rsürece döndürmek veya çıktı almak yerine bir değişkene koyabilirsiniz .ra

Diliniz sizi işlevlere (C, Java, Haskell, vb.) Kod koymaya zorlarsa ve çözümünüz tek bir işlevden oluşuyorsa, işlev üstbilgi ve altbilgisini atlayabilirsiniz.

Daha büyük test:

x=4;y=1;w=24;h=4;t=1;
a=['┏┱─────┐         ┌┐     ┎──┲━┓',
   '┠╂─────┘         ││     ┃  ┗━┛',
   '┃┃               ││     ┃     ',
   '┠╂──┲━━┓  ┏━━━━┓ ││    ┌╂┰┐   ',
   '┃┃  ┗━━┩  ┃    ┃ └╆━┓  └╂┸┘   ',
   '┃┃     │  ┃    ┃  ┃ ┃   ┃     ',
   '┗┹─────┘  ┗━━━━┛  ┗━┛   ╹     ']

// output
r=['┏┱─────┐         ┌┐     ┎──┲━┓',
   '┠╂──┬──┴─────────┼┼─────╂──╄━┛',
   '┃┃  │            ││     ┃  │  ',
   '┠╂──╆━━┓  ┏━━━━┓ ││    ┌╂┰┐│  ',
   '┃┃  ┗━━╃──╂────╂─┴╆━┱──┴╂┸┴┘  ',
   '┃┃     │  ┃    ┃  ┃ ┃   ┃     ',
   '┗┹─────┘  ┗━━━━┛  ┗━┛   ╹     ']

giriş her zaman tutacak 0 <= x < x + w < width(a)ve 0 <= y < y + h < height(a)?
tsh

@tsh evet, giriş geçerli olacak
ngn

Bah, varsayılan yazı tipim tehlikeli - çok fazla yakınlaştırmadığınız sürece bu karakterlerden bazılarını yanlış ağırlıkla gösteriyor.
Neil

@Neil bunun için üzgünüm. Çözümlerden biri, örnekleri yazı tipini seçebileceğiniz bir düzenleyiciye yapıştırmaktır.
ngn

1
Ödülünüz hakkında - 150 tekrarlı üç ödül vermek mümkün değildir. Aynı soruda başka bir ödül her başlattığınızda temsil sayısını iki katına çıkarmanız gerekir.
MD XF

Yanıtlar:


2

JavaScript, 218 bayt

(a,x,y,w,h,t,u)=>a.map((l,j)=>l.map((c,i)=>u[(g=(a,b)=>a?g(a/3|0,b/3|0)*3+Math.max(a%3,b%3):b)(u.indexOf(c),t*((j==y||j==y+h-1)*((i>x&&i<x+w)*9+(i>=x&&i<x+w-1))+(i==x||i==x+w-1)*((j>y&&j<y+h)*3+(j>=y&&j<y+h-1)*27)))]))

a karakter dizisi dizisi olarak alınmalıdır.


Yukarıda da belirtildiği gibi, değiştirmek için izin verilir (a,x,y,w,h,t,u)=>...iler=...
ngn

2

Python 3 , 226 201 197 bayt

n,m=x+w-1,y+h-1
r=[*map(list,a)]
R=range
for i in R(x,x+w):
 for j in R(y,y+h):A,B=j in(y,m),i in(x,n);r[j][i]=u[sum(3**o*max((i<n*A,y<j*B,x<i*A,j<m*B)[o]*t,u.index(a[j][i])//3**o%3)for o in R(4))]

Çevrimiçi deneyin!

Ungolfed:

n,m=x+w-1,y+h-1
r=[*map(list,a)]
for i in range(x,x+w):
 for j in range(y,y+h):
  p=u.index(a[j][i])
  c=(p%3,p%9//3,p%27//9,p//27)
  A,B=j in(y,m),i in(x,n)
  P=(i<n*A,y<j*B,x<i*A,j<m*B)
  l=sum(max(P[o]*t,c[o])*3**o for o in range(4))
  r[j][i]=u[l]

(p%3,p%9//3,p%27//9,p//27)[o]p//3**o%3bir demet bayt kaydeder. Sonra max(…)*3**o for3**o*max(…)forbir tane daha kaydeder. Ve sonra , onu dizine almak ve dizine almak için 3**karıştırıp bir daha eke verebilirsiniz :Po%5-1sum(o*max((i<n*A,j<m*B,y<j*B,x<i*A)[o%5-1]*t,p//o%3)for o in(1,3,9,27))
Lynn

Hata, bu son adım kötü bir fikir. Bunun yerine yapabileceğiniz R=rangeve onu indireceğim 201
Lynn

1

JavaScript (ES6), 174 bayt

r=a.map((l,j)=>l.map((c,i)=>u[c=u.indexOf(c),g=n=>c/n%3<t&&g(n,c+=n),j==y|j==h&&(i>=x&i<w&&g(1),i>x&i<=w&&g(9)),i==x|i==w&&(j>=y&j<h&&g(27),j>y&j<=h&&g(3)),c]),w+=x-1,h+=y-1)

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.