Ruby 有没有人参加了渣打的编程马拉松啊?求组队

chancedoor · 2013年08月13日 · 最后由 edgar_wang_cn 回复于 2013年08月13日 · 2630 次阅读

上海 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 之间有一个空格。

input 文件

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)

- -。原来是这个,我帮同学折腾过这题。。。

#2 楼 @ChanceDoor - -。我当时不知道好么。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号