Menu
CoddyTech

Ringkasan: Pecahan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 41 dari 57.

challenge icon

Tantangan

Sulit

Lengkapi class nilai Frac. initialize(num, den) menyederhanakan pecahan dan mempertahankan tanda pada pembilang, serta memunculkan ZeroDivisionError dengan zero denominator saat den bernilai 0. Definisikan +, -, *, dan / yang mengembalikan pecahan baru (/ dengan pecahan nol akan memunculkan ZeroDivisionError dengan division by zero), -@, ==, eql?, dan hash agar pecahan yang sama menjadi kunci Hash yang sama, serta <=> dengan Comparable. to_s mengembalikan 3/4, atau 2 saat penyebutnya 1.

Kode yang disediakan membaca perintah: 1/2 + 1/3 (salah satu dari empat operator), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (mencetak jumlah dan pecahan yang berbeda), serta cmp 1/2 2/4 (mencetak =, <, atau >). Error mencetak pesannya.

Tulis kodemu di frac.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'frac'

# Kode input/output yang disediakan: biarkan apa adanya
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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online