Menu
Coddy logo textTech

복습 - 분수

Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 41번째.

challenge icon

챌린지

어려움

값 클래스 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 컴파일러