【问题标题】:Fixnum class method modificationFixnum类方法修改
【发布时间】:2014-06-28 04:16:37
【问题描述】:

这是对我正在为代码大战开发的代码型的描述。 kata 的目标是实现这一点:


这个 Kata 的目的是修改 Fixnum 类以赋予它 palindrome_below 方法。此方法返回所有从(包括 1)到但不包括自身的数字,这些数字是给定基数的回文数。

例如以 2 为底(二进制)

 1 = "1"
 2 = "10"
 3 = "11"
 4 = "100"

因此 1 和 3 是基数为 2 的回文数,该方法应返回以下内容。

5.palindrome_below(2)
=> [1, 3]

这是我目前为这个 kata 编写的代码:

class Fixnum
  def self.palindrome_below(binary)
    palindrome_match = []
    until self == 0
      if to_s(binary) == to_s(binary).reverse
       palindrome_match << self
       self -= 1
      end
    end
    palindrome_match
  end
end

我试图将self 减少1。 Sublime 告诉我,我无法减少 self 的值,但我需要减少 self。因为这是类方法,所以需要修改self

这是我尝试解决的方法:

class Fixnum
  def self.palindrome_below(binary)
    palindrome_match = []
    self_placeholder = self
    until self_placeholder == 0
      if self_placeholder.to_s(binary) == self_placeholder.to_s(binary).reverse
        palindrome_match << self_placeholder
        self_placeholder -= 1
      end
    end
    palindrome_match
  end
end

这一次,我将self 放在一个包装变量中,以便我可以修改它。当我尝试这个时,它说有一个名为palindrome_below 的未定义方法。做这个实现应该有猴子补丁Fixnum。我不确定我做错了什么。有人能指出我正确的方向吗?

【问题讨论】:

  • 没问题。你可以在这里找到它codewars.com/kata/530d0298e09e54a3620006c2/train/ruby 不过你可能需要注册/登录。
  • 正如@sawa 所说,您无疑需要一个实例方法,就像您在示例中所使用的那样:5.palindrome_below(2)。没有必要更改self,事实上,即使您愿意也无法更改。 (更改self 的唯一方法是调用方法或创建类或模块。)试试这个:def palendrome(base); 1.upto(self-1).select { |n| ....}1self-1 将被传递到块中并分配给块变量 n。对于参数base 的给定值,当且仅n 计算为palendrome 时,您必须向返回true 的块添加一个表达式。
  • @CarySwoveland - 我认为您的解决方案比公认的答案要好得多 - 您为什么不将其发布为一个?
  • 谢谢@Uri,但我没有足够的时间来发布正确的答案。如果有帮助,那就足够了。

标签: ruby


【解决方案1】:

一个可行的解决方案(基于您上面的第二次尝试):

class Fixnum
    def palindrome_below(base)
        palindrome_match = []
        num = self - 1
        until num == 0
            if num.to_s(base) == num.to_s(base).reverse
                palindrome_match << num
            end
            num -= 1
        end
       palindrome_match.reverse
    end
end

我改变了什么:

  1. 您添加self_placeholder 是对的——我将此变量命名为num。在 Ruby 中,Fixnums 是不可变的,因此您不能更改特定 Fixnum 本身的值。
    • 我一开始就从num中减去了1,以避免在结果数组中包含数字本身
  2. palindrome_below(base) 需要是一个实例方法。您非常关心 Fixnum 类的特定实例的值(即数字的值)。
  3. 您需要在 if 语句之外的 num 中减去 1。
  4. 我反转了 palindrome_match 数组,使其以正确的升序返回。

一个非常优秀的解决方案(感谢@CarySwoveland 上面的评论)。

class Fixnum
    def palindrome_below(base)
        1.upto(self-1).select { |num| num.to_s(base) == num.to_s(base).reverse }
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2014-11-08
    • 2019-06-30
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多