0

我正在课堂上学习各种编程语言,目前我们正在开展一个 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
4

2 回答 2

1

您可能已经错过了教授的第一堂课,如果您不了解其他编程语言的想法,再次查看以了解向量以及使用它们的难易程度可能会有所帮助;-)

假设您有一个A数字从 1 到 7 的向量: A←⍳7 A 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 成语- 这些年来成长的一些有用的矮子;-)

编辑重新。“维护未触及的值”:回到示例数组 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

我希望你明白这个想法...

于 2015-03-07T12:02:39.860 回答
0

或者更好:问一个新的 q,否则这将真正具有史诗般的维度,而 stackoverflow 的想法更像是“一个问题 - 一个问题”......

于 2015-03-09T18:24:19.067 回答