2016-04-06 5 views
0

Я пытался решить проблему HackerRank, которая требует бинарных манипуляций. В тестовых случаях очень огромные числа, поэтому я решил лучше манипулировать ими как строки.Ruby to_s преобразование в двоичную ошибку аргумента

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 неправильно. Я не вижу ошибки и хочу, чтобы кто-то указал на это.

+1

Я не думаю, что to_s развлекают любые аргументы. –

+0

Что должен делать этот код? – sawa

+1

@MuhammadYawarAli: 'Integer # to_s' (или, точнее, пара [' Bignum # to_s'] (http://ruby-doc.org/core/Bignum.html#method-i-to_s) и [' Fixnum # to_s'] (http://ruby-doc.org/core/Fixnum.html#method-i-to_s)) принимает необязательный аргумент 'base', который сообщает ему, в какой базе вы хотите напечатать номер. Значение по умолчанию - '10'. –

ответ

0

Я думаю, что вы пытаетесь преобразовать число в Руби строку с его двоичное представление. Это возможно (если число на самом деле это число в Ruby, например Fixnum):

4.to_s 2 
# => "100" 

Но в вашем случае, что вы получаете после вызова gets является строка, а 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).

+0

@idkwhatamidoing: 'get' сокращен для« get string ». Как вы думаете, что он вернется? :) –

+0

Так 'gets' фактически принимает ввод как строки? Спасибо, это действительно полезно! Кроме того, не 'count()' предопределенный метод? Я получаю ошибку 'undefined method' для' count() '. – idkwhatamidoing

+0

@SergioTulentsev Упс, не думал об этом. Нет ли способа получить вход как целое напрямую? Извините, я слишком привык к языку с сильными типами. – idkwhatamidoing

-1

Ошибка аргумента возникает, потому что вы пытаетесь передать параметр to_s, потому что метод to_s никогда не принимает никаких аргументов.

Таким образом, вы должны изменить (п2 = п) .to_s (2)

(n2=n).to_s 
+2

'Integer # to_s' (или, точнее, пара [' Bignum # to_s'] (http://ruby-doc.org/core/Bignum.html#method-i-to_s) и ['Fixnum # to_s '] (http://ruby-doc.org/core/Fixnum.html#method-i-to_s)) принимает необязательный аргумент' base', который сообщает ему, в какой базе вы хотите напечатать номер. Значение по умолчанию - '10'. –

+0

Но если я изменю его на (n2 = n) .to_s, как программа узнает, что я хочу изменить ее на base 2? – idkwhatamidoing

Смежные вопросы