Rectángulos Unicode

10

Dado

  • una matriz ade caracteres deu=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"
  • las coordenadas de una submatriz como x, y, w, h(izquierda, superior, de anchura> 1, altura> 1)
  • un grosor tde 1 (como en ) o 2 (como en )

renderiza un borde interno para la submatriz con el grosor especificado, teniendo en cuenta las líneas existentes.

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

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

Al sobrescribir un fragmento de línea, el nuevo grosor debe ser mayor que el grosor anterior y t.

No se trata de analizar la entrada o la búsqueda de la complejidad de Kolmogorov de Unicode, por lo que puede suponer a, u, x, y, w, h, testán disponibles para usted como variables. Además, puede colocar el resultado en una variable en rlugar de devolverlo o generarlo, siempre que rsea ​​del mismo tipo que a.

Si su lenguaje le obliga a poner código en funciones (C, Java, Haskell, etc.) y su solución consiste en una sola función, puede omitir el encabezado y pie de página de la función.

Prueba más grande:

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

// output
r=['┏┱─────┐         ┌┐     ┎──┲━┓',
   '┠╂──┬──┴─────────┼┼─────╂──╄━┛',
   '┃┃  │            ││     ┃  │  ',
   '┠╂──╆━━┓  ┏━━━━┓ ││    ┌╂┰┐│  ',
   '┃┃  ┗━━╃──╂────╂─┴╆━┱──┴╂┸┴┘  ',
   '┃┃     │  ┃    ┃  ┃ ┃   ┃     ',
   '┗┹─────┘  ┗━━━━┛  ┗━┛   ╹     ']
ngn
fuente
¿la entrada siempre se mantendrá 0 <= x < x + w < width(a)y 0 <= y < y + h < height(a)?
tsh
@tsh sí, la entrada será válida
NGN
Bah, mi fuente predeterminada es dudosa: muestra algunos de esos caracteres con el peso incorrecto a menos que haga un zoom mucho.
Neil
@Neil, lo siento. Una solución alternativa es pegar los ejemplos en un editor donde puede elegir la fuente.
ngn
1
Acerca de su recompensa: es imposible otorgar tres recompensas de 150 repeticiones. Tienes que duplicar el recuento de repeticiones cada vez que comienzas otra recompensa por la misma pregunta.
MD XF

Respuestas:

2

JavaScript, 218 bytes

(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 debe tomarse como conjunto de conjunto de caracteres.

tsh
fuente
como se mencionó anteriormente, se le permite reemplazar (a,x,y,w,h,t,u)=>...conr=...
ngn
2

Python 3 , 226 201 197 bytes

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

Pruébalo en línea!

Sin golf:

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
fuente
(p%3,p%9//3,p%27//9,p//27)[o]p//3**o%3guarda un montón de bytes. Entonces max(…)*3**o for3**o*max(…)forguarda uno más. Y luego puede obtener uno más alineando 3**y barajando Ppara indexarlo o%5-1, produciendo: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, ese último paso es una mala idea. En cambio, puedes hacerlo R=rangey bajarlo a 201
Lynn
1

JavaScript (ES6), 174 bytes

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
fuente