J,16 11字节
(+$:)^:=1+?
在线尝试!
说明
TL; DR 1+?
执行模头滚动,(+$:)^:=
仅在等于输入时重复。
该函数是由四个动词组成的系列:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
火车是两个或多个动词串联而成的。在这里,答案的形式为f g h j
:
(+$:)^:= 1 + ?
f g h j
所谓的“ 4-train”被解析为钩子和叉子:
f g h j ⇔ f (g h j)
因此,答案等同于:
(+$:)^:= (1 + ?)
挂钩:(f g) x
和x (f g) y
给定参数为两个动词的单子(单参数)钩子x
,以下等价成立:
(f g) x ⇔ x f (g x)
例如,(* -) 5
计算为5 * (- 5)
,计算为_25
。
这意味着我们的4列火车(f
和的一个钩子(g h j)
)等效于:
(f (g h j)) x ⇔ x f ((g h j) x)
但是f
这里做什么呢?(+$:)^:=
是使用Power合词的两个动词的合词^:
:另一个钩子((+$:)
)和一个动词(=
)。请注意,这里f
是二进位的 -它有两个参数(x
和(g h j) x
)。因此,我们必须查看^:
行为方式。幂级联f^:o
采用一个动词f
和一个动词或一个名词o
(名词只是一条数据)并应用f
o
时间。例如,以o = 3
。以下等价成立:
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
如果o
是动词,则幂连词将仅对o
参数进行求值,并将名词结果用作重复计数。
对于我们的动词,o
是=
等价动词。它0
针对不同的论点和1
相等的论点进行求值。(+$:)
对于相同的参数,我们只对钩子重复一次,对于不同的参数,则不需重复。为了便于说明,让y ⇔ ((g h j) x)
。请记住,我们的初始钩子与此等效:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
扩展连接,将变为:
x ((+$:)^:(x = y)) y
如果x
和y
相同,则变为:
x (+$:)^:1 y ⇔ x (+$:) y
否则,它将变为:
x (+$:)^:0 y ⇔ y
现在,我们已经看到了单子叉子。在这里,我们有一个二叉叉:
x (f g) y ⇔ x f (g y)
因此,当x
和y
相同时,我们得到:
x (+$:) y ⇔ x + ($: y)
什么$:
啊 它指的是整个动词本身,并允许递归。这意味着,何时x
和y are the same, we apply the verb to
y and add
x`。
货叉: (g h j) x
现在,内叉有什么作用?这是y
我们的最后一个例子。对于三个动词的单子叉,给定参数x
,以下等价成立:
(g h j) x ⇔ (g x) h (j x)
在下一个示例中,假设我们有名为,和的动词SUM
,它们会做您认为可能的事。如果将三个连接成一个叉,我们将得到:DIVIDE
LENGTH
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
此分叉求和的平均值x
(假设x
是数字列表)。在J中,我们实际上将其写为+/ % #
。
关于叉子的最后一件事。当最左边的“ tine”(在上面的符号情况下为g
)是名词时,它将被视为返回该值的常数函数。
完成所有这些操作后,我们现在可以了解上述分支:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
[0,x)[1,x]
放在一起
考虑到所有这些事情,我们的动词等同于:
((+$:)^:=1+?) x ⇔ ((+$:)^:= 1 + ?) x
⇔ ((+$:)^:= (1 + ?)) x
⇔ x ((+$:)^:=) (1 + ?) x
⇔ x ((+$:)^:=) (1 + (? x))
⇔ x (+$:)^:(x = (1 + (? x))
(let y = 1 + (? x))
if x = y ⇒ x + $: y
otherwise ⇒ y
这表示所需的功能。