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.

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

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.