Menu
Coddy logo textTech

復習 - 分数

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 41/57。

challenge icon

チャレンジ

難しい

値クラス Frac を完成させてください。initialize(num, den) は分数を約分し、符号を分子に保持します。den が 0 の場合は、zero denominator を伴う ZeroDivisionError を発生させます。新しい分数を返す +、-、*、/(ゼロ分数による / は division by zero を伴う ZeroDivisionError を発生させます)、-@、==、eql?、および等しい分数が同じ Hash キーになるように hash を定義し、Comparable とともに <=> も定義してください。to_s は 3/4 を返します。ただし分母が 1 の場合は 2 を返します。

提供されたコードは次のコマンドを読み取ります:1/2 + 1/3(4 つの演算子のいずれか)、neg 3/4、sort 1/2 1/3 3/4、max 1/2 2/3、uniq 1/2 2/4 1/3(個数と重複しない分数を出力)、および cmp 1/2 2/4(=、<、または > を出力)です。エラーはそのメッセージを出力します。

コードは frac.rb に記述します。main.rb には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

require_relative 'frac'

# 提供された入出力コード: そのままにしておく
input = []
while (line = gets)
  input << line.chomp
end
def frac(text)
  n, d = text.split("/").map(&:to_i)
  Frac.new(n, d || 1)
end

input.each do |line|
  parts = line.split
  begin
    case parts[0]
    when "neg" then puts(-frac(parts[1]))
    when "sort" then puts parts[1..].map { |t| frac(t) }.sort.join(" ")
    when "max" then puts parts[1..].map { |t| frac(t) }.max
    when "uniq"
      distinct = parts[1..].map { |t| frac(t) }.uniq
      puts "#{distinct.size}: #{distinct.join(" ")}"
    when "cmp"
      order = frac(parts[1]) <=> frac(parts[2])
      puts ["<", "=", ">"][order + 1]
    else
      a = frac(parts[0])
      b = frac(parts[2])
      puts a.public_send(parts[1], b)
    end
  rescue ZeroDivisionError => e
    puts e.message
  end
end

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ