在ASCII艺术中向世界说“你好”


14

挑战:使用尽可能少的字符产生以下输出:

 _   _      _ _                             _     _ _
| | | | ___| | | ___    __      _____  _ __| | __| | |
| |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | |
|  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|
|_| |_|\___|_|_|\___( )   \_/\_/ \___/|_|  |_|\__,_(_)
                    |/

规则和限制:

  • 您可能不使用FIGLet或任何类似工具。(否则,figlet Hello, world!这将是一个琐碎且几乎无与伦比的解决方案。)

  • 您的程序必须完全由可打印的ASCII字符组成-特别是代码点9(TAB),10(LF)和32 –126。(如果您的语言/操作系统要求使用CRLF换行符,则可以使用这些字符来代替普通的LF。)是,令人遗憾的是,这取消了任何需要非ASCII字符(或非文本数据)作为其语法一部分的语言的资格。

  • 输出必须与上面的示例完全相同。但是,如果需要,可以在输出周围包括多余的空格。您可以假设制表符间隔为 8个字符(或所选平台的本机默认设置,如果该设置为一致的话)。

附言 为了达到标准,我想出了一个199个字符的Perl解决方案。不过,如果有人独立提出来,我不会发布。(而且,这很俗气。)当然,这不会阻止您发布自己的解决方案,即使它更长。


更新:现在,han击败了一个字符,这是我俗气的199字符Perl解决方案:

use Compress'Zlib;say uncompress unpack u,'M>-I]BT$*`S$,`^]YQ=R:0,&_Z<DP?8@?WVQJ]E2J"%E$$@)R(/(/MCJ*\U!OM`Z#=5`4Y>6M=L\L%DMP&DB0V.4GQL&OOGB$4:%`4TT4!R8O-Z(^BTZWNV?>F86K:9+""-35*-LNC:T^D:_$#%^`";"DD0'

它与DC的解决方案(以及所有其他基于zlib / gzip的其他各种语言的解决方案)非常相似,不同之处在于我使用uuencoding而不是base64来压缩文本和其他一些小技巧。


更新2:我认为是时候正式接受获胜者了。首先是konsolenfreddy的PHP代码,因为尽管算上字符数,但它迄今为止提交的最短的代码。实际上,将其与我的199个字符的Perl代码中的优化的DEFLATE流结合使用,可以得到更短的176个字符的解决方案:

<?=gzinflate(base64_decode("fYtBCgMxDAPvecXcmkDBv+nJMH2IH99savZUqghZRBICciDyD7Y6ivNQbwOg3VQFOXlrXbPLBZLcBpIkNjlJ8bBr754hFGhQFNNFAcmLzeiPotOt7tn3plq2mSwgjU1SjbLo2tPpGvxAxfgA"));

但是,我确实认为han值得特别荣誉,因为他无需使用任何预先编写的减压工具就可以如此接近。祝贺你们,也祝大家新年快乐!


好的,我必须在C中执行此操作...
Michael Dorgan

Answers:


1

Stax,137字节

"9&BO]h>&)>3ieuCoKVKVnuOoT'E-^Z(1.3u[);h1[RTOGqTZkoQx?KMy&9ctG&*y~HxR9%GYn.rYMdMcOOq^wXc@%zy*P[*Q"90|E|B"0+1"{%",``_|\/()V'"@]}R.1 |t54/m

运行并调试

它是这样的。

  1. 从大字符串文字开始。
  2. 通过解码为基数90转换为整数。
  3. 将该数字转换为二进制。
  4. 0s后跟a的行1被转换为非空格字符。
  5. 其余所有1s均替换为空格。
  6. 结果字符串分成54个字符的行。

恭喜,看来这是目前最短的解决方案!:)
Ilmari Karonen

17

Perl的5.10 - 195个198 202 203字符

这是一项条目,除基本的正则表达式匹配外,不需要任何库。编码的字符串为131个字符,用于解码和打印的代码占用64个字符(假定源末尾没有换行符)。想法是用小写字母表示常见的3个字符的字符串。

s!!xfefxxf\t\t\tf efyx
no| cnocfxefxceyxm|xmn
nm|wtnwtgt/uvy \\| 'ym|w`o|
pepyy/o| _ogrr/ _opn (ml
l lbyly|by( )fiihyjm lb,y_
\t\tf |/!;s!\w!substr'(_)\___   \_/|_| |  V \ / _',-95+ord$&,3!eg;say

编码器更长了,不幸的是现在还不太可读。基本思想是在给定固定的字符串替换集的情况下,使用动态编程来查找每行的最短编码。最后一行的替换字符串是通过反复试验构建的,并且另一替换字符串可能会导致程序比上面更短。

这里的一个窍门是,某些替换的长度少于3个字符:由于perl的substr工作方式,x被替换为' _'和y' _'。后者是必需的,因为\w在正则表达式中匹配“ _”,然后将其替换为“ (_)”。


+1,非常好。通过替换printsay
Toto,

@ M42:据我所知,要在perl 5.10上使用say,需要使用use 5.010;或将脚本作为单行代码运行perl -E 'script here'。前者使代码更长,而后者不适用于多行脚本。我错过了什么?
汉,

-E不烧焦的数量计数。
Toto

1
附言 您可以使用s''...'代替多保存一些字符$_=q!...!。只要记住不要使用单引号。有了它,say而不是print(并保留最后一个换行符),我将其减少到198个字符。
Ilmari Karonen

2
顺便说一句,我尝试使用制表符代替#长期的空白,并将您的解决方案降低到190个字符。我想知道是否有可能低于184个字符-它将击败到目前为止所有zlib压缩的解决方案。
Ilmari Karonen 2011年

12

Brainfuck-862个字符:

>++++[<++++++++>-]>-----[<---->---]<+++>>--[<+>--]<---<<.>.<...>.<....
..>.<.>.<.............................>.<.....>.<.>.>>++++++++++.<.<<.
>>.<<.>>.<<.>>.<<.>...>.<<.>>.<<.>>.<<.>...<....>..<......>.....<..>.<
.>..>.<<.>>.<<.>..>.<<.>>.<<.>>.>.<.<<.>>.<.>.<<.>>.>>>-[<->+++++]<---
-.<<<<.>.<.>---.+++<.>>.<<.>>.>>.<<<<.>.<.>---.<...>.<.>.<.>>>>.<<<.<.
>>>>.<<<<.>>>>.<<<<.>+++.<.>---.>.<<.>>>>>>---[<+>+++++++]<++.<<<<+++.
.>.<<.>>.>>.<<<<.>.+.-<.>>.<<.>>.>.<.<<..>.<..>>.<<..>..>>>.<<<<.>>.<<
.>>.<<.>>>>>+.<<<<.>>>>+.<<<<<.>>.<<...>---.<.>------.<..>.<.>>>>.<<<<
.>>>>>-.<<<<+++++++++.>>>>+.<<<<<.>>.<<.>>.<<..>>.<<.>>.<<.>>>>>-.<<<<
.>.<<.>>.<.>.>.<.<.>.<<.>>.<.>.<---.+++...>.<.>.<.>.<---.+++...>>>>.<<
<<<.>>>>>+.<<<<<...>---.+++.>>>.<<<---.+++.>>>.<<<<.>---.+++...>>>.<<.
<.>.<<..>>.<.>.<---.+++..>>>>+++.<<<<.>>>>----.<<<<.>>>>+.<<.<<<......
..............>>.>>.<.

注意,该代码显然采用8位单元。我首先在具有32位单元的解释器上进行了尝试,但它停留在[<---->---]第一行。(大概它最终会完成,但我没有等那么久。)
Ilmari Karonen 2011年

24
您在两个小时内怎么写?
乔伊·亚当斯

看起来您在第一个单元格上保存了''()/,|| V_ \ n,然后您就来回打印所需的字符(BF Dev文本生成器?)。BTW
JBernardo

它确实取决于8位换行单元。存储一些您常用的常见字符,但不是全部。还可以在一个距离足够近的单元格中在“ \”和“ _”之间进行切换等操作。
captncraig 2011年

@ JBernardo,BF开发人员文本生成器提供了比此更大的代码。我认为,这将需要更复杂的生成器来解决。
captncraig 2011年

9

Python(2.x),194个字符

print'eNo9T8ENxCAMe5cp/DsqVco2fSH5BsnwZ4ccEIhxbAIgAK9KvDRwGBEjsSfJA6r2N7EISbmrpbLNKFRYOABaC6FAEYkPW/Ztm1t7Z1S3ydtHuV4ooolEV6vPyJ2XH8kGE7d9DAVMhFUte6h7xv5rxg8sf0Qc'.decode('base64').decode('zip')

2
这个答案使我今天感到高兴。我从没想过我会看到一个实际上使用zip&base64来减小字符串大小的
代码高尔夫球

4

Javascript 273 265 264个字符

" _2_22_ _2222222226_26_ _10 0 3_0 | 3_2 32233_6_ 30 30 |10_0/ _ 4 0/ _ 424 4 /4 / / _ 4| '30/ _` 01|6_6|63/ 0 (_) |24 V6V / (_) 060 (_0_|1|_0_|43_|_543_( )24_/4_/ 43_/56543,_(_)12222226|/".replace(/\d/g,function(a){return'| |,\n,   ,__,\\,|_|,  '.split(',')[a]})

:(


保留return-1字符后的空间:)
pimvdb 2011年

4

这个答案比打印字符串要长。但是,只是为了好玩,这里是:

Python,485个字符☺

import sys

data= ',C6UBKq.)U^\\ 8[hHl7gfLFyX6,;p\'SlYpN@K-`Kbs#fSU+4o~^_h\\dJDy{o9p?<GnLTgG{?ZM>bJE+"[kHm7EavoGcS#AQ^\\>e_'
table= " _|\\/(\n)V'`,"
key= (0,(1,((((7,5),(6,(8,(11,(9,10))))),(4,3)),2)))

number= 0
for char in data:
    number= number*95 + ord(char) - 32

mask= 1<<655
decoder= key
while mask:
    index= mask & number and 1
    try:
        decoder= decoder[index]
    except TypeError:
        sys.stdout.write(table[decoder])
        decoder= key[index]
    mask>>= 1

由于我拥有压缩原始文本的最短ASCII表示形式之一,因此我的代码中必须具有最长的滚动条!赢了!:)


4
又称为“我的滚动条比您的滚动条长”
tzot 2011年

此解决方案可以简化为254个字符。您介意我是否使用较短的版本进行编辑?

@han:当然可以减少字符数;但是,我并没有把这个作为认真的候选人来写。因此,让这个投票选出自己的优点,然后使用您喜欢的尽可能多的答案写出另一个答案:)
或少的

谢谢,除非有人真的有兴趣,否则我会通过。我只是想指出,该解决方案可以比原始文本短得多。

3

PHP,194189个字符

php -r'=gzinflate(base64_decode("dU/BDcQgDPszhX+lUqVs0xeSb5AMf3ZI+7qDACa2EwABeNXR4M/goxqJPUm+oLinEishKTdbKtuMQsTCC6C1EApUInHIvOlP+9zbO6PaTZ6+ynZDEZ1INFuNRu5z+ZVsMHHax1DAibCqZRdVZ/z6esYX"));'

它与Python和Perl的答案基本相同,但略短


这个php -r'=...'技巧似乎对我不起作用,但是您可以使用<?=...184个字符。另外,您的输出似乎在rl相交处有额外的空间。
Ilmari Karonen 2011年

OSX 5.3.6在上可以正常使用-r'=..'。请问php -r不算数?它已包含在我的189个字符中……
konsolenfreddy 2011年

通常,解释器的名称不计算在内。对于命令行选项,我一直在使用这个meta线程;但是,PHP的-r切换处于临界状态,因为,除了仅将代码作为参数并运行它之外,与从文件中运行代码相比,它还稍微修改了解析环境。我倾向于把它算作2个额外的字符-顺便说一句,即使加上<?
Ilmari Karonen 2011年

3

用其他语言:C(原始版本),209个字符Perl,200个字符

J,167160个字符(47 + 113)

另一个没有内置压缩的提交。使用简单明了的可变长度编码,将每个字符编码为一系列的1位,并用0位分隔字符。压缩的字符串只有113个字符。

('a _|\/',CR,'()V`,'''){~#;.2,(6$2)#:40-~3&u:'8H1(((((H:f[4ZS4ZP2(RPMAMANf[>CZD[F;I[OVFF;TgfS5aGd[7T9JW4[eG[+Of7ddg?d[.AfT]WUASE=S>bSdgI]cS[RWBYSE?gSeG_X(()WG('

2

Python(2.7.x),218个字符

import base64,zlib;
print zlib.decompress(base64.b64decode("eNo9T8ENxCAMe5cp/DsqVco2fSH5BsnwZ4ccEIhxbAIgAK9KvDRwGBEjsSfJA6r2N7EISbmrpbLNKFRYOABaC6FAEYkPW/Ztm1t7Z1S3ydtHuV4ooolEV6vPyJ2XH8kGE7d9DAVMhFUte6h7xv5rxg8sf0Qc"))

非常简单...对此尝试并不十分满意。


2

击,199个 196 193字符

base64 -d<<<H4sIAAAAAAAAAz1PQQ6AIAw7S+IfelMTk/3GE0l9CI+3HRPYoHQtAxCAMzduGliMiL0NzElygSz+LiYhLWc1VekzDFU6FoCyIxRIYuBgyd7f5+5eGdnv5OWjbA8UUcRAVbORfBN0v5MFTlw2MhQwEVaV7KYu2tv88IgPjUlb7QoBAAA=|zcat

足够近...

编辑:下降到193!


1
真好 你可以通过替换节省三个字符gzip -dzcat
Ilmari Karonen 2011年

3
使用where字符串可以节省回显。
彼得·泰勒

2

庆典,196 192

base64 -d<<<H4sIAO4SqFMCA3VPQQ7AIAi7+4re5pIl/GYnk+4hPH4U0dOmILUUUBCAPEOBn8Wlao65SW6QudWJSYSUM5sqlQlZJAY2QPiAhSEJx8GSPVWm0TppOa3z1DWqboRZEY7K5pzmMw49kgU6TtXRwiDCpCrZxejTvn7u1l5z59MGKQEAAA|zcat

1

Perl,230个字符

use Compress::Zlib;
use MIME::Base64;
print uncompress(decode_base64('eNo9T8ENxCAMe5cp/DsqVco2fSH5BsnwZ4ccEIhxbAIgAK9KvDRwGBEjsSfJA6r2N7EISbmrpbLNKFRYOABaC6FAEYkPW/Ztm1t7Z1S3ydtHuV4ooolEV6vPyJ2XH8kGE7d9DAVMhFUte6h7xv5rxg8sf0Qc'));

这基本上与我的Python答案相同。我想看一下199个字符的版本。听起来像魔术。


我暂时不会发布它,但是您的方向正确。当然,我希望有人会用完全不同的方法击败它。
Ilmari Karonen 2011年

1

Perl, 294 290个字节。

单独的压缩字符串是 151 130个字节

这并不短,但是写起来真的很有趣。

@t=split//,"_|\\/\n()V',`";$b.=substr unpack("B8",chr(-48+ord)),2,6 for split//,'Ph?`@Ooooo1l410````0066600?03l0001PP06600HHB1Q064L4D<8h8^::<DLL4@J0032>1D<90h<>00hHI@6QhYllLX3@`hHI@1Q04P@1Q04@002080R001I^80a074001Q07208P0B0X34ooo`ST';$b=~s/(1)|(0.{4})/$1?" ":$t[ord pack"B8","000$2"]/eg;print$b

@t=split//," _|x"x4 ."\\/\n()V',`";$b.=substr unpack("B8",chr(-48+ord)),2,6 for split//,'4100A0000000001017:8R5HR5@1@05E15R5R;:9Ra4`8\\A<0<30a`<C4C2=URa7PRbP@PG4R<g@P<3D=C4cM288S=RK:HV`EVK1G<d0`LL74`EaV2K1Mg=db0000002ab';$b=~s/1(1.{4})|(..)/$t[ord pack"B8","000".($2?"000$2":$1)]/eg;print$b

1

Perl,346个字节

仅压缩字符串就是111个字节。

@t = split//, " _|\\/\n()V',`";
$k=[0,[1,[2,[[3,4],[[5,6],[7,[[8,9],[10,11]]]]]]]];

$b .= substr unpack("B8", chr(-48+ord)), 2, 6 for split//,'@P900000PBlc<b[<bX:0ZXUIUIVlcFKZLI^Y`LLMhjjW<oJcMGncNHS5MIW]l`ho3lMNgc<IW]V]i[=KUF]KUG[hL^l^^EMeSFiGmNggP001^Pl';

$d = $k;
$o.=$d=~/^\d/?$t[$s=$d,$d=$$k[$_],$s]:($d=$$d[$_],"")for split//,$b;
print $o

为了了解python的功能key= (0,(1,((((7,5),(6,(8,(11,(9,10))))),(4,3)),2))) ,我最终制作了一个非常相似的perl版本。


1

PHP 590

显然,我不是想赢,只是对尝试其他压缩方案感兴趣,尽管它甚至无法击败仅复制粘贴的简单302纯文本PHP解决方案

它可以在10个通道上用作位图

“打高尔夫球”

<? $l=['_'=>['l8kqo,ei','9uo6,2fko0','52m0w,5r1c','540lc,5maq','lifeo,19i7ai'],'|'=>[0,'1h39j4,105','1h2k8w,q9x','14l2jk,wlx','1h39j4,wlc','1s,0'],'/'=>[2=>'b9c0,n3kao','pa8,18y68','0,mihog','w,0'],'\\'=>[2=>'pc5,a0zy8','2,0','b9c1,am2kg'],'('=>[3=>'e8,b8lc','1s,4'],')'=>[3=>'3k,2t4w','g,1'],'V'=>[3=>'0,18y680'],'`'=>[2=>'0,g'],"'"=>[2=>'0,6bk'],','=>[4=>'0,g'],];$p=@str_pad;$b=@base_convert;$i=-1;while($i++<5){$h=' ';foreach($l as$c=>$r)if(@$r[$i]){$a=explode(',',$r[$i]);$d=str_split($p($b($a[0],36,2),27,0,0).$p($b($a[1],36,2),27,0,0));foreach($d as$j=>$v)$v&&$h[$j]=$c;}echo"$h\n";}

可读的

<?php
$l = ['_'=>['l8kqo,ei','9uo6,2fko0','52m0w,5r1c','540lc,5maq','lifeo,19i7ai'],
      '|'=>[0,'1h39j4,105','1h2k8w,q9x','14l2jk,wlx','1h39j4,wlc','1s,0'],
      '/'=>[2=>'b9c0,n3kao','pa8,18y68','0,mihog','w,0'],
     '\\'=>[2=>'pc5,a0zy8','2,0','b9c1,am2kg'],
      '('=>[3=>'e8,b8lc','1s,4'],
      ')'=>[3=>'3k,2t4w','g,1'],
      'V'=>[3=>'0,18y680'],
      '`'=>[2=>'0,g'],
      "'"=>[2=>'0,6bk'],
      ','=>[4=>'0,g'],
      ];
$p=@str_pad;
$b=@base_convert;
$i=-1;
while($i++<5){
    $h = str_repeat(' ',54);
    foreach($l as $c=>$r)
        if(@$r[$i]){
        $a = explode(',',$r[$i]);
        $d = str_split($p($b($a[0],36,2),27,0,0).$p($b($a[1],36,2),27,0,0));
        foreach($d as$j=>$v)
            if ($v)
                $h[$j]=$c;
        }
    echo "$h\n";
}

1

Pylongolf2,300字节

" _   _      _ _                             _     _ _
| | | | ___| | | ___    __      _____  _ __| | __| | |
| |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | |
|  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|
|_| |_|\___|_|_|\___( )   \_/\_/ \___/|_|  |_|\__,_(_)
                    |/"~

我找不到任何经典的编码方法,所以我可能没有竞争。


0

高尔夫基础84,325

:"                     "_Str1t` _   _      _ _ "d`Str1d`Str1t`_     _ _"t`| | | | ___| | | ___    __      _____  _ __| | __| | |"t`| |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | |"t`|  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|"t`|_| |_|\___|_|_|\___( )   \_/\_/ \___/|_|  |_|\__,_(_)"t`                    |/"

假设计算器可以打印反引号,反斜杠,单个竖线和下划线。


0

HTML + JS(223个Unicode字符)

只是为了好玩:

<body onload=p.innerHTML=unescape(escape("𘁟𘀠𘁟𘀠𘀠𘀠𧰠𧰠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𧰠𘀠𘀠𧰠𧰊𯀠𯀠𯀠𯀠𧱟𧱼𘁼𘁼𘁟𧱟𘀠𘀠𧱟𘀠𘀠𘀠𧱟𧱟𧰠𘁟𘁟𧱼𘁼𘁟𧱼𘁼𘁼𒡼𘁼𧱼𘁼𛰠𧰠𧀠𯀠𯀯𘁟𘁜𘀠𘁜𘁜𘀯𧀠𛰠𛰠𧰠𧁼𘀧𧱟𯀠𯀯𘁟𨀠𯀠𯀊𯀠𘁟𘀠𯀠𘁟𧰯𘁼𘁼𘀨𧰩𘁼𘀠𘁜𘁖𘀠𥠠𛰠𚁟𚐠𯀠𯀠𘁼𘁼𘀨𧱼𘁼𧱼𒡼𧱼𘁼𧱼𧁟𧱟𯁟𯁟𯁜𧱟𧰨𘀩𘀠𘁜𧰯𧁟𛰠𧁟𧱟𛱼𧱼𘀠𯁟𯁜𧱟𛁟𚁟𚐊𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𘀠𯀯").replace(/uD./g,''))><pre id=p>

注意:您必须将其保存在“带BOM的UTF-8” HTML文件中。


真好 只要编码设置为UTF-8或自动检测,即使没有BOM(Firefox 26 / Chromium 31),我也可以使用。las,它不符合所述规则(“程序必须完全由可打印的ASCII字符组成”)。:-(
Ilmari Karonen 2014年

我知道,这只是为了娱乐;)
Xem 2014年

0

PowerShell,220个byes =脚本:9 +存档:211

tar xOf t

在线尝试!

用于创建归档文件的Powershell脚本t(请参见TIO):

(
" _   _      _ _                             _     _ _",
"| | | | ___| | | ___    __      _____  _ __| | __| | |",
"| |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | |",
"|  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|",
"|_| |_|\___|_|_|\___( )   \_/\_/ \___/|_|  |_|\__,_(_)",
"                    |/"
) | Set-Content f -Force
tar zcfo t f
Get-ChildItem t # output info about archive size
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.