Implementieren Sie vereinfachtes Kerning

24

Einführung

Kerning bedeutet, den Abstand zwischen den Buchstaben eines Textes anzupassen. Betrachten Sie als Beispiel das Wort, Topdas 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 .

Testfälle

Um das Einfügen zu erleichtern, werden diese Testfälle als Listen von Zeichenfolgen angegeben.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
Zgarb
quelle
Visualizer . Testfall 5 scheint falsch zu sein.
user202729
@ user202729 Danke, es ist jetzt behoben. Ich habe mehrere Runden durchlaufen, um die Testfälle im Sandkasten zu reparieren, und anscheinend habe ich diese verpasst.
Zgarb 20.11.17
Auch wenn sich die beiden Zeichen "durchschlagen", was soll das Programm tun?
user202729
@ user202729 Sie können davon ausgehen, dass dies nicht der Fall ist. Siehe den letzten Satz des Abschnitts "Ein- und Ausgabe".
Zgarb 20.11.17

Antworten:

2

Python 3 , 154 Bytes

lambda a,b,p=".":[c.rstrip(p)+d.lstrip(p).rjust(max(len((d+c).strip(p))for(c,d)in zip((a*3)[1:],b[:-1]+b+b[1:]))+1-len(c.rstrip(p)),p)for(c,d)in zip(a,b)]

Probieren Sie es online!

rekursiv
quelle
2

Netzhaut , 223 Bytes

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

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:

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

Verbinden Sie die beiden Eingabearrays mit einem Buchstaben ials Trennzeichen. (Dies ermöglicht die Verwendung von \Wund \bspäter.)

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

Ändern Sie beim Join alle .s in is.

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

Ändern Sie alle is unter #s in @s.

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

Ändern Sie alle is über #s in @s.

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

Ändern Sie alle @s in .s und alle is neben @s oder #s.

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

Wenn #hinter einem kein steht i, ändern Sie das benachbarte .zurück in ein ierneutes.

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

Wenn es eine Zeile ohne is gibt, ändern Sie alle is in .s, da hier nichts zu tun ist.

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

Berechnen Sie die Mindestanzahl von is in einer beliebigen Zeile.

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

Propagiere zu den anderen Zeilen.

i

Löschen Sie das is und führen Sie so den erforderlichen Kerning durch.

Neil
quelle