時々、ここの質問はいくつかのASCIIアートを描くように求めます。アートのデータを保存する簡単な方法の1つは、RLE(ランレングスエンコーディング)です。そう:
qqqwwwwweeerrrrrtttyyyy
になる:
3q5w3e5r3t4y
大きなASCIIアートを描くために、次のようなデータを取得している可能性があります(改行文字は無視されます)。
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
ASCIIアートに使用される文字は、小文字、大文字、数字ではなく、記号、マーク、記号のみですが、常に印刷可能なASCII文字セットになっています。
その文字列のスペースを節約したいので、数字を大文字の文字セットで置き換えます( 'A'は1に等しく、 'B'は2に等しくなり、 'Z'が26に等しくなります)。文字を26回以上繰り返す。だからあなたは得る:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
そして最後に、(文字+記号)のいくつかのグループが繰り返されていることに気づくので、文字列に3回以上出現するグループを、文字列の順序または出現順に小文字の文字セットで置き換えますが、バッファーに格納します置換(置換ごとに "group + substitution char"の形式)が行われ、残りの文字列はそのままになります。したがって、次のグループ:
S, (3 times)
T (4 times)
K@ (3 times)
26個を超えるグループが繰り返されることはないため、それぞれ「a」、「b」、「c」で置き換えられます。だから最後にあなたは得る:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[最後の手順では、置換後に実際に文字を保存するグループが4回以上表示されるため、1バイトしか保存されません。]
チャレンジ
(提案された制限付きで)ASCIIアートを描画するためのRLEデータを含む文字列が与えられた場合、記述されているようにそれを圧縮するためにできる限り短いプログラム/関数/メソッドを記述します。アルゴリズムは2つの文字列を出力/返す必要があります。最初の文字列は圧縮に使用される辞書を含み、2番目の文字列は結果の圧縮文字列です。文字列は、タプル、配列、リストなど、指定した順序で返すことができます。
手順2で文字列を圧縮できない場合、アルゴリズムは最初の戻り値として空の文字列を返し、2番目の戻り値として手順1の結果を返す必要があります。
ステップ1の結果を出力値に含める必要はありません。明確にするために、例にそれらを含めるだけです。
これはコードゴルフなので、各言語の最短の答えが勝つかもしれません!
別のテストケース
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
は、S,T K@
そこから簡単に推定できる置換文字に明示的に名前を付けずに、おそらく格納されます。