簡易カーニングを実装する


24

前書き

カーニングとは、テキストの文字間の間隔を調整することを意味します。例として、Top次の3つのグリフで書かれた単語を考えます。

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

グリフ間のギャップをドットで埋めて完了させることもできますが、ギャップはどうやら広すぎるように見えます。代わりに、グリフを左にスライドさせて、ほとんど触れないようにします。

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

これはずっと良く見える!のバーがTの左の境界線の上にあることに注意してくださいo。この課題では、このような長方形のグリフに簡単なカーニングプログラムを実装することがタスクです。

カーニングプロセス

二長方形の2次元文字配列考える.#同じ形状を。単純なカーニングプロセスでは、最初に1列の.sを挟んで配列を並べて配置します。次に、#右と左の配列のいくつか#が直交または斜めに隣接するまで、右の配列のそれぞれを左に1ステップ移動します。カーニングの結果は、隣接するを導入するのステップ#です。あなたの仕事は、このプロセスを実装することです。

例を見てみましょう:

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

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

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

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

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

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

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

最後の配列には#sの新しい隣接ペアがあるため、最後から2番目の配列はカーニングプロセスの結果です。

入出力

簡単にするために、2つのグリフのカーニングのみを処理する必要があります。入力は、次のいずれかの形式の2つの長方形の2D配列です。

  • 整数の2D配列。0はを表し、.1 はを表します#
  • 上の複数行の文字列.#
  • 上の文字列の配列.#
  • 文字の2D配列.#

入力が単一の文字列として取得される場合、適切な区切り文字を使用できます。ただし、区切り文字は2つの配列間を移動する必要があります。つまり、行ごとに既にペアになっている2つの入力を取得することはできません。

出力は、これらの2つの配列に適用されたカーニングプロセスの結果であり、入力と同じ形式の長方形の2D配列です。.sの任意の数の先頭または末尾の列を追加または削除できますが、出力長方形で、入力と同じ高さでなければなりません。カーニングプロセスは、2番目の入力の左端が最初の入力の左端の上をスライドする前に終了することが保証されています。

ルールとスコアリング

各プログラミング言語の最低バイト数が優先されます。標準の規則が適用されます。

テストケース

コピー&ペーストを支援するために、これらのテストケースは文字列のリストとして提供されます。

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

ビジュアライザ。テストケース5は間違っているようです。
user202729

@ user202729ありがとう、今は修正されています。サンドボックス内のテストケースを修正するために数ラウンドを行ったが、どうやらそれを見逃したようだ。
ズガーブ

また、2つの文字が互いに「フォールスルー」する場合、プログラムは何をすべきですか?
user202729

@ user202729それは起こらないと仮定できます。セクション「入力および出力」の最後の文を参照してください。
ズガルブ

回答:




2

網膜、223バイト

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

オンラインでお試しください!リンクには、2つの改行で区切られた文字列の優先入力形式に再フォーマットするテストケースとヘッダースクリプトが含まれています。これは長すぎるように見えますが、おそらく私が見落としたエッジケースがありますが、少なくとも今はすべてのテストケースに合格しています。説明:

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

iセパレーターとして文字を使用して、2つの入力配列を結合します。(これにより\W\b以降の使用が可能になります。)

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

結合時にすべて.のをに変更しますi

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

isの下#のすべてのsを@sに変更します。

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

i#のすべてのをに変更します@ sに。

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

すべての@sを.sに変更し、さらにsまたはsにi隣接するすべてのsを変更します。@#

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

#後にない場合はi、隣接するものを.再びに変更iします。

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

is がない行がある場合、ここでは何もすることがないため、すべてのisを.sに変更します。

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

i任意の行のsの最小数を計算します。

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

他の行に伝播します。

i

isを削除して、必要なカーニングを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.