Einführung
Kerning bedeutet, den Abstand zwischen den Buchstaben eines Textes anzupassen. Betrachten Sie als Beispiel das Wort, Top
das mit den folgenden drei Glyphen geschrieben wurde:
##### ..... .....
..#.. ..... .....
..#.. ..##. .###.
..#.. .#..# .#..#
..#.. .#..# .#..#
..#.. ..##. .###.
..... ..... .#...
..... ..... .#...
Wir könnten einfach die Lücken zwischen den Glyphen mit Punkten füllen und damit fertig werden, aber die Lücken sehen irgendwie zu groß aus. Stattdessen schieben wir die Glyphen nach links, sodass sie sich fast berühren:
#####........
..#..........
..#..##..###.
..#.#..#.#..#
..#.#..#.#..#
..#..##..###.
.........#...
.........#...
Das sieht viel besser aus! Beachten Sie, wie sich der Balken von T
über dem linken Rand von befindet o
. In dieser Herausforderung besteht Ihre Aufgabe darin, ein einfaches Kerning-Programm für solche rechteckigen Glyphen zu implementieren.
Der Kerning-Prozess
Betrachten wir zwei rechteckigen 2D Character - Arrays .
und #
der gleichen Form. In unserem einfachen Kerning-Prozess platzieren wir zuerst die Arrays nebeneinander, wobei eine Spalte mit .
s dazwischen steht. Dann bewegen wir jedes #
im rechten Array einen Schritt nach links, bis einige #
s des linken und rechten Arrays orthogonal oder diagonal benachbart sind. Das Ergebnis des Kernings ist der Schritt, bevor wir benachbarte #
s einführen . Ihre Aufgabe ist es, diesen Prozess zu implementieren.
Nehmen wir ein Beispiel:
Inputs:
..###
#....
#....
..##.
...#.
...##
..###
....#
Process:
..###....#.
#........##
#.......###
..##......#
..###...#.
#.......##
#......###
..##.....#
..###..#.
#......##
#.....###
..##....#
..###.#.
#.....##
#....###
..##...#
..####.
#....##
#...###
..##..#
Im letzten Array haben wir neue benachbarte Paare von #
s, sodass das vorletzte Array das Ergebnis des Kerning-Prozesses ist.
Ein- und Ausgabe
Der Einfachheit halber müssen Sie nur das Kerning von zwei Glyphen behandeln. Ihre Eingaben sind zwei rechteckige 2D-Arrays in einem der folgenden Formate:
- 2D-Arrays von Ganzzahlen, wobei 0 für
.
und 1 für steht#
. - Mehrzeilige Zeichenfolgen
.#
. - Arrays von Saiten über
.#
. - 2D-Arrays der Zeichen
.#
.
Wenn die Eingaben als einzelne Zeichenfolge verwendet werden, können Sie ein beliebiges sinnvolles Trennzeichen verwenden. Das Trennzeichen sollte sich jedoch zwischen den beiden Arrays befinden, was bedeutet, dass Sie die beiden bereits gepaarten Eingaben nicht zeilenweise übernehmen dürfen.
Ihre Ausgabe ist das Ergebnis des Kerning-Prozesses, der auf diese beiden Arrays angewendet wird. Dabei handelt es sich um ein rechteckiges 2D-Array im gleichen Format wie die Eingaben. Sie können beliebig viele führende oder nachfolgende Spalten von .
s hinzufügen oder entfernen. Die Ausgabe muss jedoch rechteckig sein und dieselbe Höhe wie die Eingaben haben. Es ist garantiert, dass der Kerning-Prozess endet, bevor die linke Kante der zweiten Eingabe über die linke Kante der ersten Eingabe gleitet.
Regeln und Wertung
Die niedrigste Byteanzahl in jeder Programmiersprache gewinnt. Es gelten die Standardregeln für Code-Golf .
Testfälle
Um das Einfügen zu erleichtern, werden diese Testfälle als Listen von Zeichenfolgen angegeben.
["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
quelle
Antworten:
APL (Dyalog Classic) ,
40 bis39 Byte-1 Danke an Erik den Outgolfer
Probieren Sie es online!
quelle
Python 3 , 154 Bytes
Probieren Sie es online!
quelle
Netzhaut , 223 Bytes
Probieren Sie es online! Link enthält Testfälle und ein Headerskript, um sie auf das bevorzugte Eingabeformat von zwei durch neue Zeilen getrennten Zeichenfolgen zu formatieren. Dies scheint zu lang, aber es gibt wahrscheinlich einen Randfall, den ich übersehen habe, aber er besteht jetzt zumindest alle Testfälle. Erläuterung:
Verbinden Sie die beiden Eingabearrays mit einem Buchstaben
i
als Trennzeichen. (Dies ermöglicht die Verwendung von\W
und\b
später.)Ändern Sie beim Join alle
.
s ini
s.Ändern Sie alle
i
s unter#
s in@
s.Ändern Sie alle
i
s über#
s in@
s.Ändern Sie alle
@
s in.
s und allei
s neben@
s oder#
s.Wenn
#
hinter einem kein stehti
, ändern Sie das benachbarte.
zurück in eini
erneutes.Wenn es eine Zeile ohne
i
s gibt, ändern Sie allei
s in.
s, da hier nichts zu tun ist.Berechnen Sie die Mindestanzahl von
i
s in einer beliebigen Zeile.Propagiere zu den anderen Zeilen.
Löschen Sie das
i
s und führen Sie so den erforderlichen Kerning durch.quelle