我认为PPCG上的ASCII艺术问题很有趣,但是我个人认为这可能很难,尤其是当该问题标记为code-golf时。
我想知道这里是否有人会提供一些对产生ASCII艺术有用的技巧。
简单地排列字符很容易,但是使用(简短)算法,事情将变得更加复杂。
我说的是ASCII艺术,例如:
- 文本转ASCII文字(字符)
- 图片(徽标或图标)
我只是在寻找一般性提示,但是允许使用特定于语言的提示,因为大多数提示都可以翻译。
我认为PPCG上的ASCII艺术问题很有趣,但是我个人认为这可能很难,尤其是当该问题标记为code-golf时。
我想知道这里是否有人会提供一些对产生ASCII艺术有用的技巧。
简单地排列字符很容易,但是使用(简短)算法,事情将变得更加复杂。
我说的是ASCII艺术,例如:
我只是在寻找一般性提示,但是允许使用特定于语言的提示,因为大多数提示都可以翻译。
Answers:
您可以对字符串应用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"
[0-9A-Za-z]
有时所需的ASCII文字在某些时候是对称的。例如,Argyle ASCII Art需要类似以下的输出:
/\ /\
/ \ /\ / \
/\/ \/ \/ \/\
\/\ /\ /\ /\/
\ / \/ \ /
\/ \/
可以正常打印此代码,但是根据语言的不同,可以通过仅生成结果的上半部分,将其取反并交换/
和来缩短所需的代码\
。
在ASCII Art Archery Arrows中,要打印的结果是这样,按比例缩放到给定的n
:
/\
/ \
/ \
/ \
\ /
\____/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
/| |\
/ | | \
/ | | \
/ | | \
/ | | \
/ |__| \
/ / \ \
/ / \ \
// \\
/ \
如果我们看一下箭头,我们可以看到有8种线:
/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \
让我们对其转置进行相同的尝试。
///////
/ /
/\ / /
/ \ / /
/ _||||||||||||||||||||||
/ _ _
\ _ _
\ _||||||||||||||||||||||
\ / \ \
\/ \ \
\ \
\\\\\\\
在这里,有10种线。
/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\
但是这里有个要点:底部5与顶部5相同,除了交换/
和\
。按照前面的规则,您可以首先生成前5个,复制,进行交换,最后转置以获得箭头。这样可以节省很多代码。
除非问题禁止,否则关于Meta的当前共识是ASCII艺术挑战不需要特定的字节流,而是输出看起来正确。
这意味着,假设支持终端,我们可以在答案中使用ASCII控制字符,ANSI转义序列和Linux控制台代码。
除非另有说明,否则本答案的其余部分将说明Linux终端的行为,这是我现在可以测试的东西。
支持/解释因终端和终端以及字符而异。最便携的一个应该是换行(\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控制台代码的一部分。
许多语言在源代码中都允许使用实际的控制字符。
(尚未到来)
尽管还有更多,但对于ASCII艺术最有用的控制台代码可能是:
该序列\ec
将重置终端。这将清除屏幕,将光标移到左上角,并将前景色和背景色,光标闪烁速率等设置为其默认值。
该序列将\eM
导致反向换行,即光标将向上移动一个位置。
$ echo -e '\na\eMb\n'
b
a
该序列\eH
将制表位设置在当前列。
$ echo -e ' \eHa\n\tb'
a
b
这可能有点明显,但是...在输出中查找模式,相似性和重复项。例如,当我看到将数字转换为7段显示模式任务时,我开始考虑如何打高尔夫球,并开始寻找相似之处。由于水平段在字符矩阵中位于垂直段之间的方式,一次处理三个段可能是最容易的,因此将它们分组在一起(为第一个,最顶部的段添加两个“总是空的”段) :
因此,你可以不喜欢lc + " "*N + rc + "\n"
N-1次,然后lc + bc*N + rc
一次,每三个段(lc
,bc
,rc
是左,自下而上,右段字符,即一个|
,_
或
)。
这个答案是一个想要由字符组成的ASCII艺术的问题+ |-
和换行符。由于只有5个可能的字符,因此可以将这些字符视为基数5并转换为字节,每个字节包装3.45个字符。
通常,数据会具有某些规律性,即使这些规律性不足以使用诸如镜像之类的特定工具也是如此。例如,在上面的问题中,由于文本是大致矩形的,因此在整个测试中,所需的输出的换行符大致均匀。我利用Pyth的n分割函数,然后在换行符上进行连接,从而缩短了代码长度。
我知道最强大,最高效的文本处理工具是:
正则表达式引擎:///
,Retina,Perl,按功率/简明性折衷的顺序排列。
如果您想做的事情可以在正则表达式替换中简要描述,则使用此答案
晦涩的文本处理工具:gema等(我敢肯定还有其他工具,但是它们太晦涩了)
如果它们具有您所需要的功能,则没有其他任何功能。比如这个问题,与gema进行递归匹配。
高尔夫球通用代码:CJam,Pyth等
如果您要充分利用一些复杂的功能,以至于没有其他工具可以完成这项工作,或者只是缩短了工作时间,请使用此功能。
这适用于每个代码高尔夫球问题,尤其是此处。在尝试之前,您不会知道规则是否可被利用。可能是多种语言。