【问题标题】:Ruby equilibrium index - odd usage of inject红宝石平衡指数 - 注入的奇怪用法
【发布时间】:2012-06-23 11:17:28
【问题描述】:

我今天花了一点时间解决均衡指数问题(描述为here

在编写了我自己的解决方案(它在大数字时表现不佳)后,我决定找到一个能获得满分的解决方案。我找到了这个(which Codility scores as 100/100):

  def equi(a)
    left, right = 0, a.inject(0, &:+)
    indices = []
    a.each_with_index do |val, i|
      right -= val

      indices << i if right == left

      left += val
    end
    indices
  end

我不明白的是方法顶部的并行分配和使用注入。有谁能描述这是在做什么?

非常感谢! 斯图

【问题讨论】:

    标签: ruby inject parallel-assignment


    【解决方案1】:

    它将 0 分配给 left,并将 a 的元素之和分配给 right。存在 0 参数是因为否则空数组将返回 nil。用于求和的简写是 Symbol#to_proc 并且是不必要的,因为 inject 直接将符号作为其参数 - inject(0, :+)

    【讨论】:

    • 非常感谢@Michael Kohl 的解释。我需要阅读并行作业。让这更加奇怪的一件事是,当我在赋值行后面插入一个调试器时,'left' 和 'right' 的值都是 0。我不应该期望 'right' 是 vals 的总和那个阶段的阵列?还是稍后评估?
    • 并行分配并不特别。 right 应该只在 a 为空时为 0。
    【解决方案2】:

    这只是数组的总和:

    >> ar = (1..10).to_a
    => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
    >> ar.inject(0, &:+)
    => 55 
    # or a shorter version
    >> ar.inject(&:+)
    => 55
    

    您真的应该阅读doc 上的Enumerable#inject 方法。它解释了一切。

    【讨论】:

    • 如果ar == [],则较短的版本返回nil
    • 欣赏注入部分的答案。我读过有关注入的文章,但事实证明,最令人困惑的是并行分配
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多