Introducción
Kerning significa ajustar el espacio entre las letras de un texto. Como ejemplo, considere la palabra Top
escrita con los siguientes tres glifos:
##### ..... .....
..#.. ..... .....
..#.. ..##. .###.
..#.. .#..# .#..#
..#.. .#..# .#..#
..#.. ..##. .###.
..... ..... .#...
..... ..... .#...
Podríamos llenar los espacios entre los glifos con puntos y terminar con ellos, pero los espacios de alguna manera parecen demasiado amplios. En cambio, deslizamos los glifos hacia la izquierda para que casi se toquen:
#####........
..#..........
..#..##..###.
..#.#..#.#..#
..#.#..#.#..#
..#..##..###.
.........#...
.........#...
¡Esto se ve mucho mejor! Observe cómo la barra de T
está en la parte superior del borde izquierdo de o
. En este desafío, su tarea es implementar un programa de interletraje simple para dichos glifos rectangulares.
El proceso de kerning
Considere dos matrices de caracteres 2D rectangulares de .
y #
de la misma forma. En nuestro proceso de kerning simple, primero colocamos las matrices una al lado de la otra, con una columna de .
s en el medio. Luego, movemos cada uno #
en la matriz derecha un paso hacia la izquierda, hasta que algunos #
s de la matriz izquierda y derecha estén adyacentes ortogonal o diagonalmente. El resultado del interletraje es el paso anterior a la introducción de #
s adyacentes . Su tarea es implementar este proceso.
Tomemos un ejemplo:
Inputs:
..###
#....
#....
..##.
...#.
...##
..###
....#
Process:
..###....#.
#........##
#.......###
..##......#
..###...#.
#.......##
#......###
..##.....#
..###..#.
#......##
#.....###
..##....#
..###.#.
#.....##
#....###
..##...#
..####.
#....##
#...###
..##..#
En la última matriz, tenemos nuevos pares adyacentes de #
s, por lo que la penúltima matriz es el resultado del proceso de interletraje.
Entrada y salida
Para simplificar, solo necesita manejar el interletraje de dos glifos. Sus entradas son dos matrices 2D rectangulares, en uno de los siguientes formatos:
- Matrices 2D de enteros, con 0 representando
.
y 1 para#
. - Cuerdas multilínea más
.#
. - Arreglos de cadenas
.#
. - Matrices 2D de los personajes
.#
.
Si las entradas se toman como una sola cadena, puede usar cualquier delimitador razonable. Sin embargo, el delimitador debe ir entre las dos matrices, lo que significa que no puede tomar las dos entradas ya emparejadas fila por fila.
Su salida es el resultado del proceso de interletraje aplicado a estas dos matrices, que es una matriz 2D rectangular en el mismo formato que las entradas. Puede agregar o eliminar cualquier número de columnas iniciales o finales de .
s, pero la salida debe ser rectangular y tener la misma altura que las entradas. Se garantiza que el proceso de interletraje termina antes de que el borde izquierdo de la segunda entrada se deslice sobre el borde izquierdo de la primera entrada.
Reglas y puntaje
El conteo de bytes más bajo en cada lenguaje de programación gana. Aplican reglas estándar de código de golf .
Casos de prueba
Para ayudar con el pegado de copias, estos casos de prueba se proporcionan como listas de cadenas.
["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
fuente
Respuestas:
APL (Dyalog Classic) ,
4039 bytes-1 gracias a Erik the Outgolfer
Pruébalo en línea!
fuente
Python 3 , 154 bytes
Pruébalo en línea!
fuente
Retina , 223 bytes
Pruébalo en línea! El enlace incluye casos de prueba más script de encabezado para formatearlos a su formato de entrada preferido de dos cadenas delimitadas por nueva línea. Esto parece demasiado largo, pero probablemente hay un caso límite que he pasado por alto, pero ahora al menos supera todos los casos de prueba. Explicación:
Une las dos matrices de entrada juntas usando una letra
i
como separador. (Esto permite el uso de\W
y\b
más adelante).Cambia todos los
.
s ai
s en la unión.Cambie todas las
i
s debajo de#
s por@
s.Cambia todos los
i
s por encima de#
s por@
s.Cambie todos los
@
s a.
s, más todos losi
s adyacentes a@
so#
s.Si no hay
#
después de uni
, entonces cambie el adyacente de.
nuevo a uni
nuevo.Si hay una línea sin
i
s, cambie todos losi
s a.
s, ya que no hay nada que hacer aquí.Calcule el número mínimo de
i
s en cualquier línea.Propagar a las otras líneas.
Elimine el
i
s, realizando así el kerning requerido.fuente