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.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
code-golf  grid  code-challenge  atomic-code-golf  code-golf  combinatorics  probability-theory  card-games  code-golf  number  geometry  code-golf  decision-problem  chess  code-golf  math  number  sequence  code-golf  string  regular-expression  code-golf  arithmetic  integer  code-golf  math  array-manipulation  code-golf  number  decision-problem  integer  code-golf  string  ascii-art  kolmogorov-complexity  code-golf  decision-problem  graph-theory  binary-matrix  code-golf  string  parsing  code-golf  string  code-golf  morse  code-golf  code-golf  string  code-golf  ascii-art  cellular-automata  code-golf  binary  base-conversion  code-golf  arithmetic  decision-problem  integer  checksum  code-golf  matrix  linear-algebra  code-golf  code-golf  game  code-golf  sequence  binary  code-golf  combinatorics  optimization  code-golf  decision-problem  quine  code-golf  rational-numbers  bitwise  code-golf  string  permutations  code-golf  kolmogorov-complexity  unicode  code-golf  ascii-art  number  code-golf  number  integer  binary  base-conversion  code-golf  array-manipulation  code-golf  chemistry  code-golf  number  sequence  fibonacci  code-golf  matrix  optimization  code-golf  number  code-golf  math  number  sequence  code-golf  math  array-manipulation  matrix  linear-algebra  code-golf  kolmogorov-complexity  cops-and-robbers  cops-and-robbers  code-golf  tips  basic  code-golf  decision-problem  binary  tiling  game  king-of-the-hill  python  code-golf  c  code-golf  ascii-art  code-golf  string  kolmogorov-complexity  alphabet  code-golf  number  code-golf  string  code-golf  number  sequence  integer  code-golf  number  permutations  restricted-complexity  restricted-time 

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.