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