Впровадити спрощене керування


24

Вступ

Кернінг означає регулювати відстань між літерами тексту. Як приклад, розглянемо слово, Topнаписане з трьома гліфами:

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

Ми могли просто заповнити прогалини між гліфами крапками і зробити це з допомогою, але прогалини якось виглядають занадто широкими. Замість цього ми просуваємо гліфи ліворуч, щоб вони майже торкалися:

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

Це виглядає набагато краще! Зверніть увагу, як смужка значка Tзнаходиться вгорі лівої межі o. У цьому завданні ваше завдання полягає в реалізації простої програми кернінгу для таких прямокутних гліфів.

Процес кернування

Розглянемо два прямокутні масиви 2D символів .та #однакової форми. У нашому простому процесі кернінгу ми спочатку розміщуємо масиви поруч з одним стовпцем .s посередині. Потім ми переміщуємо кожен #у правому масиві на один крок вліво, поки деякі #s лівого та правого масиву не ортогонально чи діагонально примикають. Результатом кернінгу є крок до того, як ми введемо суміжні #s. Ваше завдання - реалізувати цей процес.

Візьмемо приклад:

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

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

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

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

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

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

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

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

Вхід і вихід

Для простоти вам потрібно лише обробити кернінг двох гліфів. Ваші входи - це два прямокутні 2D масиви в одному з наступних форматів:

  • 2D масиви цілих чисел, з 0 стоїть .і 1 for #.
  • Багаторядкові струни .#.
  • Масиви рядків над .#.
  • 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 здається помилковим.
користувач202729

@ user202729 Дякую, це виправлено зараз. Я пройшов кілька раундів виправлення тестових випадків у пісочниці, і, мабуть, пропустив цей.
Згарб

Крім того, якщо два персонажі "провалюються" один у одного, що повинна робити програма?
користувач202729

@ 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+$

Якщо #після немає i, то знову поміняйте сусідню .спинку на 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.