【问题标题】:Ruby to_s conversion to binary argument errorRuby to_s 转换为二进制参数错误
【发布时间】:2016-04-06 06:24:47
【问题描述】:

我试图解决需要二进制操作的 HackerRank 问题。测试用例的数量非常庞大,所以我认为最好将它们作为字符串来处理。

t=gets
def winner(pturn)
  if a%2==0 
    puts "Richard\n"
  else 
    puts "Louise\n"
  end
end            

while t != 0
    turn=1
    n=gets
    (n2=n).to_s(2)
    while n!=1
        one="1"
        zero="0"
        if n2.count(1)>1
            zero*=(n2.length - 2)
            one.concat(zero)
            n-=one.to_i(base=2)
        else
            n/=2
        end
     turn+=1
     end 
winner(turn)
t-=1
end

它导致如下所示的行中的参数错误(参数数量错误)。

(n2=n).to_s(2)

我认为我错误地使用了to_s。我看不到错误,需要有人指出。

【问题讨论】:

  • 我认为 to_s 不接受任何参数。
  • 这段代码应该做什么?
  • @MuhammadYawarAli: Integer#to_s(或者更准确地说,Bignum#to_sFixnum#to_s 对)接受一个可选的 base 参数,告诉它您要在哪个基数中打印数字。默认值为10
  • 感谢所有试图帮助我的人。我不明白的是我得到的 n 的输入是一个数字,而 n2 基本上是 n。所以类型应该是一个fixnum no?如果它是一个固定编号,为什么 to.s 在适用于 5.to_s(2) 之类的东西时不起作用?
  • @sawa 刚刚不在,但我已经稍微编辑了问题...该程序应该计算谁是最终的赢家。它以一个数字(非常大)开始,如果该数字不是 2 的幂,则减去下一个最大的 2 幂。否则,将其减半。

标签: ruby


【解决方案1】:

我认为您正在尝试将 Ruby 中的数字转换为具有二进制表示形式的字符串。这是可能的(如果数字实际上是 Ruby 中的数字,例如 Fixnum):

4.to_s 2
# => "100"

但在您的情况下,调用 gets 后得到的是一个字符串,而 String 类的 to_s 方法只是返回自身,并且不接受任何参数,因此会出现错误。

您可以通过调用gets.to_i 而不仅仅是gets 来修复它,因此读取的内容字符串将在Ruby 中转换为整数(您应该确保您只会在此处读取数字)。

我相信您正在尝试将n 的二进制表示(作为字符串)分配给变量n2,因为您应该这样做

n2 = n.to_s(2)

如果你这样做:

(n2=n).to_s

因为有括号,首先n2 会被赋值为n,然后to_s 会在n2 上被调用,n2 的字符串版本会被返回,其他的都不会发生。您应该做的第一件事是转换,然后是分配。

您还应该在调用 String#count 时传入一个字符串,即您应该调用 n2.count('2') 而不是 n2.count(2)

【讨论】:

  • @idkwhatamidoing:gets 是“获取字符串”的缩写。你认为它会返回什么? :)
  • 所以gets 实际上将输入作为字符串?谢谢,这真的很有帮助!另外,count() 不是预定义的方法吗?我收到count()undefined method 错误。
  • @SergioTulentsev 哎呀,没想到。有没有办法直接将输入作为整数?抱歉,我太习惯使用强类型的语言了。
  • @idkwhatamidoing:没有强类型的语言会“直接”为您提供整数。控制台输入本质上是文本。你所能做的就是在你得到它时解释字符串(解析为整数或其他)
【解决方案2】:

参数错误即将到来,因为您试图将参数传递给 to_s 方法,因为 to_s 方法从不接受任何参数。

所以你应该把 (n2=n).to_s(2) 改为

(n2=n).to_s

【讨论】:

  • Integer#to_s(或者更准确地说,Bignum#to_sFixnum#to_s 对)接受一个可选的 base 参数,告诉它您要在哪个基数中打印数字。默认值为10
  • 但是如果我把它改成 (n2=n).to_s 程序怎么知道我想把它改成 base 2?
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多