任务:编写一个尽可能短的代码,以大号符号字体显示输入的数字字符串。字体必须与问题中指定的完全一致。
示例:
接收到字符串“0123456789”作为输入,程序应输出到标准输出:
### # ##### ##### # ####### ##### ####### ##### #####
# # ## # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # #
# # # ##### ##### # # ###### ###### # ##### ######
# # # # # ####### # # # # # # #
# # # # # # # # # # # # # # # #
### ##### ####### ##### # ##### ##### # ##### #####
规则和限制:
- 该程序可以但不必采用函数的形式。
int main() {}
如果它是一个函数——在大小上不考虑这个函数声明的语法(对于 C),工作代码本身的大小很重要。 - 输入字符串可以以您方便的任何方式进入程序:作为在代码之前的测试用例中指定的变量,作为函数参数,或来自标准输入。
- 输入字符串只能包含数字
- 结果应作为文本写入标准输出。如果标准输出被定向到终端,则假定屏幕足够宽以打印整个测试用例并带有边距。使用用于在您的平台上换行的任何字符/字符组合(例如,
\n
或)标记到新行的过渡(显式或隐式\r\n
)。 - 结果的字体必须与上面指定的字体完全匹配。输出的数字之间必须至少有一个空格(数字不能合并)。字体被认为是等宽的,即 设备周围可能有更多空间。它的图像比其余数字窄。
- 禁止在程序中使用任何内置语言和库进行数据压缩和编码(如:zip/unzip、base64)
- 该程序必须直接在其主体中包含字体(或构成它的代码)。禁止从外部来源(输入、磁盘、网络、视频适配器内存、BIOS)接收字体。
- 程序大小以字节为单位。尺寸最小的程序获胜。
比赛结束
第一名被@RusArt 占据,答案是 05AB1E,只有 91 个“字节”长。
第二名是@Anton Petrusevich的 perl answer,长 150 字节。
第三名是@retorta的 python答案,长 161 字节。
答案涵盖了多种压缩字体的方法。在准备比赛时,我考虑了其中的大部分。最容易实现且同时非常有效的是以 7 位水平编码压缩最多 70 个字节(我的原始编码在答案中给出在 postgresql 上。我们甚至设法通过更改 6-7 位并减去 2 来进入有效字符范围。的确,并非所有参与者都费心并花费宝贵的字节来编码从 0x20 到 0x7E 的可打印字符范围。编码是原样使用的,经常是8位甚至进入控制范围。原则上,此类编码有权在编写程序的平台上运行。虽然当程序无法在打印机上打印时我真的不喜欢它,但从一张纸上再次输入并且它会继续工作(你将无法在书中发布你的代码;))。
获胜者使用了完全不同的字体编码。包含 16 个可能的 7 字符字体元素(位编码)的字典和一个带有每个字符部件号的代码表,由于 05AB1E 语言的非标准代码页,它占用了 35 个“字节”(从技术上讲,这种语言使用了256个字素,被认为是“字节”,因为正好有256个字素,如果真的存在这样的码表,那么真的可以全部编码成一个字节)。不幸的是,其他语言的这种编码原则上是不可能的,因为在 256 个 ASCII 字节值中,31 个用于控制代码,而 128 个更高的值在平台之间传输不佳。
其他一些答案原则上使用了类似的字典方法,但他们没有使用二进制编码,因此字体占用了更多空间。在准备比赛的过程中,我什至考虑了用字典编码的几种选择。例如,经常出现的两个组合#####
和应该用值为 10 和 11 的两个位进行编码,而其余选项为 5 和一个位值,其第一位为 0,以便# #
区分前两位和其余 4 位的选项数。实际上,这在字体编码方面的增益非常小,同时,解码代码过于复杂且不适用于代码高尔夫,同样,很难将其放入常规的 ascii 代码中。
也可以在答案中找到完全不同的编码方式,例如在@Qwertiy的答案#
中提供仅用连续数字编码重复和空格
不幸的是,没有参与者尝试使用垂直编码,即 其中元素是从中垂直取出的编码字符的 7 位。使用这种编码方法,可以获得很多重复。仔细看5689这几个数字,只有1和最后一竖不一样,其他都是一样的。当在这样的字符串中对重复进行编码时,可以实现与字典和位编码几乎相同的压缩。但在高尔夫练习中,由于解码代码量的增长,它的适用性又很差。
备选评级
不幸的是,不可能以真正反映我想从比赛中得到什么的方式制定规则。许多答案使用在其他字符编码中不起作用的字符或与 base64 含义接近的函数,即 将编码字符串表示为一个大数,因此代码不包含其自身的解码。在这个替代排名中,我反映了如果规则被精确制定的结果。
请在您的答案中注明字节数,以便更容易识别获胜者。
execute("ru.stackoverflow.com", "674415");
.cssload-container,.cssload-cube{width:97px;height:97px;transform-style:preserve-3d}.cssload-container,.cssload-cube,.cssload-half1,.cssload-half2{transform-style:preserve-3d}.cssload-container{position:relative;margin:23px 84px;perspective:292px}.cssload-cube{animation:cube 11.5s forwards infinite;transform-origin:center 49px}.cssload-half1,.cssload-s1{top:0;transform-origin:50% 100%}.cssload-half1{height:39px;position:absolute;animation:half-fold 11.5s forwards infinite}.cssload-side{width:19px;height:19px;background:#ddd;position:absolute}.cssload-s1{left:39px;animation:s1ani 11.5s forwards infinite}.cssload-s2,.cssload-s3,.cssload-s4{left:39px;transform-origin:50% 0}.cssload-s2{top:19px;animation:s2ani 11.5s forwards infinite}.cssload-s3{top:39px;animation:s3ani 11.5s forwards infinite}.cssload-s4{top:58px;animation:s4ani 11.5s forwards infinite}.cssload-s5{left:19px;top:19px;transform-origin:100% 50%;animation:s5ani 11.5s forwards infinite}.cssload-s6{left:58px;top:39px;transform-origin:0 50%;animation:s6ani 11.5s forwards infinite}@keyframes cube{0%,30%{transform:rotateX(0)}40%{transform:rotateX(45deg) rotateY(0) rotate(45deg)}60%{transform:rotateX(60deg) rotateY(0) rotate(45deg)}65%,70%{transform:rotateX(60deg) rotate(45deg) rotate(180deg)}75%,80%{transform:rotateX(60deg) rotate(45deg) rotate(1turn)}90%{transform:rotateX(0) rotate(0) rotate(0)}}@keyframes s1ani{0%{opacity:1;transform:translateY(0);background:#ddd}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(-90deg);background:#ddd}90%{transform:rotateX(-90deg)}}@keyframes s2ani{0%{opacity:0;transform:rotateX(-179deg)}10%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%,80%{background:#b4b4b4}65%{opacity:1;background:#b4b4b4}90%{opacity:1}to{opacity:0}}@keyframes s3ani{0%,10%{opacity:0;transform:rotateX(-179deg)}20%,90%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%{background:#969696}to{opacity:0}}@keyframes s4ani{0%,20%{opacity:0;transform:rotateX(-179deg)}10%,to{opacity:0}30%{opacity:1;transform:rotateX(0)}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(90deg);background:#b4b4b4}80%{background:#b4b4b4}90%{opacity:1;transform:rotateX(90deg)}}@keyframes s5ani{0%,10%{opacity:0;transform:rotateY(-179deg)}20%{opacity:1;background:#ddd;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(90deg)}55%{background:#ddd}60%{background:#c8c8c8}90%{transform:rotateY(90deg);opacity:1}to{opacity:0}}@keyframes s6ani{0%,20%{opacity:0;transform:rotateY(179deg)}30%{opacity:1;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(-90deg);background:#ddd}60%,80%{background:#c8c8c8}90%{opacity:1;transform:rotateY(-90deg)}to{opacity:0}}@keyframes half-fold{0%,50%{transform:rotateX(0)}60%,90%{transform:rotateX(-90deg)}}
<script src="https://mayorovp.github.io/codegolf/table-8c505e68f1349e4c69e7.js"></script>
<div class=cssload-container><div class=cssload-cube><div class=cssload-half1><div class="cssload-side cssload-s1"></div><div class="cssload-side cssload-s2"></div><div class="cssload-side cssload-s5"></div></div><div class=cssload-half2><div class="cssload-side cssload-s3"></div><div class="cssload-side cssload-s4"></div><div class="cssload-side cssload-s6"></div></div></div></div>