发送宇宙电话


16

宇宙呼叫是在1999年和2003年送入太空的消息它是由23幅127 * 127px的单色位图图像,详见这里

您的任务是编写一个程序,以文本(由零,一个和换行符组成)或图像(在屏幕上绘制或保存在磁盘上)显示整个127 * 2921px消息。获奖者分为两类:一类是文本输出,一类是图像输出。

除常见漏洞外,所有技巧都允许。

允许单独输出23页。

最多可以编写23个程序(例如每页一个),并对其大小求和以确定分数。

最多可以与您的程序一起使用23个二进制文件。他们的体重计入您的分数。

最短的代码(以字节为单位)获胜。

每像素1位,图像包含127 * 127 * 23/8 = 46370字节+ 7位数据。(警告:如果将像素值存储到46371字节,则不允许输出额外的零)

文本输出允许尾随换行符/空格。

除了宇宙调用的黑色像素以外,视觉输出不能包含任何黑色像素。可以将其绘制在一列中(顺序正确),也可以分成23张图像,也可以将其动画化(例如gif),也可以正确顺序排列。

附件:文本输出和图像输出以重现:

宇宙召唤


19
“允许编写许多程序(例如每页一个)并对其大小求和以确定您的分数。”这很危险:空的Jelly程序打印0,空的Snails程序打印1,空的GolfScript程序打印换行符。 。有人可能会提交一个0字节的373888程序答案:)
Lynn

哈哈,好的,所以我将程序的数量限制为23个
。– xem

是否允许尾随换行符/空格?
Loovjo

是的。。。。。。
xem

我们可以使用另一个文件,还是必须仅处理源文件?例如。我可以使用IO来存储压缩版本,然后对其进行解压缩吗?还是所有事情都需要在代码中使用原义。
HopefulHelpful

Answers:


18

GIF,27386字节

这是原始传输的页面,它们被切成单独的GIF帧,事实证明它们不小于所有这些的1 PNG :(

宇宙召唤动画GIF


7
您好,欢迎来到PPCG!尽管这不会取胜,但它仍然是一个很好的职位。
NoOneIsHere

你有打扰吗?如果在过渡上使用附加的透明胶片,则可能能够节省300字节左右。
魔术章鱼缸

7

HTML,16012b

我将图像压缩为PNG8,并在文本编辑器中将其打开,并附加了

<svg onload="document.body.innerHTML='<img src=#>'">

最后,瞧瞧:

演示:http//xem.github.io/miniCosmicCall/


注意:追加也<img src=#>可以,但是可以看到很多垃圾,所以我不愿意这样做。


PS:为了娱乐,我还将整个消息放在一个可执行的推文中(您可以将其复制粘贴到浏览器控制台中,然后出现图像):

https://twitter.com/MaximeEuziere/status/742440423994580992



还没说我的遗言!
xem

我敢肯定我不明白你打算在这里说什么。
暴民埃里克

抱歉,我的意思是我正在尝试制作更小的东西
Xem

6

Python 2.7- 10971 8077字节

更新:

  • LZMA实际上由于某种原因对我不起作用,所以我回到了Deflate。

  • 我找到了一个在线工具来进一步压缩PNG(他们说他们使用有损压缩,但是数组保持不变)

  • 我打了__main__.py更多的剧本...
  • 我发现我省略了一个步骤(从zip存档中提取数据文件)
  • 添加了DL链接(请参阅底部)

大多数压缩算法将数据视为一维数组,因此无法捕获显示在宇宙调用中的重复二维字符(IMO也使外星人也很难理解:P)。

首先,我将每个字符选择为7 * 5数组,并列出所有唯一字符(如果记得的话,为101)。然后我遍历图像,找到一个字符后,记录了该字符的位置和索引(在字符列表中)。

这些位置可以用单个int表示,但是发现有超过2K个字符,并且范围从0-370966(divmod形式)的每个位置最多需要3个字节。但是,我按顺序收集了字符位置,因此我将绝对位置转换为偏移位置,使大多数数字小于1个字节。我使用utf-8编码了此列表,以说明一些大于1个字节的数字

记录并删除所有匹配的字符后,我以最大压缩率保存了png。然后,我将python重建脚本(反向过程),png,chatacter模板和字符位置列表打包到一个zip文件中,以利用python可以将文件夹或zip文件作为参数的事实,并且它将在名为的顶级任何文件中开始执行__main__.py。我使用了7z来获得最好的压缩效果,结果证明是LZMA,具有1M dict和32位字。

这是解码器脚本(已打高尔夫,但仍带有注释)

import sys,zipfile as z
z.ZipFile(sys.argv[0]).extractall() #extract data files from zip to cwd
from numpy import*
o=open  #next line overwrites open, which I need
from PIL.Image import*
from scipy.ndimage import*
a=imread('p')[:,:,0]/255 #read image file
a[:2414,0]=0 #draw vertical borders
a[2541:,0]=0
a[2412:,-1]=0
a[:2287,-1]=0
for x in range(0,2921,127):a[[x,x+126],:]=0 #draw horizontal borders
with o('c','rb') as f:t=f.read();C=[int(i)for c in t for i in'{0:08b}'.format(ord(c))] #read character template file and convert to list of bytes
C=array(C[:-1]).reshape([101,7,5]) #re-slice (extra 0 appended to make even number of bytes) and re-shape
with o('l','rb') as f:L=array([ord(x)for x in f.read().decode('utf_8')]).reshape([2158,2]) #read decode and reshape positional list
p=0 #relative position accumulator
for e in L:p+=e[0];x,y=p%127,p/127;a[y:y+7,x:x+5]=C[e[1]] #divmod for x,y position and paste character template onto array at position
i=fromarray(a*255)
i.show()
下载zip文件的链接...


我是:)(并为此成绩表示
祝贺

@xem ...发布后不久,我继续将其弄乱,并且它坏了(python在加载时给了我一些zlib错误),它也在我的工作计算机上。如果可以将其恢复到工作状态,我将在周一将其发布。:P
亚伦

我觉得这可能是可以优化PNG压缩和哪些字符我编码(较少使用的那些)之间的平衡,以节省几多个字节..
亚伦

1
@xem我添加了一个dl链接...
亚伦

喜欢2D压缩的主意... 3D压缩呢?(堆叠图像)
NonlinearFruit

3

bzip2外壳中的Gzip20914 18965字节

使用问题中提供的文本输出制作输出数据文件,bzip2然后将其重命名为s。然后,这允许:

bzcat s

做这份工作。因此,它总共增加了18958字节的数据和7字节的命令。


1
我认为您可以使用'bzip2'节省几千美元!
Dom Hastings

@DomHastings:我终于听了你的建议。
朱莉·佩莱捷

进一步研究:Bubblegumzopfli
数字创伤

2

Pyth,46381字节

由于明显的原因,无法在此处发布。

jc.BC"<too long>"127

样品。

程序的十六进制转储的Pastebin。


您以拉丁1个字符对7位编码为7,对吗?简单又漂亮!:)当然,我正在寻找更好的压缩方法:p
xem

1
是的,我正在做更好的压缩。顺便说一句,我对它们进行了8乘8编码。
Leaky Nun

顺便说一句,我想知道你是怎么得到这个分数的:127 * 127 * 23/8 =约46371字节。355个其他字节又去了哪里?
xem

谢谢,它现在完全匹配它。实际上,您可以在(jc.BC""127")以上的代码中看到额外的10个字节。
Leaky Nun

您如何处理多余的部分?(整个消息占用46370字节+ 7位。您的最后一个字节可能会产生一个额外的零,这不是有效的输出)
xem

2

Bash + WebP二进制,11 + 15330 = 15341字节

如规则所述:

您的任务是编写一个显示整个127 * 2921px消息的程序,或者将其显示为图像(绘制在屏幕上或保存在磁盘上)。

最多可以与您的程序一起使用23个二进制文件。他们的体重计入您的分数。

除常见漏洞外,所有技巧都允许。

…我忍不住发表一些愚蠢的简单文章。

该程序在bash中,并且通过将其保存在磁盘上来输出图像。
它使用1个二进制文件,该文件也恰好是图像文件(是的,WebP是一种图像格式),因此该程序可以做的工作很……复制该文件。

因此,代码(11个字节):

cp b a.webp

假设附带的二进制文件名为“ b”,该代码将映像文件以正确的扩展名(“ a.webp”)写入磁盘。

我几乎没有理由上传二进制文件,因为它是通过运行简单创建的

cwebp -z 9 <downloaded input file> b

它会产生15330字节的文件。如果有人愿意,我可以将其上传到某个地方。

注意:该-z选项cwebp激活无损压缩模式。9是抗压强度(最大值)。


OP作者喜欢这个
xem

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.