Pure Sourcery-整形程序,输出0到9的数字


21

这是数字0到9的像素化5 x 7字体:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(如果您在浏览器控制台或以javascript::开头的URL栏中运行此JavaScipt代码,则此字体和此页面的外观可能会更好$('#question pre,.answer pre').css('line-height',1)。)

编写两个相等大小的矩形文本块,一个代表.上面字体中的空白(),另一个代表实心的空格()。

当将这两个文本块排列为与上述数字之一相同的5×7模式时,则所得的大文本块应为将该数字打印到stdout的程序。这应该适用于所有10位数字。

例如,如果您的.文本块是

---
'''

你的文字块是

ABC
123

然后程序

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

应该输出0。同样,程序

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

应该输出1,依此类推直到程序为止9

您可以使用此堆栈片段制作数字形状的程序:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

细节

  • 10个大文本块程序均不需要输入。仅输出一位数字和可选的尾随换行符。输出到stdout或类似的替代方法。
  • 这些程序均不能读取或访问其自己的源代码。将此视为严格的奎因挑战。
  • 文本块可能不相同,并且必须具有非零尺寸。
  • 文本块可以包含除行终止符之外的任何字符。
  • 这10个程序必须是用相同语言编写的完整程序,它们不是REPL代码段。您可以选择在所有行尾添加换行符,也可以不添加。

计分

分数是一个文本块的面积(宽度乘以高度)。(它们的大小相同,因此对两个块进行计数是没有意义的。)示例的区域为3 x 2,得分为6。

最低分获胜。如果是平局,则以投票最高的答案为准。


在您的代码上,您可以进行很多改进。var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");可以写成var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");,虽然相同,但更短。您还可以改善其他方面,但是看起来确实很棒!
Ismael Miguel

4
@IsmaelMiguel TBH我通过JS压缩程序将其放在一行上。从来没有想过打高尔夫球。
加尔文的业余爱好

哦,伙计...这有点偷懒...在打高尔夫球的问题中,您发布了一个非高尔夫代码...但是,嘿,我明白了,我只是在说这个。你不必听我说的。但这是一件好事。
伊斯梅尔·米格尔

6
@IsmaelMiguel我发布了无用的实用程序代码,可以说它应该尽可能易读,以便更容易发现错误。但是实际上,只要可行,堆栈代码段的代码大小实际上就对挑战的结果产生了零影响。
加尔文的业余爱好

3
text blocks may not be identical真?我想看到有人通过提供两个相同的代码块来打破这一规则,当每个数字都是完全相同的代码时,它们会神奇地返回不同的数字^^
Falco 2015年

Answers:


13

CJam,20 18 14 13 12 * 1 = 12

在线尝试:0123456789

空块

];BG*K+ :BD%

实心块

];B9+33%:B4/

说明

我使用了与Sp3000解决方案类似的策略,以便每个块对变量执行乘法,加法和(可能)模运算并将值保存回去。为了找到最佳解决方案,我使用了良好的旧蛮力。我编写了一个程序,该程序搜索所有可能的初始值(CJam变量的初始值)和数百万对可能的转换函数对的空间,以使每个数字形式的输出都是唯一的。然后,我对结果进行了过滤,以使以一个空块结尾的数字形式的最终结果(其中有8个)可以通过另一个乘,加和取模公式映射回正确的结果。

经过几天的CPU时间搜索,到目前为止,最好的结果是缩小为12!此解决方案从值开始11,空块转换函数为x * 16 + 20,空块结果函数为x % 13,实心块转换函数为(x + 9) % 33,实心块结果函数为x / 4


23

> <>(鱼),5 * 10 = 50

空块

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

实心块

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

此代码不包含逻辑或算术,仅使用> <>的2D指令指针(IP)的静态重定向,并带有“镜像”(/\)和两个“箭头”(<v)。唯一的另一个流控制器是“蹦床”(!),它会跳到下一个字符。

IP从左上角向东开始。进行一些重定向后,它到达一个数字,将其压入堆栈并用进行打印,n并以终止程序;

程序流程

块从以下事实“识别”程序的当前状态:IP进入了哪个点,并根据状态决定应释放指针的方向(接下来应执行哪个块)以及确切的位置指针应该离开(这将是新状态)。当然,这些块不执行任何逻辑,所有这些行为都来自重定向器。


我一直希望这样的答案。纯魔术。
EagleV_Attnam

11

CJam,23 22 19 * 1 = 19

空块:

];G)B%:G"73860594"=

实心块:

];GW*B+3*D%:G    7-

在线尝试

我试图通过数学上的巧合和失败来庆幸,因此这是与Martin解决方案唯一性映射略有不同的方法。

从16开始。空块加1并取模数11。实心块乘以-1,加11乘以3再取模数13。这神奇地映射了03456789(以空块结尾的数字)到41753026,我们使用索引正确。12整齐地映射到89,我们可以通过减去7进行补救。


7

CJam,28 27 x 1 = 27

这是一个开始。

空块

U):U;                       

实心块

];U):UW+:WF%"1302986_7_54"=

在这里测试。由于代码太长,我无法为您提供代码的永久链接,因此您必须从挑战中的代码片段中手动复制它。

这个想法是对形状进行如下哈希处理:

  • 对于每个“像素”,增加一个计数器U
  • 对于每个黑色的“像素”,添加U到运行总计W(从开始-1)。最后,我们采用modulo 15,它恰好会给出唯一的结果,该结果用于索引查找字符串。
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.