ASCIIアートをゴルフするためのヒント


18

PPCGのASCIIアートの質問は楽しいと思いますが、個人的には、特に質問がとしてタグ付けされている場合は、かなり難しいと思います。

ここに誰かがASCIIアートの制作に役立つヒントを持っているのではないかと思います。

単純に文字を配置するのは簡単ですが、(短い)アルゴリズムでは、事態はより複雑になります。

私は次のようなASCIIアートについて話している:

  • テキストからASCIIアート(文字)
  • 画像(ロゴまたはアイコン)

一般的なヒントを探していますが、ほとんどの言語はとにかく翻訳できるので、言語固有のものを使用できます。

回答:


8

圧縮アルゴリズム

LZMA圧縮を文字列に適用できます。
多くの言語がサポートしています。

ランレングスエンコーディング

[char][number](例b12)などの処理命令を使用できます。
この圧縮アルゴリズムはここで使用されます:https : //codegolf.stackexchange.com/a/20589/10920

さらに読む:http : //en.wikipedia.org/wiki/Run-length_encoding

整数パッキング

整数の配列を使用して、次のような小さな形状を保存できます。

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

    ##          ##    
      ##      ##      
    ##############    
  ####  ######  ####  
######################
##  ##############  ##
##  ##          ##  ##
      ####  ####       

各スペースはに変換されます0
各シャープはに変換されます1

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

次に、ビットごとの演算子を使用して各ビットを読み取ります&

上記のアルゴリズムは、より大きな整数ベースを使用することで改善できます。

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
あなたの処理命令は、一般的として知られているランレングス符号化 FYI、。
FireFly 14

@FireFlyありがとう!その名前があるとは知りませんでした。
フローレント14

それはベース62までのエンコードされた整数をサポートして額面(私の言語)で、これはさらに拡張することができます:[0-9A-Za-z]
Cyoce

5

対称性を探す

必要なASCIIアートは、ある時点で対称的である場合があります。たとえば、Argyle ASCII Artでは、次のような出力が必要です。

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

これを通常どおり印刷することもできますが、言語によっては、結果の上半分を生成し、それを逆にしてスワップ/とandを交換するだけで、必要なコードを短縮できます\

移調してみてください

ではASCIIアートアーチェリーの矢の印刷に結果が与えられたにスケーリング、これですn

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

矢印を見ると、8種類の線があることがわかります。

/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \

転置についても同じことを試してみましょう。

                         ///////
                        /     / 
   /\                  /     /  
  /  \                /     /   
 /   _||||||||||||||||||||||    
/    _                     _    
\    _                     _    
 \   _||||||||||||||||||||||    
  \  /                \     \   
   \/                  \     \  
                        \     \ 
                         \\\\\\\

ここには、10種類の行があります。

/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\

ただし、ここで問題に/なり\ます。スワッピングとを除いて、ボトム5はトップ5と同じです。前のルールに従って、最初の5つを生成し、コピーし、スワップを行い、最後に転置して矢印を取得します。これにより、多くのコードを節約できます。


5

制御文字、エスケープシーケンス、およびコンソールコード

質問で禁止されていない限り、メタに関する現在のコンセンサスは、ASCIIアートの課題には特定のバイトストリームは必要ないが、正しいように見える出力であるということです。

これは、サポート端末を想定して、ASCII制御文字ANSIエスケープシーケンスLinuxコンソールコードを回答で使用できることを意味します。

特に明記されていない限り、この回答の残りの部分では、Linuxターミナルの動作について説明します。これは、現時点でテストに使用できるものです。

ASCII制御文字

サポート/解釈は、端末や端末ごとに異なります。最もポータブルなのは、文字を次の行の先頭に移動するラインフィード(\n\x0a)である必要があります。

その他の便利なキャラクターは次のとおりです。

  • 垂直タブ(\v\x0b)は、カーソルを1つ右に移動してから、1つ下に移動します。

    $ echo -e 'a\vb'
    a
     b
    
  • キャリッジリターン(\r\x0d)は、カーソルを現在の行の先頭に移動します。後続の印刷可能文字は、現在の行の最初の文字を上書きします。

    $ echo -e 'ab\rc'
    cb
    
  • バックスペース(\b\x08)は、カーソルを1つ左に移動します。後続の印刷可能文字は、バックスペースの前の文字を上書きします。

    $ echo -e 'ab\bc'
    ac
    
  • エスケープ(\e\x1b)は、それ自体では何も行いませんが、ANSIエスケープシーケンス(オプション)およびLinuxコンソールコードの一部を形成します。

多くの言語では、ソースコードで実際の制御文字を使用できます。

ANSIエスケープシーケンス

(まだこない)

Linuxコンソールコード

さらに多くありますが、ASCIIアートに最も役立つコンソールコードはおそらく次のとおりです。

  • シーケンス\ecは端末をリセットします。これにより、画面がクリアされ、カーソルが左上隅に移動し、前景色と背景色、カーソルの点滅速度などがデフォルト値に設定されます。

  • このシーケンス\eMにより、逆改行が発生します。つまり、カーソルが1つ上に移動します。

    $ echo -e '\na\eMb\n'
     b
    a
    
  • シーケンス\eHは、現在の列にタブストップを設定します

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

パターンを探す

これは少し明白かもしれませんが、...出力、パターン、類似点、および繰り返しを探してください。たとえば、7セグメントディスプレイパターンに数字を変換するタスクを見たとき、どのようにゴルフできるかを考え始め、類似点を探し始めました。水平方向のセグメントが文字マトリックスの垂直方向のセグメント間を移動する方法のため、一度に3つのセグメントを扱い、グループ化するのが最も簡単でしょう(最初の最上部に2つの「常に空の」セグメントを追加します) :

模索セグメント

このように、あなたのような何かを行うことができlc + " "*N + rc + "\n"、その後N-1回とlc + bc*N + rc、すべての三つのセグメント(のために、一度lcbcrc左され、ボトム、および右セグメント文字、すなわちの1 |_または )。


2

基本変換を使用する

この答えは、文字+ |-と改行で構成されるASCIIアートが必要な質問に対するものでした。使用可能な文字は5つしかないため、これらは基数5の数値として処理され、バイトに変換され、バイトあたり3.45文字をパッキングできます。

エクスプロイトの規則性

多くの場合、それらの規則性がミラーリングなどの特定のツールを使用するのに十分ではない場合でも、データにはいくつかの規則性があります。たとえば、上記の質問では、テキストがほぼ長方形であるため、テスト全体で目的の出力に改行がほぼ均等に配置されていました。Pythのn個の関数への分割機能を使用し、改行で結合することにより、これを利用してコードを短縮しました。

ツールを理解し、仕事に適したツールを選択してください。

私が知っている最も強力で効率的なテキスト処理ツールは次のとおりです。

正規表現エンジン:///、Retina、Perl、パワー/簡潔さのトレードオフの順。

あなたがやりたいことが、この答えのように、正規表現の置換で簡潔に記述できる場合に使用します

あいまいなテキスト処理ツール:gemaなど(他にもあると確信していますが、あまりにもあいまいです)

必要な機能が他にない機能を持っている場合に使用します。このようなのように、この質問、GEMAの再帰的なマッチングを持ちます。

一般的なコードのゴルフ言語:CJam、Pythなど。

あなたが他のツールが仕事をしないか、またはそれが仕事をより短くするほど十分に微妙な複雑さを悪用しているならば、使用してください。

多くのアプローチを試してください

これはすべてのコードゴルフの質問に当てはまりますが、特にここでは当てはまります。あなたはそれを試すまで規則性が悪用可能であるかどうかを知るつもりはありません。おそらく複数の言語で。

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