Реализовать упрощенный кернинг


24

Введение

Кернинг означает регулировку расстояния между буквами текста. В качестве примера рассмотрим слово, Topнаписанное следующими тремя глифами:

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

Мы могли бы просто заполнить пробелы между глифами точками и покончить с этим, но пробелы как-то выглядят слишком широкими. Вместо этого мы сдвигаем глифы влево, чтобы они почти касались:

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

Это выглядит намного лучше! Обратите внимание, что столбец Tнаходится в верхней части левой границы o. В этой задаче ваша задача - реализовать простую программу кернинга для таких прямоугольных глифов.

Процесс кернинга

Рассмотрим два прямоугольных 2D массивов символов .и #одной и той же формы. В нашем простом процессе кернинга мы сначала размещаем массивы рядом, с одним столбцом .s между ними. Затем мы перемещаем каждый элемент #в правом массиве на один шаг влево, пока некоторые #элементы левого и правого массивов не будут ортогонально или диагонально смежными. Результатом кернинга является шаг до того, как мы введем смежные #s. Ваша задача - реализовать этот процесс.

Давайте возьмем пример:

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

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

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

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

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

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

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

В последнем массиве у нас есть новые смежные пары #s, поэтому второй-последний массив является результатом процесса кернинга.

Вход и выход

Для простоты вам нужно только обработать кернинг двух глифов. Ваши входные данные представляют собой два прямоугольных 2D-массива в одном из следующих форматов:

  • 2D массивы целых чисел, где 0 обозначает .и 1 обозначает #.
  • Многострочные строки окончены .#.
  • Массивы строк окончены .#.
  • 2D массивы персонажей .#.

Если входные данные взяты как одна строка, вы можете использовать любой разумный разделитель. Однако разделитель должен находиться между двумя массивами, что означает, что вы не можете принимать два входных сигнала, которые уже были соединены, строка за строкой.

Ваш вывод является результатом процесса кернинга, примененного к этим двум массивам, который представляет собой прямоугольный 2D-массив в том же формате, что и входные данные. Вам разрешено добавлять или удалять любое количество начальных или конечных столбцов .s, но выходные данные должны быть прямоугольными и иметь ту же высоту, что и входные данные. Гарантируется, что процесс кернинга завершится до того, как левый край второго входа переместится по левому краю первого входа.

Правила и оценки

Наименьшее количество байтов в каждом языке программирования выигрывает. Применяются стандартные правила .

Контрольные примеры

Чтобы помочь с вставкой копий, эти тестовые примеры представлены в виде списков строк.

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

Визуализатор . Тестовый пример 5 кажется неправильным.
user202729

@ user202729 Спасибо, это сейчас исправлено. Я прошел несколько этапов исправления тестовых случаев в песочнице и, по-видимому, пропустил этот.
Згарб

Также, если два символа «проваливаются» друг на друга, что должна делать программа?
user202729

@ user202729 Можно предположить, что этого не произойдет. Смотрите последнее предложение раздела «Ввод и вывод».
Згарб

Ответы:




2

Сетчатка , 223 байта

+`(.+)¶(¶(.+¶)*)(\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

Попробуйте онлайн! Ссылка включает в себя контрольные примеры плюс скрипт заголовка, чтобы переформатировать их в предпочтительный формат ввода двух строк, разделенных новой строкой. Это кажется слишком длинным, но есть, вероятно, крайний случай, который я упустил, но теперь он, по крайней мере, прошел все тестовые случаи. Объяснение:

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

Соедините два входных массива вместе, используя букву iв качестве разделителя. (Это позволяет использовать \Wи \bпозже.)

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

Поменяйте все .s на is при объединении.

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

Измените все is ниже #s на @s.

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

Измените все is выше #s на @s.

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

Измените все @s на .s, плюс все is, смежные с @s или #s.

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

Если #после an нет i, то измените смежную .спину на a iснова.

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

Если есть строка без is, измените все is на .s, так как здесь делать нечего.

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

Вычислите минимальное количество is в любой строке.

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

Распространение на другие линии.

i

Удалите is, тем самым выполнив необходимый кернинг.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.