복습 - 분수
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 41번째.
챌린지
어려움값 클래스 Frac을 완성하세요. initialize(num, den)은 분수를 기약분수로 만들고 분자에 부호를 유지하며, den이 0이면 zero denominator와 함께 ZeroDivisionError를 발생시킵니다. 새 분수를 반환하는 +, -, *, /를 정의하세요(/는 0인 분수로 나눌 때 division by zero와 함께 ZeroDivisionError를 발생시킵니다). 또한 같은 분수가 동일한 Hash 키가 되도록 -@, ==, eql?, hash를 정의하고, Comparable과 함께 <=>도 정의하세요. to_s는 3/4를 반환하고, 분모가 1이면 2를 반환합니다.
제공된 코드는 다음 명령을 읽습니다: 1/2 + 1/3(네 가지 연산자 중 하나), 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 컴파일러