使用APLX中某个范围内的特定元素替换表中的特定元素

时间:2015-03-06 17:56:31

标签: arrays dynamic multidimensional-array depth apl

我在课堂上学习编程语言,我们目前正在研究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

2 个答案:

答案 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; ...