Hình chữ nhật Unicode


10

Được

  • một ma trận acác ký tự từu=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"
  • tọa độ của một submatrix như x, y, w, h(left, top, chiều rộng> 1, chiều cao> 1)
  • độ dày t1 (như trong ) hoặc 2 (như trong )

hiển thị đường viền bên trong cho lớp con với độ dày đã chỉ định, có tính đến các đường hiện có.

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

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

Khi ghi đè lên một đoạn dòng, độ dày mới phải lớn hơn độ dày cũ và t.

Đây không phải là về phân tích đầu vào hoặc tìm sự phức tạp Kolmogorov của Unicode, vì vậy bạn có thể giả định a, u, x, y, w, h, tcó sẵn cho bạn như biến. Ngoài ra, bạn có thể đặt kết quả vào một biến rthay vì trả về hoặc xuất nó, miễn rlà cùng loại với a.

Nếu ngôn ngữ của bạn buộc bạn phải đặt mã vào các hàm (C, Java, Haskell, v.v.) và giải pháp của bạn bao gồm một hàm duy nhất, bạn có thể bỏ qua phần đầu trang và chân trang của hàm.

Bài kiểm tra lớn hơn:

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

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

đầu vào sẽ luôn luôn giữ 0 <= x < x + w < width(a)0 <= y < y + h < height(a)?
tsh

@tsh có, đầu vào sẽ hợp lệ
ngn

Bah, phông chữ mặc định của tôi là tinh ranh - nó hiển thị một số ký tự có độ nặng sai trừ khi bạn phóng to rất nhiều.
Neil

@ Tôi xin lỗi về điều đó. Một cách giải quyết khác là dán các ví dụ trong trình chỉnh sửa nơi bạn có thể chọn phông chữ.
ngn

1
Về tiền thưởng của bạn - không thể trao ba tiền thưởng 150 lần. Bạn phải tăng gấp đôi số đại diện mỗi khi bạn bắt đầu một tiền thưởng khác cho cùng một câu hỏi.
MD XF

Câu trả lời:


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 nên được coi là mảng của mảng char.


như đã đề cập ở trên, bạn được phép thay thế (a,x,y,w,h,t,u)=>...bằngr=...
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))]

Hãy thử trực tuyến!

Ung dung:

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%3lưu một loạt các byte. Sau đó max(…)*3**o for3**o*max(…)fortiết kiệm thêm một lần nữa. Và sau đó, bạn có thể bắt đầu thêm một lần nữa bằng cách nội tuyến 3**và xáo trộn Pxung quanh để lập chỉ mục cho nó o%5-1, mang lại: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, bước cuối cùng là một ý tưởng tồi. Thay vào đó, bạn có thể làm R=rangevà giảm xuống đến 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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.