背景
您刚刚了解了组合逻辑是什么。对各种组合器感兴趣的是,您花费了大量时间来学习它们。您最终偶然发现了这个特定的表达式:
(S I I (S I I))
您会注意到,在尝试将其简化为正常形式时,经过三个步骤,它会还原为自身:
(S I I (S I I))
= (I (S I I) (I (S I I))) (1)
= (S I I (I (S I I))) (2)
= (S I I (S I I)) (3)
您决心找到具有该特征的其他表达方式,并立即开始对此进行操作。
规则
您可以使用以下组合器的任意组合:
B f g x = f (g x) C f x y = f y x I x = x K x y = x S f g x = f x (g x) W f x = f x x
应用程序保持关联状态,这意味着
(S K K)
实际上是((S K) K)
。还原是最小的,没有其他顺序的还原步骤使用更少的步骤。示例:如果
x
具有减少量y
,则正确的最小减少量(W f x)
为:(W f x) = (W f y) (1) = f y y (2)
并不是
(W f x) = f x x (1) = f y x (2) = f y y (3)
有标准漏洞。
任务
我们将一个表达式的周期定义为两个相同表达式之间的最小化次数。
您的任务是查找表达式,其中使用的组合器数量<100,这会产生最长的循环。
计分
您的分数将取决于您表达周期的长短。如果两个人的表达具有相同的循环,则使用较少组合符的答案将获胜。如果它们都使用相同数量的组合器,则以较早的答案为准。
祝好运并玩得开心点!
原子代码高尔夫将适合您的决胜局,但我不会为决胜局添加标签。如果没有适当的标记,则默认值为code-challenge,这表示挑战使用自定义获胜标准。
—
马丁·恩德
我认为如果您说出您的符号使用的关联性约定会有所帮助。
—
xnor
您所定义的周期不一定定义明确,因为给定的表达式可以具有多个可约数。
—
彼得·泰勒
@ThreeFx,您误会了。例如,如果
—
彼得·泰勒
x
减小到y
那么W f x -> W f y -> f y y
或W f x -> f x x -> f x y -> f y y
长度不同。
现在棘手的事情是,某人不能仅仅通过发布一个周期就获得分数。他们需要证明没有更短的归约,这可能在计算上很困难。
—
xnor 2015年