您的目标是编写输出“ Hello-World!”的最短程序。作为ASCII艺术。
规则:
- 它必须是人类可读的,我不在乎它的大小(cols / rows)
- 输出中只能包含空格(“”),尖号(“#”)和换行符
- 输出必须使用等宽字体(但字母不必使用等宽字体)
- 结果,每个字符必须彼此隔开至少一个空格
请在代码中添加标题以及语言和字节数。
您的目标是编写输出“ Hello-World!”的最短程序。作为ASCII艺术。
规则:
请在代码中添加标题以及语言和字节数。
Answers:
我绝对喜欢这个
好吧,我想提出一些优雅的解决方案,但是@Ilmari Karonen用unpack
... 挑战了我……不应该那样做:-)
好吧,这个92 88 69个chars代码生成了类似于@Ilmari Karonen的难看的,不可读的输出:
say map{y/01/ #/r}unpack"((b6)7a)*",'eT@j@DE
UUBjdeE
wTujjTA
eUBTddE'
更优雅的变体而无需打开包装(88个字符):
map{print$"x$_,$/x/4/,"#"x!/7/}7&ord,7&ord>>3for'HRyYOKLIIjIRHBa@AJIAIIIJaQHQNSRH'=~/./g
但是我认为|。| e || .- |||。,d!没有什么比Hello-World更像!并且不应被允许,所以真正的解决方案就在这里-解压缩变体,共87个字符:
say map{y/01/ #/r}unpack"((b6)9a)*",'E`D@HB@Hd
EcD@HB@Hd
ggDsIbaIf
e`dDhRRHE
ECICPaQPf'
输出:
98个字符的更优雅的变体:
map{print$"x$_,$/x/1/,"#"x!/7/}7&ord,7&ord>>3for'PW{nw^QD[w}vK@X@PcP@jCDjXQk[rRRbSQD\CWbXeX'=~/./g
输出:
较旧的解决方案(114个字符),不同的编码类型:
print'#'x(3&ord),$"x($:=15&ord>>2),$/x!$:for'EmM}U}]MBEQSM}U}]MBOFNMQOKUMSKUOBEM]MMM]IIIMIUQIAEQWMMgFROYQOB'=~/./g
输出:
c=document.createElement("canvas").getContext("2d");c.fillText("Hello-World!",0,7);d=c.getImageData(1,0,56,7).data;s="";for(i=3;i<1568;i+=4){s+=d[i]?"#":" ";s+=(i+1)%224?"":"\n"}
在Firefox 27 Scratchpad中有效。
# # # # # # # # # #
# # # # # # # # # # #
# # ## # # ## # # # # ## ## # ### #
##### # # # # # # # # # # # # # # # # #
# # #### # # # # ## # # # # # # # # # # #
# # # # # # # # # # # # # # # # #
# # ### # # ## # # ## # # ### #
这将对表达式进行栅格化,获得二进制图像数据,将每个1转换为“#”,将每个0转换为“”(空白),并以12 x 130字符网格显示输出。
GraphicsGrid[ImageData@ImageResize[Binarize@Rasterize@Style["Hello-World!",99],130]
/.{1→"",0→"#"}]
乔纳森·范·马特雷(Jonathan Van Matre)节省了一个角色。
var s:tstringlist;begin s:=tstringlist.Create;s.LoadFromFile('\a');Write(s.Text);end.
我知道,这不是最漂亮的解决方案,但是没有规则说您不能使用外部资源。
结果:
TStrings
。(但请保留实例化TStringList
。)
do X
。“外部资源”的内容X
未指定(对我
注意:这是此答案的第二个版本。对于使用PHP和gzinflate()的原始64字节/ 95字符版本,请参见此答案的历史记录。
这是71个字符的可打印ASCII版本:
y/01/ #/,say for unpack'(B40)4',unpack u,'4I*`1`(JJI!$FFNRJU52HIJ0*))H'
54字节的版本包含不可打印的字符,因此我将其作为十六进制转储提供。在Unixish系统上,您可以xxd -r
用来将十六进制转储重新转换为可执行的Perl脚本:
0000000: 792f 3031 2f20 232f 2c73 6179 2066 6f72 y/01/ #/,say for
0000010: 2075 6e70 6163 6b27 2842 3430 2934 272c unpack'(B40)4',
0000020: 27a4 a011 008a aaa4 1126 9aec aad5 54a8 '........&....T.
0000030: a6a4 0a24 9a27 ...$.'
两者都需要一起运行perl -M5.010
才能启用Perl 5.10+ say
功能。他们将产生以下输出:
(显示为屏幕截图,因为SE上的巨大行高使ASCII艺术很难看懂。小写的“ e”有点尴尬,但我相信这几乎可以理解为可读性。)
附言 如果上述解决方案的输出对您来说太简单了,请使用以下92个字符的变体,产生类似于Tomas解决方案的输出:
y/01/ #/,say for unpack'(B56)*',unpack u,'CH!(`"(`"":,2``B``@GGDC\'(C#(YI!)("I)"2*,),`4,03D'
这是屏幕截图:
点子 我很确定这(GolfScript,51个字符)是最短的可打印ASCII解决方案,如果您不算那些仅称横幅/ FIGLet或以其他方式作弊的代码:
'iJ@Q@HmURBIMM{JkUUJeMRAQIM'{2base(;{' #'=}/}%39/n*
输出结果与上面的71个字符的Perl解决方案相同。
unpack
:-) 来挑战我的:-)找到了一个69个字符的解决方案(其中87个具有我的出色输出)。
$ figlet -w 90 -f banner Hello-World!
# # # # ###
# # ###### # # #### # # # #### ##### # ##### ###
# # # # # # # # # # # # # # # # # ###
####### ##### # # # # ##### # # # # # # # # # # #
# # # # # # # # # # # # ##### # # #
# # # # # # # # # # # # # # # # # ###
# # ###### ###### ###### #### ## ## #### # # ###### ##### ###
-f banner
这是我发现的第一个使用#而不是*或|的字体。和_。
>>> print'eJyNkFEKwDAIQ/93isC7/x3LyIJullHrR1BfJSIJPUHTlmiUPHbxC7L56wNCgZAxv3SjDWIxsoOb\nzMaBwyHYPJ5sVPNYxXism74vcIsFZlYyrg=='.decode('base64').decode('zip')
# # # # # # # # # #
# # # # # # # # # # #
# # ## # # ## # # # # ## ## # ### #
##### # # # # # # # # # # # # # # # # #
# # #### # # # # ## # # # # # # # # # # #
# # # # # # # # # # # # # # # # #
# # ### # # ## # # ## # # ### #
>>> print'eJxTVlBWgCAgAQHKqBywAJeyAgJCZREcZWUYyaUMIpUVEKqRNcLEueDqEaZBLVVWQDITADIdFBw='.decode('base64').decode('zip')
# # # # # # # # # # #
# # # # # # # # # # # ## # ## #
### ## # # # # ## # # # # # # # # #
# # ## # # # # # # # # ## #
我使用base64编码的压缩数据。然后代码从base64编码中解码出来,然后解压缩。
使用sebcap26的ASCII艺术作为来源...
foreach(str_split(base64_decode('iASAERACCYgEgBKQAgmIxIwKoxo5+SSSCqSSSYnkksqkkkmJBJIKpJJIiOSMBEMSOQ'))as$i=>$j)echo strtr(sprintf("%8s%s",decbin(ord($j)),($i+1)%7?"":"\n"),'01',' #');
# # # # # # # # # #
# # # # # # # # # # #
# # ## # # ## # # # # ## ## # ### #
##### # # # # # # # # # # # # # # # # #
# # #### # # # # ## # # # # # # # # # # #
# # # # # # # # # # # # # # # # #
# # ### # # ## # # ## # # ### #
(我知道。但是为了完整起见,必须要动脑子^^它不会变得更短,因为重复很少。第一和第二行循环已经...)
++++++++[>++++>++++<<-]>+++>>++++++++++>>+>++[-<<<<<.>.<.>..>>>[-<<<.>>>]<[-<<<.>>>]<<..<.>>>++[-<<.<.>..........<.>....>>]<<<.>.<.>>.>+>>]<<<<<...>.<.>.<.>.<.>.<.>..<..>..<...>.<.>..<.>..<.>..<..>...<..>.<.>..<...>.<.>>.<<.>.<.>.<.>...<.>.<.>.<.>..<.>.....<.>.<...>.<.>.<.>..<.>.<.>...<.>.<.>..<.>>.<<.>.<.>.<...>.<.>.<.>..<..>.......<..>.<..>...<..>..<.>...<.>..<..>..<.
此处的翻译:http : //koti.mbnet.fi/villes/php/bf.php
# # # # # # # # #
# # # # # # # # # #
### # # # # ## ### # # # ## ## # ### #
# # # # # # # # ### # # # # # # #
# # ### # # ## ## ## ## # # ## #
将@ASKASK的数字生成器和图像与我的循环和一些其他调整结合起来,我们得到:
看起来比我的原始版本难看。
+++++[->++++++>+++++++>++<<<]>++>>>+>>++[-<<<<.<.>.<..>>>[-<<<.>>>]>[-<<<.>>>]<<<<..>.<.>>>++[-<<.<.........>.<...>>>]<<.<.>.>.>>+>]<<<<..<<+++++[->>.<.<]>.>.<..>...<.>.<.>.<.>.<..>.<...>..<.>.<..>..<.>.>.<.<.>.<.>.<...>.<.>.<.>.<.>.<.....<++++++[->>.<.<]>..>.<.>.<.>.>.<.<.>.<..>.<..>.<.>.<..>.<.......>...<...>.<..>.<...>.<..>.<..>.
(图片见@ASKASK的答案)
'¡I%e!c0ĄJ¥eìo0¸ËefMs0µKcÊIs0´Ê¢1éo'.split(0).map(s=>s.split('').map(c=>{for(i=8,s='';i--;)s+=(c.charCodeAt(0)-33)&(1<<i)?'#':' ';return s;}).join('')).join('\n')
输出:
# # # # # # # #
### ## # # ## # # # ## # ## # ###
# # #### # # # # # # # # # ## # # #
# # # # # # # # # # # # # # # # #
# # ### # # ## # # ## # # ###
说明:
ASCII文本被压缩为一个字符串,其中每个位代表一个像素:
0
对于SPACE
1
对于#
应用偏移量33是为了只获取可打印的字符。
return
不需要第一个粗箭头功能的括号和语句。
갦륈똄릵꺕녔꺒녪냕녪낷뚕년꺒녦냉괄낵要감嚙긂밃⓶掘⓶終丟併껧뜴꼧밍替現겠合終
# # ## # # # # # # ## # ## #
# # # # # # # # # # # # # # # # #
### ## # # # # ## # # # # # ## # # # #
# # # # # # # # # # # # # # # # #
# # ## ## ## # # # # # # ## ## #
抱歉@ johannes-h,我看到了你的作品,并受到启发制作自己的作品。它结合了开始时更快的数字生成和更简单的图片以更少的字节生成结果。但是,它不会在其他任何地方使用循环,因此可以进行优化。
+++++[->++++++>+++++++>++<<<]>++>.<.>.<.....>.<.>.<.........>.<...>.<.........>.<...>.<.>.>.<.<.>.<..>.<..>.<.>.<.........>.<...>.<.........>.<...>.<.>.>.<...<.>.<.>.<.>.<.>.<..>.<..>...<.>.<.>.<.>.<..>.<...>..<.>.<..>..<.>.>.<.<.>.<.>.<...>.<.>.<.>.<.>.<.....>.<.>.<.>.<.>.<.>.<.>.<...>.<.>.<.>.>.<.<.>.<..>.<..>.<.>.<..>.<.......>...<...>.<..>.<...>.<..>.<..>.
产生:
我没有看到其他ImageMagick条目,所以这是我最近的事迹:
convert +antialias label:Hello-World! xpm:-|sed '8,+9y/ /#/;s/[^#]/ /g'
我认为这sed
部分可以打更多些。
在线尝试。
输出:
########### ####### ##### ############ ########################### ############################## ########################### ################## #### ############## ###### ## ############### ##########
<~GasbQ8I>GO#QsOD7:?,pa&5XCgo@jeLPX:a4F9kN1nu1B@8KjD"^]WgY[MA.2VBjpTNo5$Pi%uI9Lr>,9`~>/FlateDecode filter 999 string readstring pop =
即
<~GasbQ8I>GO#QsOD7:?,pa&5XCgo@jeLPX:a4F9kN1nu1B@8KjD"^]WgY[MA.2VBjpTNo5$Pi%uI
9Lr>,9`~>
/FlateDecode filter
999 string readstring pop
=
Johannes H.的答案是仅ASCII来源,ASCII艺术的灵感来源:-)
# # # # # # # # #
# # # # # # # # # #
### # # # # ## ## # # ## ## # ### #
# # # # # # # # ## # # # # # # #
# # ### # # ## # # ## # # ## #
(在终端中更具可读性)
print$-%44?'':"\n",vec(unpack(u,'<!040`A!:4@`A`*%7918REEM1":T4)75E(#&1"0``'),$-++,1)?'#':' 'for 0..219
与上面相同的输出。我知道我对上面的两个Perl答案都不满意,但是无论如何我都会发布它。至少我尝试并朝着正确的方向前进(并且没有看到最短的答案):-)。
c=" #";for x in 0x{5250088045,55520A914D,74556AAA54,535205124D};do while((s=(t=x)^(x/=2)*2,t));do L=${c:s:1}$L;done;echo "$L";L=;done
使用左移和右移(除以2并相乘)和xor来找到一位。
字体数据从Blender / Ilmari Karonen被盗。
在Bash 3.2和4.2中测试
顺便说一下,这只有166个字符:
echo "# # # # # # # # # #
# # # # # # # # # # # # # ## #
### # # # # # ## # # # # # # # # #
# # ## # # # # # # # # ## #"
print('\n'.join(bin(x)[2:]for x in[353530052677,366448644429,499649260116,357858349645]).translate({48:32,49:35}))
输出(从@Ilmari Karonen窃取的4个字符的高e和W):
# # # # # # # # # #
# # # # # # # # # # # # # ## #
### # # # # # ## # # # # # # # # #
# # ## # # # # # # # # ## #
还有一个较短的(107):
print('\n'.join(bin(x)[2:]for x in[11993933918769,16391913257513,12021315382193]).translate({48:32,49:35}))
输出:
# # ### # # ### # # ### ## # ## #
### ### # # # # # # # # ### # # # #
# # ### ### ### ### ### ### # # ### ## #
print'\n'.join(map(''.join,zip(*(''.join("# "[int(e)]for e in"{:07b}".format(ord(c))[1:])for c in"€÷÷÷€ÿñêêòÿ€ÿ€ÿñîîñÿûûÿŸáþÁ¿ÁþáŸÿñîîñÿàïÿ€ÿÿñîî€ÿ‚"))))
输出量
# # # # # # # # # #
# # # # # # # # # # #
# # ## # # ## # # # # ## ## # ### #
##### # # # # # # # # # # # # # # # # #
# # #### # # # # ## # # # # # # # # # # #
# # # # # # # # # # # # # # # # #
# # ### # # ## # # ## # # ### #
base64 -d<<<rohBEmRiqIihFVRS7IitVWRSqIihVVRQru5Aoldi|xxd -b|sed -e's/ //g;s/1/#/g;s/0/ /g'|cut -b'9-55'
# # ### # # # # # # ## # ## #
# # # # # # # # # # # # # # # # #
### ## # # # # ## # # # # # ## # # # #
# # # # # # # # # # # # # # # # #
# # ### ### ### # # # # # # ### ## #
体积较小,但可读性较差(基于http://mckgyver.pbworks.com/f/1240440791/3PixelFont.jpg):
base64 -d<<<V0nCLsmQdklaqslQV23BTq2Q|xxd -b|sed -e's/ //g;s/1/#/g;s/0/ /g;'|cut -c'9-52'
# # ### # # ### # # ### ## # ## #
### ## # # # # ## # # # # # ## # # # #
# # ### ## ## ### # # ### # # ## ## #
复制到控制台:
[,0xa0a028045,0xeeae2bb5d,0xacaabaa54,0xaeae2ba5d].map(a=>a.toString(2).replace(/./g,b=>' #'[b])).join('\n')
输出:
"
# # # # # # # # #
### ### # # ### # # ### ## # ### #
# # ## # # # # # ### # # # # # #
# # ### # # ### # # ### # # ### #"
(需要兼容ECMAScript6的浏览器,即Firefox 22+)
灵感来自@ maximeeuziere,@ p01,@ aemkei
.join('\n')
可以减少到.join(` `)
空格是实际换行符的位置。
作者:xem,aemkei,p01,jonas
在JS控制台中执行此操作。
for(i=s="";l=[43117609029,64070269789,46349920852,46890400349][i++];)for(j=0,s+="\n";c=l.toString(2)[j++];)s+=" #"[c]
[,0xa0a028045,0xeeae2bb5d,0xacaabaa54,0xaeae2ba5d].map(a=>a.toString(2).replace(/./g,b=>' #'[b])).join('\n')
>
# # # # # # # # #
### ### # # ### # # ### ## # ### #
# # ## # # # # # ### # # # # # #
# # ### # # ### # # ### # # ### #
Shell,20个字符:
banner Hello-world\!
为此,您当然需要该banner
程序。在Debian上,您可以通过安装bsdmainutils
软件包来获得它。
这将打印出精美呈现的消息版本,该消息旨在在一台旧的连续进纸打印机上进行打印,因此上述文本的输出为322行长乘以123列宽,然后您将其打印输出翻面以阅读消息。您可以将结果纸作为横幅悬挂在墙上,因此得名。
http://en.wikipedia.org/wiki/Banner_%28Unix%29
编辑:看起来Debian也有sysvbanner
软件包,它安装了一个横幅程序,该横幅程序水平打印文本以在终端上显示。但是,这仅会打印消息的前10个字符,因此对于此代码高尔夫球问题有点烦人!
banner hello-world
。
banner
几乎所有UNIX都可以使用。我只是把Debian软件包作为方便的证明,证明我不只是为那些不了解它的人编造了东西。这些天来,我不希望banner
在UNIX上找到默认安装的设备,这比我在计算机实验室中找不到连续进纸打印机的希望更多。但是,任何有关编写横幅文本的代码都应该真正banner
在其中放置该程序。作为计算机极客,它是我们丰富的文化历史的一部分。:-)
您需要浪费很多字符才能产生漂亮的输出!
base64 -d<<<H4sICKaT9FICAzAxAK2RQQ7AIAgE776CZP7/x1ZjERebcJAL0QybhcV6YdWizAPNaUatQQLFpj6h+c/XA05WF9Wtk9WJcxz4oe6e1YPQa7Wiut2wfjJ16STY30lSnNIlzvdpHhd6MiTOB65NYc+LAgAA|zcat
输出:
# # # # ###
# # ###### # # #### # # # #### ##### # ##### ###
# # # # # # # # # # # # # # # # # ###
####### ##### # # # # ##### # # # # # # # # # # #
# # # # # # # # # # # # ##### # # #
# # # # # # # # # # # # # # # # # ###
# # ###### ###### ###### #### ## ## #### # # ###### ##### ###
F#-204个字符
for s in(Seq.map(Seq.unfold(function|0L->None|i->Some(" #".[int(i%2L)],i/2L)))[173948798213L;174770890021L;191304848727L;182715110773L;45277009173L;191279670629L])do printfn"%s"(new string(Seq.toArray s))
输出:
# # # # # # # # #
# # # # # # # # # ## # # #
### # # # # # # # # # # # # ## #
# # ### # # # # ## # # # # # # # # #
# # # # # # # ### # # # # # #
# # ## # # # # # # # # ## #
from pyfiglet import figlet_format
print(figlet_format('Hello-World!', font='banner'))
# # # # ###
# # ###### # # #### # # # #### ##### # ##### ###
# # # # # # # # # # # # # # # # # ###
####### ##### # # # # ##### # # # # # # # # # # #
# # # # # # # # # # # # ##### # # #
# # # # # # # # # # # # # # # # # ###
# # ###### ###### ###### #### ## ## #### # # ###### ##### ###
要安装pyfiglet
,请运行:
$ pip install pyfiglet
from pyfiglet import*
print(figlet_format(sys.argv[1],font='3x5'))
from pyfiglet import*
print(figlet_format('Hello-World!',font='3x5'))
fir必须称为,例如:
python asciiart.py'Hello-World!'
第二:
python asciiart.py。
输出:
# # # # # # # # #
# # ### # # ### # # ### ### # ### #
### ## # # # # ### ### # # # # # # #
# # ### ## ## ### ### ### # ## ###
# # # # #
(嗯,这种字体看起来有点cr脚。不过:)
[edit]从参数中删除了过时的破折号。
使用整数位来表示锐利的空白。经过Firefox 27测试。
137个字元
s="";[0xadb73eead9,g=0xa9252aaa94,0xed252aac95,g+1,0xad272aee99].map(n=>{for(;n>0;n/=2)n%2?[s="#"+s,n--]:s=" "+s;s="\n"+s});console.log(s)
# # ## # # ### # # # ### ### # ## #
# # # # # # # # # # # # # # # # # #
### ## # # # # # # # # # ## # # # #
# # # # # # # # # # # # # # # # #
# # ## ## ## ### ##### ### # # ## ## #"
134个字符(旋转180°)
s="";[0xadb73eead9,g=0xa9252aaa94,0xed252aac95,g+1,0xad272aee99].map(n=>{s+="\n";for(;n>0;n/=2)n%2?[s+="#",n--]:s+=" "});console.log(s)
"
# ## ## # # ### ##### ### ## ## ## # #
# # # # # # # # # # # # # # # # #
# # # # ## # # # # # # # # # ## ###
# # # # # # # # # # # # # # # # # #
# ## # ### ### # # # ### # # ## # #"
字符之间还有一个额外的空间,以使其更具可读性。因此从技术上讲,这是一个125个字符的解决方案。
print(' '.join(['','\n'][i%40==0]+['#',' '][int('72liw1j4glyc34dum02j2a4ipxa8b7vvp65x511',36)//2**i%2==0]for i in range(200)))
输出:
# # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # #
toilet<<<"Hello-world"|tr \"m \#
# # ### ### ### #
# # ### # # ### # # ### # ## # ####
###### ## # # # ## ## ## # ## ## ## ## # # ## ##
# # ##### # # # # ### ##### # # # # # #
# # ##### ### ### ##### # # ##### # ### #####
与以下内容相同:
echo "Hello-world" | toilet
从 man toilet
厕所-显示大号彩色字符
与tr "'\"m" "#"
所有"
字符替换为#
。
tr
的参数的转义比引用的短。我的意思tr \'\"m \#
不是tr "'\"m" "#"
。
toilet
输出没有单引号。为什么将它包含在tr
的第一个参数中?仅仅tr \"m \#
是不够的。
尽管此高尔夫比赛已经结束,但仅供参考:
i:=((Form extent:115@14)displayString:'Hello world'x:0y:12;asImage).0to:13 do:[:y|i valuesAtY:y from:0to:114 do:[:x :p|({$#.$ }at:p+1)print].Stdout cr]
输出:
*** *** *** *** *** **
* * * * * *
* * * * * *
* * *** * * *** *** *** *** *** *** * *** *
****** * * * * * * * * * * ** * * * **
* * * * * * * * * * * * * * * * *
* * ******* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * ** ** * * * * * **
*** *** **** ******* ******* *** * * *** ****** ******* *** **
bash
:33个字符– pastebin.com/HZ1w8z8g这可以接受吗?