上海 ruby 一个也没有啊 ? 分享一下我的初试代码
输入文件 input.txt 的内容可分为两部分:
不同单位和标准长度米的转换规则,比如 1 mile = 1609.344 meters,代表 1 英里等于 1609.344 米;
转换前或者计算前的单位,比如 1.2 miles // 一个长度 1.2 miles + 1 fath - 0.2 meters // 单位可能不同的长度之间的加减运算
您要做的是一个长度单位转化和计算工具,能够把不同的长度单位转换为标准长度(米),并且可以在不同单位之间进行加减运算。
输出文件的格式共有 12 行,并严格遵守以下规则:
第 1 行是您在渣打编程马拉松官网上报名时的注册邮箱,比如 [email protected]
第 2 行是空行
第 3 行至第 12 行,每行显示 1 个计算结果,比如 1931.21 m
计算结果要求精确到小数点后两位
计算结果均以字母 m 结尾,请注意数字和字母 m 之间有一个空格。
1 mile = 1609.344 m 1 yard = 0.9144 m 1 inch = 0.00254 m 1 foot = 0.03048 m 1 fath = 1.8288 m 1 furlong = 201.17 m
1.2 miles 0.15 yard 32.7 inches 127.93 feet 22 faths 0.032 furlong 1 furlong + 2.5 feet 0.9 miles - 18 inches 1 fath - 1 foot + 12.5 inches 3.02 miles + 17.5 yards - 0 fath
class Worker
def initialize(input)
@in = input
@p = 0
@rule = {}
@result = ["[email protected]\n","\n"]
end
def run
@in.each do |line|
if line == "\n"
@p = @p + 1
else
factor= line.split(' ')
case @p
when 0
@rule[factor[1]] = factor[3]
when 1
equation = []
factor.each_with_index do |array,index|
if !(array =~ /^[a-z]+$/ || array =~ /\+|\-/)
unit = singularize(factor[index+1])
equation.push( array.to_f * @rule[unit].to_f)
end
equation.push(array) if array =~ /\+|\-/
end
answer = eval(equation.join)
@result.push(format("%.2f",answer).to_s+" m\n")
end
end
end
@result
end
def singularize(s)
dic = {"s$" => '',"es$" => '',"ee" => 'oo'}
return s if @rule[s]
dic.each do |k,v|
z = s.gsub(/#{k}/,v)
return z if @rule[z]
end
s
end
end
@rs = Worker.new(File.open("input.txt")).run
File.new("output.txt","w").puts(@rs)