可视化教堂数字


9

背景

可视化λ微积分项

著名的lambda-juggler(和代码高尔夫球手)John Tromp设计了一个有趣的可视化 λ微积分项。用他的话说:

抽象(lambda)由水平线表示,变量由从其绑定lambda向下发出的垂直线表示,应用程序由连接最左侧变量的水平链接表示。

例如,λ项λf.λx.f(f(f(fx)))对应于可视化:

-------------------
 |   |   |   |
-------------------
 |   |   |   |   |
 |   |   |   |----
 |   |   |----
 |   |----
 |----
 |

从上到下阅读:

  • 第一水平线代表第一λ。
  • 从它开始的四行代表体内的f s。
  • 类似地,第二条水平线代表第二条λ,从其下降的一条新线代表体内的x
  • 最右边的f线和x线由代表应用程序(f x)的水平线连接。
  • 下一个应用是[f(f x))等。

教堂数字

Church数是在λ演算项的特定序列,考虑以下图案:

0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...

任务

给定输入数字n,打印一些ASCII艺术作品,以可视化第n个教堂数字。例如,上面的示例是给定n = 4时的目标输出。对于n = 0,打印:

---

---
 |
 |

测试用例

对于所有n≥0的整数输入,您的答案必须输出与此堆栈代码段完全相同的文本(模尾换行符):

这是 ,因此以字节为单位的最短代码获胜。


您的摘要给了我错误。
Leaky Nun

@LeakyNun哪个浏览器?有些浏览器不支持.repeat
科纳·奥布莱恩

是否允许尾随空格?
Loovjo

不,仅尾随换行符。(这是点菜无政府状态高尔夫,我觉得这是最好的规则集ASCII艺术的挑战。)
林恩

Answers:


4

视网膜74 67 63字节

字节数假定为ISO 8859-1编码。

.
 |  
^
$.'$*----¶
\z
¶$` |
+`(.+\|) .+$
$&¶$1----
$
¶ |
  ¶
¶

输入为一元,使用换行符以外的任何字符作为数字。

在线尝试!

说明

.
 |  

我们首先将每个一进制数字变成 | (注意尾随空格)。这给了我们输出的第二行(如果输入至少为,则加上两个尾随空格1)。

^
$.'$*----¶

我们匹配字符串的开头,以便在第一行之前添加。这是使用某些视网膜特定的替换功能完成的。$*在右侧重复该字符的次数与在左侧重复的次数相同。$.'计算匹配右边的字符数。由于匹配仅是字符串的开头,因此它给出-的字符数与字符串中的字符数相同,并---追加三个字符。该是换行的别名。所以现在我们有了前两行。

\z
¶$` |

现在,我们添加下两行。我们通过匹配字符串的末尾并添加换行符,再次整个字符串 |来实现此目的,然后使第四行正确。

+`(.+\|) .+$
$&¶$1----

申请时间。引导+使Retina重复此阶段,直到输出停止更改(在这种情况下,因为正则表达式不再匹配)。如果正则表达式包含一个|后跟空格,则它与整个最后一行匹配。我们将捕获所有数据(直到|组中的倒数第二个)1。我们先用$&换行符将行写回,然后是组1(从而删除最后一个|),然后是----

$
¶ |

这只会添加仅包含单个的最后一行|

  ¶
¶

最后,我们需要摆脱第二行上的尾随空格。


2

JavaScript(ES6),112字节

f=
n=>`${d=`-`.repeat(n*4+3)}
${(b=` |  `.repeat(n)).slice(0,-2)}
${d}
${b} |
${b.replace(/ \|  /g,`$' |----
`)} |`
;
<input id=i type=number min=0 oninput=o.textContent=f(this.value)>
<pre id=o></pre>


所有换行都是必需的吗?另外,有f=必要吗?
NoOneIsHere

@NoOneIsHere换行符是模板字符串的一部分。该f=是没有答案的一部分,它只是需要的片段,并且不计入总字节的一部分。
尼尔

2

Python,201字节

from pylab import*
n=input()
p=array(list(' -|\n'))
a=zeros((n+5,n*4+4),int)
for k in range(n):l=4*k+5;a[:-k-1,l]=2;a[-k-2,l-3:l+1]=1
a[:,1]=2
a[1,-3]=0
a[0]=a[2]=1
a[:,-1]=3
print''.join(ravel(p[a]))

1

Python 2,138字节

def f(n,a=1):
 if ~n:b="---\n";c=" |";d="  "+c;print("-"*n*4+b+c*(n>0)+d*(n-1)+"\n"+"-"*n*4+b+c+d*n+"\n")*a+c+d*(n-1)+"-"*4*(n>0);f(n-1,0)

该函数包含一个额外的参数,但仅供内部使用。它具有默认值,在调用函数时应将其省略。我希望这不会违反规则。

该函数绘制前5行,然后递归调用自身以绘制其余行。

在线尝试

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.