Implementar kerning simplificado

24

Introducción

Kerning significa ajustar el espacio entre las letras de un texto. Como ejemplo, considere la palabra Topescrita 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 Testá 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 .

Casos de prueba

Para ayudar con el pegado de copias, estos casos de prueba se proporcionan como listas de cadenas.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
Zgarb
fuente
Visualizador . El caso de prueba 5 parece estar equivocado.
user202729
@ user202729 Gracias, ya está arreglado. Pasé por varias rondas de arreglar los casos de prueba en la caja de arena, y aparentemente perdí esa.
Zgarb
Además, si los dos personajes se "caen", ¿qué debería hacer el programa?
usuario202729
@ user202729 Puede suponer que eso no sucederá. Vea la última oración de la sección "Entrada y salida".
Zgarb

Respuestas:

2

Python 3 , 154 bytes

lambda a,b,p=".":[c.rstrip(p)+d.lstrip(p).rjust(max(len((d+c).strip(p))for(c,d)in zip((a*3)[1:],b[:-1]+b+b[1:]))+1-len(c.rstrip(p)),p)for(c,d)in zip(a,b)]

Pruébalo en línea!

recursivo
fuente
2

Retina , 223 bytes

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4
T`.`i`\.*i\.*
+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@
+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3
T`i@`.`i*[#@]+i
mT`.`i`\.+i+$
msT`i`.`.*^\W+$.*
+`(\b(i+)\W+\2i*)i
$1.
+s`\bi((i+).+\b\2\b)
.$1
i

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:

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4

Une las dos matrices de entrada juntas usando una letra icomo separador. (Esto permite el uso de \Wy \bmás adelante).

T`.`i`\.*i\.*

Cambia todos los .s a is en la unión.

+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@

Cambie todas las is debajo de #s por @s.

+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3

Cambia todos los is por encima de #s por @s.

T`i@`.`i*[#@]+i

Cambie todos los @s a .s, más todos los is adyacentes a @so #s.

mT`.`i`\.+i+$

Si no hay #después de un i, entonces cambie el adyacente de .nuevo a un inuevo.

msT`i`.`.*^\W+$.*

Si hay una línea sin is, cambie todos los is a .s, ya que no hay nada que hacer aquí.

+`(\b(i+)\W+\2i*)i
$1.

Calcule el número mínimo de is en cualquier línea.

+s`\bi((i+).+\b\2\b)
.$1

Propagar a las otras líneas.

i

Elimine el is, realizando así el kerning requerido.

Neil
fuente