Persegi panjang Unicode

10

Diberikan

  • matriks akarakter dariu=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"
  • koordinat submatrix sebagai x, y, w, h(kiri, atas, lebar> 1, tinggi> 1)
  • ketebalan t1 (seperti dalam ) atau 2 (seperti dalam )

render batas dalam untuk submatrix dengan ketebalan yang ditentukan, dengan mempertimbangkan garis yang ada.

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

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

Saat menimpa fragmen garis, ketebalan baru harus lebih besar dari ketebalan lama dan t.

Ini bukan tentang masukan parsing atau menemukan kompleksitas Kolmogorov dari Unicode, sehingga Anda mungkin menganggap a, u, x, y, w, h, ttersedia untuk Anda sebagai variabel. Selain itu, Anda dapat meletakkan hasilnya dalam variabel ralih-alih mengembalikan atau mengeluarkannya, asalkan rdengan jenis yang sama a.

Jika bahasa Anda memaksa Anda untuk menempatkan kode dalam fungsi (C, Java, Haskell, dll) dan solusi Anda terdiri dari satu fungsi, Anda dapat menghilangkan header dan footer fungsi.

Tes yang lebih besar:

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

// output
r=['┏┱─────┐         ┌┐     ┎──┲━┓',
   '┠╂──┬──┴─────────┼┼─────╂──╄━┛',
   '┃┃  │            ││     ┃  │  ',
   '┠╂──╆━━┓  ┏━━━━┓ ││    ┌╂┰┐│  ',
   '┃┃  ┗━━╃──╂────╂─┴╆━┱──┴╂┸┴┘  ',
   '┃┃     │  ┃    ┃  ┃ ┃   ┃     ',
   '┗┹─────┘  ┗━━━━┛  ┗━┛   ╹     ']
ngn
sumber
akankah input selalu disimpan 0 <= x < x + w < width(a)dan 0 <= y < y + h < height(a)?
tsh
@tsh ya, input akan valid
ngn
Bah, font default saya cerdik - itu menunjukkan beberapa karakter dengan bobot yang salah kecuali jika Anda memperbesar banyak.
Neil
@Neil Saya minta maaf tentang itu. Salah satu solusinya adalah menempelkan contoh di editor di mana Anda dapat memilih font.
ngn
1
Tentang hadiah Anda - tidak mungkin untuk memberikan tiga hadiah 150-rep. Anda harus melipatgandakan jumlah perwakilan setiap kali Anda memulai hadiah lain untuk pertanyaan yang sama.
MD XF

Jawaban:

2

JavaScript, 218 byte

(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 harus diambil sebagai array dari array char.

tsh
sumber
seperti yang disebutkan di atas, Anda diizinkan untuk mengganti (a,x,y,w,h,t,u)=>...denganr=...
ngn
2

Python 3 , 226 201 197 byte

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))]

Cobalah online!

Tidak Disatukan:

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]
TFeld
sumber
(p%3,p%9//3,p%27//9,p//27)[o]p//3**o%3menyimpan banyak byte. Lalu max(…)*3**o for3**o*max(…)forsimpan satu lagi. Dan kemudian Anda dapat menambah satu lagi dengan menyejajarkan 3**dan mengacak Puntuk mengindeksnya o%5-1, menghasilkan:sum(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
Err, langkah terakhir itu ide yang buruk. Alih-alih, Anda bisa melakukannya R=rangedan membawanya ke 201
Lynn
1

JavaScript (ES6), 174 byte

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)

Neil
sumber