打高尔夫球ASCII艺术的技巧


18

我认为PPCG上的ASCII艺术问题很有趣,但是我个人认为这可能很难,尤其是当该问题标记为

我想知道这里是否有人会提供一些对产生ASCII艺术有用的技巧。

简单地排列字符很容易,但是使用(简短)算法,事情将变得更加复杂。

我说的是ASCII艺术,例如:

  • 文本转ASCII文字(字符)
  • 图片(徽标或图标)

我只是在寻找一般性提示,但是允许使用特定于语言的提示,因为大多数提示都可以翻译。

Answers:


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 2014年

@FireFly谢谢!我不知道有个名字。
Florent 2014年

用同等语言(用我的语言),它可以进一步扩展,因为它支持编码为以62为底的整数:[0-9A-Za-z]
Cyoce 2015年

5

寻找对称

有时所需的ASCII文字在某些时候是对称的。例如,Argyle ASCII Art需要类似以下的输出:

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

可以正常打印此代码,但是根据语言的不同,可以通过仅生成结果的上半部分,将其取反并交换/和来缩短所需的代码\

尝试移调

ASCII Art Archery Arrows中,要打印的结果是这样,按比例缩放到给定的n

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

如果我们看一下箭头,我们可以看到有8种线:

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

让我们对其转置进行相同的尝试。

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

在这里,有10种线。

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

但是这里有个要点:底部5与顶部5相同,除了交换/\。按照前面的规则,您可以首先生成前5个,复制,进行交换,最后转置以获得箭头。这样可以节省很多代码。


5

控制字符,转义序列和控制台代码

除非问题禁止,否则关于Meta的当前共识是ASCII艺术挑战不需要特定的字节流,而是输出看起来正确。

这意味着,假设支持终端,我们可以在答案中使用ASCII控制字符ANSI转义序列Linux控制台代码

除非另有说明,否则本答案的其余部分将说明Linux终端的行为,这是我现在可以测试的东西。

ASCII控制字符

支持/解释因终端和终端以及字符而异。最便携的一个应该是换行(\n\x0a),其移动所述字符到下一行的开头。

其他有用的字符包括:

  • 垂直标签(\v\x0b)将光标向右移动一个位置,然后向下移动一个位置。

    $ echo -e 'a\vb'
    a
     b
    
  • 回车键(\r\x0d)将光标移动到当前行的开头。任何后续可打印字符将覆盖当前行的第一个字符。

    $ echo -e 'ab\rc'
    cb
    
  • 退格键(\b\x08)将光标向左移动一个位置。任何后续可打印字符将覆盖退格符之前的字符。

    $ echo -e 'ab\bc'
    ac
    
  • 转义(\e\x1b)本身不执行任何操作,而是构成ANSI转义序列(可选)和Linux控制台代码的一部分。

许多语言在源代码中都允许使用实际的控制字符。

ANSI转义序列

(尚未到来)

Linux控制台代码

尽管还有更多,但对于ASCII艺术最有用的控制台代码可能是:

  • 该序列\ec重置终端。这将清除屏幕,将光标移到左上角,并将前景色和背景色,光标闪烁速率等设置为其默认值。

  • 该序列将\eM导致反向换行,即光标将向上移动一个位置。

    $ echo -e '\na\eMb\n'
     b
    a
    
  • 该序列\eH制表位设置在当前列。

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

2

寻找图案

这可能有点明显,但是...在输出中查找模式,相似性和重复项。例如,当我看到将数字转换为7段显示模式任务时,我开始考虑如何打高尔夫球,并开始寻找相似之处。由于水平段在字符矩阵中位于垂直段之间的方式,一次处理三个段可能是最容易的,因此将它们分组在一起(为第一个,最顶部的段添加两个“总是空的”段) :

段摸索

因此,你可以不喜欢lc + " "*N + rc + "\n"N-1次,然后lc + bc*N + rc一次,每三个段(lcbcrc是左,自下而上,右段字符,即一个|_ )。


2

使用基本转换

这个答案是一个想要由字符组成的ASCII艺术的问题+ |-和换行符。由于只有5个可能的字符,因此可以将这些字符视为基数5并转换为字节,每个字节包装3.45个字符。

利用规律

通常,数据会具有某些规律性,即使这些规律性不足以使用诸如镜像之类的特定工具也是如此。例如,在上面的问题中,由于文本是大致矩形的,因此在整个测试中,所需的输出的换行符大致均匀。我利用Pyth的n分割函数,然后在换行符上进行连接,从而缩短了代码长度。

了解您的工具,然后为工作选择合适的工具。

我知道最强大,最高效的文本处理工具是:

正则表达式引擎:///,Retina,Perl,按功率/简明性折衷的顺序排列。

如果您想做的事情可以在正则表达式替换中简要描述,则使用此答案

晦涩的文本处理工具:gema等(我敢肯定还有其他工具,但是它们太晦涩了)

如果它们具有您所需要的功能,则没有其他任何功能。比如这个问题,与gema进行递归匹配。

高尔夫球通用代码:CJam,Pyth等

如果您要充分利用一些复杂的功能,以至于没有其他工具可以完成这项工作,或者只是缩短了工作时间,请使用此功能。

尝试多种方法

这适用于每个代码高尔夫球问题,尤其是此处。在尝试之前,您不会知道规则是否可被利用。可能是多种语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.