復習 - 分数
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 41/57。
チャレンジ
難しい値クラス 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オンラインコンパイラ