用 APLX 范围内的特定元素替换 table 中的特定元素
Replacing specific elements in a table with a specific element from a range in APLX
我正在 class 学习多种编程语言,目前我们正在开发一个 APLX 项目。我们必须解决的一个限制是我们不能使用 If、For、While 等。没有循环或条件。我必须能够采用数字平面,范围为 0-7,并将每个数字 2 或更大替换为该数字的深度,并且理想情况下,将 1 更改为 0。例如:
0100230 => 0000560
我不知道应该如何用深度方面进行替换,尽管从 1 到 0 的变化非常简单。我能够在 table 中生成一组整数,并且我了解如何替换特定值,但只能替换为其他特定值,而不是必须在函数期间确定的值。深度应该是行深度,而不是多维深度。
郑重声明,这不是程序的全部,程序本身是一个扑克牌发牌和计分程序。这是我的教授推荐我使用的评分方法的一个具体方面。
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
您可能已经错过了您教授的第一堂课,如果您忘记了其他编程语言的概念,再看一遍以了解向量以及使用它们的难易程度可能会有所帮助 ;-)
假设您有一个包含 1 到 7 数字的向量 A
:
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
或将值 >3
加 500
A+500×A>3
1 2 3 504 505 506 507
或者,找到值 > 3 的索引:
(A>3)×⍳⍴A
0 0 0 4 5 6 7
现在,再次查看您的问题,'depth' 一词在 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 中使用布尔值来操作数组是 APL 中一个非常强大的想法,它会让你走很长的路;-)
此外,如果您想看到更多相同的内容,请查看 FinnAPL Idioms - 多年来发展起来的一些有用的矮子 ;-)
编辑 回复。 "maintaining untouched values":
回到示例数组 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
希望你能明白...
或者更好:问一个新的 q,否则这将真正需要史诗般的维度,而 Whosebug 的想法更像是 "one issue - one question"...
我正在 class 学习多种编程语言,目前我们正在开发一个 APLX 项目。我们必须解决的一个限制是我们不能使用 If、For、While 等。没有循环或条件。我必须能够采用数字平面,范围为 0-7,并将每个数字 2 或更大替换为该数字的深度,并且理想情况下,将 1 更改为 0。例如:
0100230 => 0000560
我不知道应该如何用深度方面进行替换,尽管从 1 到 0 的变化非常简单。我能够在 table 中生成一组整数,并且我了解如何替换特定值,但只能替换为其他特定值,而不是必须在函数期间确定的值。深度应该是行深度,而不是多维深度。
郑重声明,这不是程序的全部,程序本身是一个扑克牌发牌和计分程序。这是我的教授推荐我使用的评分方法的一个具体方面。
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
您可能已经错过了您教授的第一堂课,如果您忘记了其他编程语言的概念,再看一遍以了解向量以及使用它们的难易程度可能会有所帮助 ;-)
假设您有一个包含 1 到 7 数字的向量 A
:
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
或将值 >3
加 500A+500×A>3 1 2 3 504 505 506 507
或者,找到值 > 3 的索引:
(A>3)×⍳⍴A
0 0 0 4 5 6 7
现在,再次查看您的问题,'depth' 一词在 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 中使用布尔值来操作数组是 APL 中一个非常强大的想法,它会让你走很长的路;-)
此外,如果您想看到更多相同的内容,请查看 FinnAPL Idioms - 多年来发展起来的一些有用的矮子 ;-)
编辑 回复。 "maintaining untouched values": 回到示例数组 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
希望你能明白...
或者更好:问一个新的 q,否则这将真正需要史诗般的维度,而 Whosebug 的想法更像是 "one issue - one question"...