Ruby:减少重复

时间:2014-09-04 02:11:08

标签: ruby

我是初学者,并在ruby中为下面的问题编写了一个脚本。我读到重复不是推荐的,并希望减少if,elsif,else语句的重复,但似乎无法找到方法。

老派罗马数字。在罗马数字的早期,罗马人并没有打扰任何这种新奇的牵引“IX”废话。不,先生,它是直接添加,最大到最小 - 所以9写的是“VIIII”,依此类推。编写一个方法,当传递1到3000之间的整数(或左右)时,返回一个包含正确的老式罗马数字的字符串。换句话说,old_roman_numeral 4应返回' IIII'。确保在一堆不同的数字上测试你的方法。提示:使用第37页的整数除法和模数法。 作为参考,这些是使用的字母的值: I = 1V = 5X = 10L = 50℃= 100D = 500M = 1000

这是我的剧本......

puts "What is your number?"
n = gets.chomp
num = n.to_i
number = ""
l = n.length
i = 0

while true
    if num > 3000
        puts "Enter another number."
    elsif l == 0
        break
    else
        if l == 4
            number += "M" * n[i].to_i
            l -= 1
        i += 1
    elsif l == 3
        if 1 <= n[i].to_i && n[i].to_i <= 4
            number += "C" * n[i].to_i
        elsif n[i].to_i == 5
            number += "D"
        elsif 6 <= n[i].to_i && n[i].to_i <= 9
            number += "D" + "C" * (n[i].to_i - 5)
        end
            l -= 1
            i += 1
        elsif l == 2
            if 1 <= n[i].to_i && n[i].to_i <= 4
                number += "X" * n[i].to_i
            elsif n[i].to_i == 5
                number += "L"
            elsif 6 <= n[i].to_i && n[i].to_i <= 9
                number += "L" + "X" * (n[i].to_i - 5)
            end
            l -= 1
            i += 1
        else
            if 1 <= n[i].to_i && n[i].to_i <= 4
                number += "I" * n[i].to_i 
            elsif n[i].to_i == 5
                number += "V"
            elsif 6 <= n[i].to_i && n[i].to_i <= 9
                number += "V" + "I" * (n[i].to_i - 5)
            end
            l -= 1
            i += 1
        end
    end
end

2 个答案:

答案 0 :(得分:1)

这不使用整数除法或模数,但它可能是有益的。

puts "What is your number?"
input = gets.to_i

numerals = {
  1000 => "M",
  500 => "D",
  100 => "C",
  50 => "L",
  10 => "X",
  5 => "V",
  1 => "I"
}

digits = []
numerals.each do |n, digit|
  while input >= n
    digits << digit
    input = input - n
  end
end

puts digits.join

答案 1 :(得分:1)

另一种方法,就像@sawa建议的那样构建一个字符串,而不是构造一个数组然后使用join

numerals = {
  1000 => "M",
  500 => "D",
  100 => "C",
  50 => "L",
  10 => "X",
  5 => "V",
  1 => "I"
}

input = 9658

numerals.each_with_object('') do |(n, digit),str|
  nbr, input = input.divmod(n)
  str << digit*nbr
end
  #=> "MMMMMMMMMDCLVIII"