我在课堂上学习编程语言,我们目前正在研究APLX项目。我们必须解决的限制是我们不能使用If,For,While等。没有循环或条件。我必须能够取0-7的数字平面,并将每个数字2或更大的数字替换为该数字的深度,并且理想情况下,将1更改为0。例如:
0100230 => 0000560
我不知道我应该如何用深度方面进行替换,尽管从1到0的变化非常简单。我能够在表格中生成整数集合,并且我了解如何替换特定值,但仅限于其他特定值,而不是在函数期间必须确定的值。深度应该是行深度,而不是多维深度。
对于记录而言,这不是整个程序,程序本身就是一个扑克交易和评分程序。这是我教授建议我使用的评分方法的一个特定方面。
TOTALS„SCORE PHAND;TYPECOUNT;DEPTH;ISCOUNT;TEMPS;REPLACE
:If (½½PHAND) = 0
PHAND„DEAL PHAND
:EndIf
TYPECOUNT„CHARS°.¹PHAND
DEPTH„2Þ(½TYPECOUNT)
REPLACE „ 2 3 4 5 6 7
ISCOUNT „ +/ TYPECOUNT
ISCOUNT „ ³ISCOUNT
((1=,ISCOUNT)/,ISCOUNT)„0
©((2=,ISCOUNT)/,ISCOUNT)„1
©TEMPS „ ISCOUNT
Œ„ISCOUNT
Œ„PHAND
答案 0 :(得分:1)
你可能已经错过了教授的第一课,可能有助于再次了解向量以及如何轻松地使用它们 - 一旦你没有学习其他编程语言的想法; - )
假设您有一个数字从1到7的向量A
:
一←⍳7
一个
1 2 3 4 5 6 7
现在,如果你想搜索值> 3,你会这样做:
A>3
0 0 0 1 1 1 1
结果也是一个矢量,您可以轻松地将两者结合起来进行操作:
乘法仅保留值> 0并用0替换其他:
A×A>3
0 0 0 4 5 6 7
或将500添加到值> 3
A + 500×A→3 1 2 3 504 505 506 507
或者,找到值的索引> 3:
(A>3)×⍳⍴A
0 0 0 4 5 6 7
现在,再看看你的q,“深度”这个词在APL中有一个特定的含义,我想你的意思是不同的。我是否正确理解您要替换值> 2这些值的'指数'? 好吧,通过我之前展示的内容,这很容易:
A←0 1 0 0 2 3 0
(A≥2)×⍳⍴A
0 0 0 0 5 6 0
编辑:查看多维数组: 让我们看一下这个例子:
A←(⍳5)∘.×⍳10
A
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
现在,哪些数字是> 20和< 30?
z←(A>20)∧A<30
z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0 0 0
然后,您可以将值与该布尔结果相乘,以仅过滤掉满足条件的值:
A×z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 21 24 27 0
0 0 0 0 0 24 28 0 0 0
0 0 0 0 25 0 0 0 0 0
或者,您可能对值的列索引感兴趣吗?
z×[2]⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0
注意:此声明可能不适用于所有APL方言。这是另一种表达方式:
z×((1↑⍴z)⍴0)∘.+⍳¯1↑⍴z
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 7 8 9 0
0 0 0 0 0 6 7 0 0 0
0 0 0 0 5 0 0 0 0 0
我希望这会给你一些想法。一般来说,在数学运算中使用布尔值来操纵数组是APL中一个非常强大的想法,它会带你走路; - )
此外,如果你想看到更多相同内容,请查看FinnAPL Idioms - 这些年来增长的一些有用的短缺; - )
修改。 “保持原始价值”: 回到示例数组A:
A←(⍳5)∘.×⍳10
A
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
使用这些值的幂2替换20到30之间的值,保持所有其他值不变:
touch←(A>20)∧A<30
(touch×A*2)+A×~touch
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 441 576 729 30
4 8 12 16 20 576 784 32 36 40
5 10 15 20 625 30 35 40 45 50
我希望你明白这个想法......
答案 1 :(得分:0)
或更好:问一个新的q,否则这将真正采用史诗尺寸,而stackoverflow的想法更像是&#34;一个问题 - 一个问题&#34; ...