Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:减少重复_Ruby - Fatal编程技术网

Ruby:减少重复

Ruby:减少重复,ruby,Ruby,我是一个初学者,用ruby为下面的问题编写了一个脚本。我读到不建议重复,并希望减少if、elsif、else语句的重复,但似乎找不到方法 古罗马数字。在罗马数字的早期,罗马人并不在意任何这种新型的副牵引力“九”的胡说八道。不,先生,这是直接加上去的,从大到小,所以9写的是“VIIII”,等等。写一个方法,当传递一个介于1和3000之间的整数(或更多)时,返回一个包含正确的老式罗马数字的字符串。换句话说,旧罗马数字4应该返回'IIII'。确保在一堆不同的数字上测试你的方法。提示:使用第37页的整数

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

古罗马数字。在罗马数字的早期,罗马人并不在意任何这种新型的副牵引力“九”的胡说八道。不,先生,这是直接加上去的,从大到小,所以9写的是“VIIII”,等等。写一个方法,当传递一个介于1和3000之间的整数(或更多)时,返回一个包含正确的老式罗马数字的字符串。换句话说,旧罗马数字4应该返回'IIII'。确保在一堆不同的数字上测试你的方法。提示:使用第37页的整数除法和模数法。 以下是所用字母的值,仅供参考: I=1V=5X=10L=50C=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
显示“您的电话号码是多少?”
n=get.chomp
num=n.to_i
number=“”
l=n.长度
i=0
虽然是真的
如果num>3000
放入“输入另一个数字”
如果l==0
打破
其他的
如果l==4
数字+=“M”*n[i]。至
l-=1
i+=1
如果l==3

如果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
显示“您的电话号码是多少?”
输入=get.to_i
数字={
1000=>“M”,
500=>“D”,
100=>“C”,
50=>“L”,
10=>“X”,
5=>“V”,
1=>“我”
}
数字=[]
数字。每个do | n,数字|
当输入>=n时

digits另一种方法,如@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"
数字={
1000=>“M”,
500=>“D”,
100=>“C”,
50=>“L”,
10=>“X”,
5=>“V”,
1=>“我”
}
输入=9658
数字。每个带有对象(“”)do(n,数字),str|
nbr,input=input.divmod(n)
str“mmmmmmmmm dclviii”

我认为最简单的方法是重写它,如果你注意到问题陈述中的提示,即使用模数,这几乎变得微不足道什么是“数值”?什么是“牵引力不足”?什么是“inte-ger”?你连引证都不对吗?什么是“最小”?有这样的词吗?第37页是什么?为什么要插入一个数组并稍后加入它们?它比直接连接到字符串更有效吗?你的
chomp
是多余的。我打赌字符串连接更有效,但无法衡量任何合理的东西。关于chomp.numbers.each do | n,digital | digits的意见一致