我对Project Euler#1的新手解决方案
+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)
Run Code Online (Sandbox Code Playgroud)
我知道这可以重构,转换成一个函数,我不知道该怎么做,我必须阅读所有的实验来学习它.
从J中的表达式中提取名词作为参数的系统方法是什么?要清楚,包含两个文字的表达式应该成为一个二元表达式,使用左右参数而不是文字.
我正在尝试学习默认风格,所以如果可以避免,我不想使用命名变量.
一个具体的例子是我制作的简单模具辊模拟器:
>:?10#6 NB. Roll ten six sided dice.
2 2 6 5 3 6 4 5 4 3
>:?10#6
2 1 2 4 3 1 3 1 5 4
Run Code Online (Sandbox Code Playgroud)
我想系统地将参数10和6提取到表达式的外部,以便它可以滚动任意数量的任何大小的骰子:
d =. <new expression here>
10 d 6 NB. Roll ten six sided dice.
1 6 4 6 6 1 5 2 3 4
3 d 100 NB. Roll three one hundred sided dice.
7 27 74
Run Code Online (Sandbox Code Playgroud)
随意使用我的示例来说明,但我希望能够遵循任意表达式的过程.
编辑:我刚刚发现使用x和y的引用版本可以使用eg自动转换为默认形式13 : '>:?x#y'.如果有人可以告诉我如何找到13 :我可能能够回答我自己的问题的定义.
给定 APL 中的列表,我想检查每个相邻对是否按顺序排列。\n因此,给定(a0, a1, ..., an),我想计算:
(a0 \xe2\x89\xa4 a1) \xe2\x88\xa7 (a1 \xe2\x89\xa4 a2) \xe2\x88\xa7 .... \xe2\x88\xa7 (a[n-1] \xe2\x89\xa4 an)
我不想计算等效形式,我想使用默认编程。\n我的解决方案是((\xc2\xaf1\xe2\x86\x93\xe2\x8a\xa2)\xe2\x88\xa7.\xe2\x89\xa4(1\xe2\x86\x93\xe2\x8a\xa2))但它似乎太冗长了。\n有人有任何想法吗?
在三地址码中一个分支只能有一个二元关系运算符,
例如
if x relop y goto L1, where relop is (!=,==,>,>=,<,<=)
Run Code Online (Sandbox Code Playgroud)
以下如何表示为三地址码格式:
j = 0
while(j < 10 || j < 20)
{
System.out.println(i);
j++;
}
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案,显然是不正确的:
main:
j = 1
sum = 0
L2:
if j < 10 || j < 20 goto L3
goto L4
L3:
mt2 = sum + 1
sum = mt2
mt3 = j + 1
j = mt3
goto L2
L4:
sum = 2
Run Code Online (Sandbox Code Playgroud) 我一直试图用这种类型的签名组合一个组合器:
(a -> b -> c) -> (c -> d -> e) -> a -> b -> d -> e
Run Code Online (Sandbox Code Playgroud)
我已经通过Data.Aviary.Birds和我能找到的所有默认编程帮助网站,但无济于事.此外,如果有一个通用的算法来做这些,将非常感激,但不是必要的.
如何以无点样式重写以下函数,x完全从定义中删除参数(另外两个可能保留):
between min max x = (min < x) && (x < max)
Run Code Online (Sandbox Code Playgroud)
这不是一项任务,只是一个问题.我不知道该怎么办.我可以把它变成一个lambda函数
between min max = \x -> (min < x) && (x < max)
Run Code Online (Sandbox Code Playgroud)
但这不是没有点的,因为x它仍然存在.请帮忙.