Menu
Coddy logo textTech

Riepilogo - Frazioni

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 41 di 57.

challenge icon

Sfida

Difficile

Completa la classe valore Frac. initialize(num, den) riduce la frazione e mantiene il segno al numeratore, sollevando ZeroDivisionError con zero denominator quando den è 0. Definisci +, -, * e / che restituiscono nuove frazioni (/ per una frazione nulla solleva ZeroDivisionError con division by zero), -@, ==, eql? e hash, in modo che le frazioni uguali siano la stessa chiave Hash, e <=> con Comparable. to_s restituisce 3/4, oppure 2 quando il denominatore è 1.

Il codice fornito legge i comandi: 1/2 + 1/3 (uno qualsiasi dei quattro operatori), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (stampa il conteggio e le frazioni distinte) e cmp 1/2 2/4 (stampa =, < oppure >). Gli errori stampano il loro messaggio.

Il tuo codice va in frac.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

require_relative 'frac'

# Codice di input/output fornito: lascialo così com'è
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

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online