Wprowadzenie
Kerning oznacza dostosowanie odstępów między literami tekstu. Jako przykład rozważmy słowo Top
napisane 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 gry w golfa .
Przypadki testowe
Aby pomóc w wklejaniu kopii, te przypadki testowe podano jako listy ciągów.
["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
źródło
Odpowiedzi:
APL (Dyalog Classic) ,
4039 bajtów-1 dzięki Erikowi Outgolfer
Wypróbuj online!
źródło
Python 3 , 154 bajtów
Wypróbuj online!
źródło
Siatkówka , 223 bajty
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:
Połącz ze sobą dwie tablice wejściowe, używając litery
i
jako separatora. (Pozwala to na użycie\W
i\b
później.)Zmienić wszystkie
.
s doi
s przy łączeniu.Zmień wszystkie
i
s poniżej#
s na@
s.Zmień wszystkie
i
s powyżej#
s na@
s.Zmień wszystkie
@
s na.
s plus wszystkiei
s przylegające do@
s lub#
s.Jeśli nie ma
#
po nimi
, zmień sąsiednie.
plecy nai
ponownie.Jeśli istnieje linia bez
i
s, zmień wszystkiei
s na.
s, ponieważ nie ma tu nic do zrobienia.Oblicz minimalną liczbę
i
s w dowolnej linii.Propaguj do innych linii.
Usuń
i
s, wykonując w ten sposób wymagane kerning.źródło