Implementar kerning simplificado


24

Introdução

Kerning significa ajustar o espaçamento entre as letras de um texto. Como exemplo, considere a palavra Topescrita com os três glifos a seguir:

##### ..... .....
..#.. ..... .....
..#.. ..##. .###.
..#.. .#..# .#..#
..#.. .#..# .#..#
..#.. ..##. .###.
..... ..... .#...
..... ..... .#...

Poderíamos simplesmente preencher as lacunas entre os glifos com pontos e terminar com isso, mas as lacunas de alguma forma parecem muito grandes. Em vez disso, deslizamos os glifos para a esquerda para que eles quase se toquem:

#####........
..#..........
..#..##..###.
..#.#..#.#..#
..#.#..#.#..#
..#..##..###.
.........#...
.........#...

Isso parece muito melhor! Observe como a barra de Testá no topo da borda esquerda de o. Nesse desafio, sua tarefa é implementar um programa de kerning simples para esses glifos retangulares.

O processo de kerning

Considere duas matrizes retangulares de caracteres 2D .e #da mesma forma. Em nosso processo simples de kerning, primeiro colocamos as matrizes lado a lado, com uma coluna de .s no meio. Então, movemos cada um #na matriz direita um passo para a esquerda, até que alguns #s da matriz esquerda e direita sejam ortogonais ou diagonalmente adjacentes. O resultado do kerning é o passo antes de introduzirmos #s adjacentes . Sua tarefa é implementar esse processo.

Vamos dar um exemplo:

Inputs:
..###
#....
#....
..##.

...#.
...##
..###
....#

Process:
..###....#.
#........##
#.......###
..##......#

..###...#.
#.......##
#......###
..##.....#

..###..#.
#......##
#.....###
..##....#

..###.#.
#.....##
#....###
..##...#

..####.
#....##
#...###
..##..#

Na última matriz, temos novos pares adjacentes de #s, portanto a penúltima matriz é o resultado do processo de kerning.

Entrada e saída

Para simplificar, você só precisa manipular o kerning de dois glifos. Suas entradas são duas matrizes 2D retangulares, em um dos seguintes formatos:

  • Matrizes 2D de números inteiros, com 0 em pé .e 1 em #.
  • Sequências de linhas múltiplas terminadas .#.
  • Matrizes de strings terminadas .#.
  • Matrizes 2D dos caracteres .#.

Se as entradas forem tomadas como uma única sequência, você poderá usar qualquer delimitador razoável. No entanto, o delimitador deve ir entre as duas matrizes, o que significa que você não tem permissão para receber as duas entradas já emparelhadas linha a linha.

Sua saída é o resultado do processo de kerning aplicado a essas duas matrizes, que é uma matriz 2D retangular no mesmo formato que as entradas. Você pode adicionar ou remover qualquer número de colunas iniciais ou finais de .s, mas a saída deve ser retangular e ter a mesma altura que as entradas. É garantido que o processo de kerning termine antes que a borda esquerda da segunda entrada deslize sobre a borda esquerda da primeira entrada.

Regras e pontuação

A contagem de bytes mais baixa em cada linguagem de programação vence. Aplicam-se as regras padrão de .

Casos de teste

Para ajudar na cópia e colagem, esses casos de teste são fornecidos como listas de seqüências de caracteres.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
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 

Visualizer . O caso de teste 5 parece estar errado.
user202729

@ user202729 Obrigado, está corrigido agora. Eu passei por várias rodadas de consertar os casos de teste na caixa de areia e aparentemente perdi essa.
Zgarb

Além disso, se os dois caracteres "se encaixam", o que o programa deve fazer?
user202729

@ user202729 Você pode assumir que isso não acontecerá. Veja a última frase da seção "Entrada e saída".
Zgarb

Respostas:



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

Experimente online!


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

Experimente online! O link inclui casos de teste e script de cabeçalho para reformatá-los no formato de entrada preferido de duas seqüências delimitadas por nova linha. Isso parece muito longo, mas provavelmente há um caso de ponta que eu negligenciei, mas pelo menos passa em todos os casos de teste agora. Explicação:

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

Junte as duas matrizes de entrada usando uma letra icomo separador. (Isso permite o uso \We \bmais tarde.)

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

Altere todos os .s para is na associação.

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

Altere todos os is abaixo de #s para @s.

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

Altere todos os is acima de #s para @s.

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

Altere todos os @s para .s, mais todos os is adjacentes a @s ou #s.

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

Se não houver #depois de um i, altere as .costas adjacentes para um inovamente.

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

Se houver uma linha sem is, altere todos os is para .s, pois não há nada a fazer aqui.

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

Calcule o número mínimo de is em qualquer linha.

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

Propague para as outras linhas.

i

Exclua os is, executando o kerning necessário.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.