【问题标题】:Why does reduce operator does not work the way I expect it to?为什么 reduce 运算符不能按我预期的方式工作?
【发布时间】:2021-06-04 22:50:04
【问题描述】:

我正在尝试在 Dyalog APL 中解决 Euler 18,但我无法理解为什么我的解决方案不起作用。

问题如下:

从下方三角形的顶部开始移动到相邻的 下面一行的数字,从上到下的最大总数是23。

   3 
  7 4 
 2 4 6
8 5 9 3

即 3 + 7 + 4 + 9 = 23。

以我这样表示的例子为例:

d ← (3 0 0 0)  (7 4 0 0)  (2 4 6 0)  (8 5 9 3) 

我正在尝试以这种方式解决它:

{⍵+((2⌈/⍺)),0}/⌽d

这给了我这个数组:22 19 15 0,其中较大的数字是 22,这不是问题的正确答案,它应该是 23。

我得到了这种行为(为了便于阅读,从左到右):

(2⌈/(8 5 9 3),0)+(2⌈/(2 4 6 0),0)+(2⌈/(7 4 0 0),0)+(2⌈/(3 0 0 0),0)

这给了我与函数相同的结果。

我所期望的是这种行为(每个语句直接替换为下一行):

    (2⌈/(8 5 9 3)),0
(2 4 6 0)+8 9 9 0
    (2⌈/(10 13 15 0)),0
(7 4 0 0)+13 15 15 0
    (2⌈/(20 19 15 0)),0
(3 0 0 0) + 20 19 15 0
23 19 15 0

我想知道我在 APL 流程中的哪些地方误解了导致与我预期不同的结果。

谢谢!

【问题讨论】:

  • 能否在问题中添加第18题的描述?即使是诸如“我需要找到从每个子数组中选择的最大元素的总和”这样的单个句子也会有所帮助,因为该链接不会直接导致问题 18。
  • 这很好,我确实添加了描述,但我似乎无法解决链接的问题,它显示了我第一次点击它的存档页面,然后它没关系。

标签: fold reduction apl dyalog


【解决方案1】:

/ 的工作方式与您的预期相反 - 它从右到左通过数组求值。

F/a b c d⊂a F b F c F d,或者,带括号的是 ⊂(a F (b F (c F d)))

删除 并交换 后,您会得到{⍺+(2⌈/⍵),0}/d,它会给出您想要的结果。

【讨论】:

  • OP 也不需要在每一步都附加一个零并填充每一行 (TIO)
猜你喜欢
  • 2021-02-28
  • 2014-07-10
  • 2018-01-24
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2019-06-29
  • 2020-06-07
相关资源
最近更新 更多