Menu
Coddy logo textTech

Tekrar - Kesirler

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 57.

challenge icon

Görev

Zor

Frac değer sınıfını tamamlayın. initialize(num, den) kesri sadeleştirir ve işareti payda değil pay üzerinde tutar; den 0 olduğunda zero denominator mesajıyla ZeroDivisionError oluşturur. Yeni kesirler döndürecek şekilde +, -, * ve / işleçlerini tanımlayın (/ işleminin sıfır kesirle yapılması, division by zero mesajıyla ZeroDivisionError oluşturur); eşit kesirlerin aynı Hash anahtarı olması için -@, ==, eql? ve hash yöntemlerini ve Comparable ile birlikte <=> yöntemini tanımlayın. to_s, 3/4 döndürür; payda 1 olduğunda ise 2 döndürür.

Sağlanan kod şu komutları okur: 1/2 + 1/3 (dört işleçten herhangi biri), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (sayımı ve farklı kesirleri yazdırır) ve cmp 1/2 2/4 (=, < veya > yazdırır). Hatalar kendi mesajlarını yazdırır.

Kodunuz frac.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'frac'

# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi