Wdrożenie uproszczonego kerningu


24

Wprowadzenie

Kerning oznacza dostosowanie odstępów między literami tekstu. Jako przykład rozważmy słowo Topnapisane trzema następującymi glifami:

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

Moglibyśmy po prostu wypełnić luki między glifami kropkami i zrobić to, ale luki wyglądają jakoś zbyt szeroko. Zamiast tego przesuwamy glify w lewo, aby prawie się dotknęły:

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

To wygląda o wiele lepiej! Zwróć uwagę, jak pasekT jest u góry lewej ramki o. W tym wyzwaniu Twoim zadaniem jest wdrożenie prostego programu do kerningu dla takich prostokątnych glifów.

Proces kerningu

Rozważmy dwie prostokątne tablice znaków 2D .i #tego samego kształtu. W naszym prostym procesie kerningu najpierw umieszczamy tablice obok siebie, z jedną kolumną .s pomiędzy nimi. Następnie przesuwamy każdy #z prawej tablicy o jeden krok w lewo, aż niektóre #lewe i prawe tablice przylegają do siebie prostopadle lub ukośnie. Wynik kerningu jest krokiem przed wprowadzeniem sąsiadujących #s. Twoim zadaniem jest wdrożenie tego procesu.

Weźmy przykład:

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

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

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

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

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

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

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

W ostatniej tablicy mamy nowe sąsiednie pary #s, więc przedostatnia tablica jest wynikiem procesu kerningu.

Wejście i wyjście

Dla uproszczenia wystarczy obsłużyć kerning dwóch glifów. Twoje dane wejściowe to dwie prostokątne tablice 2D, w jednym z następujących formatów:

  • Tablice 2D liczb całkowitych, przy czym 0 oznacza .i 1 oznacza #.
  • Ciągi wielowierszowe zakończone .#.
  • Tablice ciągów ponad .#.
  • Tablice 2D postaci .#.

Jeśli dane wejściowe są traktowane jako pojedynczy ciąg, można użyć dowolnego rozsądnego separatora. Jednak separator powinien przechodzić między dwiema tablicami, co oznacza, że ​​nie wolno pobierać dwóch danych wejściowych już sparowanych wiersz po rzędzie.

Twój wynik jest wynikiem procesu kerningu zastosowanego do tych dwóch tablic, które są prostokątną tablicą 2D w tym samym formacie co dane wejściowe. Możesz dodawać lub usuwać dowolną liczbę wiodących lub końcowych kolumn .s, ale dane wyjściowe muszą być prostokątne i mieć tę samą wysokość co dane wejściowe. Gwarantowane jest zakończenie procesu kerningu, zanim lewa krawędź drugiego wejścia przesunie się nad lewą krawędzią pierwszego wejścia.

Zasady i punktacja

Najniższa liczba bajtów w każdym języku programowania wygrywa. Obowiązują standardowe zasady .

Przypadki testowe

Aby pomóc w wklejaniu kopii, te przypadki testowe podano jako listy ciągów.

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

Wizualizator . Przypadek testowy 5 wydaje się nieprawidłowy.
user202729,

@ user202729 Dzięki, to już naprawione. Przeszedłem przez kilka rund naprawiania skrzynek testowych w piaskownicy i najwyraźniej tęskniłem.
Zgarb,

A jeśli te dwa znaki „wpadną do siebie”, co powinien zrobić program?
user202729,

@ user202729 Możesz założyć, że tak się nie stanie. Zobacz ostatnie zdanie w sekcji „Wejście i wyjście”.
Zgarb,

Odpowiedzi:




2

Siatkówka , 223 bajty

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

Wypróbuj online! Link zawiera przypadki testowe oraz skrypt nagłówka, aby sformatować je do preferowanego formatu wejściowego dwóch ciągów rozdzielanych znakiem nowej linii. Wydaje się to zbyt długie, ale prawdopodobnie istnieje przeoczony przypadek, który przeoczyłem, ale teraz przynajmniej mija wszystkie przypadki testowe. Wyjaśnienie:

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

Połącz ze sobą dwie tablice wejściowe, używając litery ijako separatora. (Pozwala to na użycie \Wi \bpóźniej.)

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

Zmienić wszystkie .s do is przy łączeniu.

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

Zmień wszystkie is poniżej #s na @s.

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

Zmień wszystkie is powyżej #s na @s.

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

Zmień wszystkie @s na .s plus wszystkie is przylegające do @s lub #s.

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

Jeśli nie ma #po nim i, zmień sąsiednie .plecy na iponownie.

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

Jeśli istnieje linia bez is, zmień wszystkie is na .s, ponieważ nie ma tu nic do zrobienia.

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

Oblicz minimalną liczbę is w dowolnej linii.

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

Propaguj do innych linii.

i

Usuń is, wykonując w ten sposób wymagane kerning.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.