Dado un texto como este:
# #### ## #
## # ## #
#### ##
Imprime el mismo texto pero conectando los píxeles con los caracteres ─│┌┐└┘├┤┬┴┼
. Si un píxel no tiene vecinos, no lo cambie.
Entonces la salida del último texto es:
│ ─┬── ┌─ │
└─ │ ┌┘ │
└──┘ ─┘
- Puede tomar la entrada como una matriz booleana.
- La entrada siempre contendrá al menos 1 píxel.
- Puede contar los caracteres de dibujo de caja como 1 byte.
- Puede suponer que la entrada está rellenada con espacios.
Casos de prueba
## #
=>
── #
###
#
=>
─┬─
│
##### ##
# # #
########
=>
─┬─┬─ ┌─
│ │ │
─┴─┴──┴─
# #
#####
# #
=>
│ │
─┼─┼─
│ │
# # # # #
# # # #
# # # # #
# # # #
# # # # #
=>
# # # # #
# # # #
# # # # #
# # # #
# # # # #
#####
#####
#####
#####
#####
=>
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
Como se trata de código de golf , gana el código más corto.
-|r7LJE3TW+
es un reemplazo adecuado de 1 byte-char para los caracteres de bloque.Respuestas:
Gelatina ,
605251504948 bytesSalvó un byte gracias a @ Dennis.
La entrada es una matriz booleana de 1 y 0. Itera sobre cada columna y cada fila convirtiendo la cabeza y la cola de cada infijo de tamaño 3 de un par de dígitos binarios a un decimal, y lo multiplica con el centro de cada infijo. Luego lo resume consigo mismo para encontrar el índice
'#───│┌┐┬│└┘┴│├┤┼ '
.Pruébalo en línea! ( caso 2 ) ( caso 3 ) ( caso 4 )
Explicación
Esto se basa en la misma idea que mi respuesta en J, pero en lugar de procesar en cada submatriz de 3x3, proceso sobre cada fila y cada columna mientras obtengo la misma tabla de índices.
Más de la mitad de los bytes se gastan generando la lista de caracteres de cuadro
'#───│┌┐┬│└┘┴│├┤┼ '
. Los literales de cadena comienzan con“
Jelly y tienen diferentes significados según su terminador. Aquí el terminador’
significa que la cadena se analizará como los puntos de código de cada carácter de acuerdo con la página de códigos Jelly , y se convertirá de una lista de 250 dígitos de base a un decimal.Luego, convierta ese decimal a una lista de dígitos en la base 61 del biyetivo e incremente cada uno en 9471 para moverlo al rango de los caracteres del cuadro y conviértalos usando Python
chr
. Luego, agréguele un carácter literal”#
y agregue un espacio⁶
.fuente
J ,
827266 bytesLa entrada es una tabla booleana de 1 y 0. Las reglas establecen que los caracteres del cuadro cuentan como un byte, no tres, y eso se ha aplicado aquí.
Uso
Explicación
Primero, la entrada se rellena con 0 en todos los lados.
Luego se selecciona cada subconjunto de tamaño 3
Entonces, solo se consideran 5 de los valores en cada submatriz
Los valores
ABCD
se seleccionan al acoplar cada submatriz y seleccionar en los índices1 7 3 5
. Esos valores se multiplican porE
cuál está en el índice 4. Luego se convierte de una lista de dígitos binarios a un decimal, y se incrementa enE
. Losx
valores no son necesarios.Esto se usa como índice para seleccionar qué personaje dibujar de acuerdo con la tabla a continuación (reordenado un poco para jugar al golf). La última columna hace coincidir el valor de salida de cada submatriz con un carácter de cuadro.
Además, en J, la cadena
' #───│┌┐┬│└┘┴│├┤┼'
utiliza caracteres de 8 bits, por lo que tiene una longitud de 47 (por cada byte) para los 17 caracteres necesarios. El comando loucp
convierte en caracteres de 16 bits, lo que le permite tener una longitud de 17.fuente
JavaScript (ES6),
155121103102 caracteresEdición: guardado 18 bytes con la ayuda de ETHproductions
Edición: guardada 1 byte utilizando el primer parámetro de replace () como
'#'
Cómo funciona
Repetimos todos los
#
caracteres encontrados en la cadena de entrada. Para cada uno de ellos, probamos si sus vecinos también son#
personajes que usan lat()
función:El parámetro
x
de lat()
función es el desplazamiento del vecino con respecto a la posición actualp
. Usamos -1 / + 1 para probar vecinos izquierdo / derecho y -w / + w para vecinos superiores / inferiores (dondew
es el ancho de una fila, es decir, la posición del primer salto de línea + 1).A cada vecino se le asigna un peso diferente (1, 2, 4 u 8) de acuerdo con la siguiente brújula:
Cada combinación de peso conduce a un valor único en [0 .. 15]. Por ejemplo, si se configuran tanto el vecino en la parte superior como el vecino a la derecha, la suma será 1 + 4 = 5, que se traduce al
└
uso de esta tabla:Por lo tanto,
'#│─┘─└─┴││┐┤┌├┬┼'[weight_sum]
conduce al carácter esperado.fuente
s=>(w=s[0].length+1,s=s.join`\n`).replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)])
s=>s.replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)],w=s.indexOf`\n`+1)
Python 2.7,
318315 bytes (270267 caracteres)Estoy seguro de que esto se puede jugar más (particularmente me encantaría deshacerme de ese molesto comentario de primera línea) pero aquí está mi entrada:
Aquí hay una explicación de cómo funciona todo:
EDITAR: se eliminaron algunos espacios antes
for ... in ...
fuente
JavaScript (ES6),
150139133131 caracteresToma la entrada como un conjunto de cadenas, por ejemplo
f(["###", " # "])
.Fragmento de prueba
Mostrar fragmento de código
fuente
ALPACA , 414 + 2 = 416 bytes
Requiere las
-fI
banderas.Esta solución usa una gran cantidad de bytes, pero es única en el sentido de que usa un autómata celular. ALPACA generalmente se usa como metalenguaje, pero aquí lo estoy usando como lenguaje de programación.
Versión sin golf:
fuente
PHP, 203 bytes
Esto probablemente se puede hacer de una manera más corta.
lee la entrada de STDIN. correr con
-r
.fuente
Python 3, 149 bytes
Toma entrada como
##\n #\n
y devuelve salida como['─', '┐', '\n', ' ', '│', '\n']
.fuente
R,
199212 bytesEDITAR: ahora es una función, en lugar de un fragmento de código.
La entrada es una matriz
m
de 1s y 0s. Esto es bastante feo y hacky.Un par de pruebas:
fuente
x = "┼"
funciona bien para míPerl,
8988 bytesIncluye +2 para
-0p
. Los caracteres especiales se cuentan como 1 byte, pero para que se muestren como caracteres individuales, lo mejor es agregar también la opción -C.Dé entrada en STDIN con el espacio de líneas rellenado para que todos tengan la misma longitud:
connect.pl
:fuente
MATL, 102 caracteres
Asigno un valor a un vecino (1, 2, 4 u 8); su suma coincidirá con un carácter en una cadena que contiene los caracteres del dibujo. Creo que todavía hay mucho espacio para mejoras, pero para un borrador:
Mejoras a realizar:
Pruébalo en línea! (puede no tener soporte para caracteres de dibujo de recuadro)
fuente