← strona głównaProgramowanie (Програмування)

Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)

Dowiedz się, jak za pomocą Ruby przekształcić liczbę rzymską na dziesiętną. Proste i skuteczne rozwiązanie problemu z wyjaśnieniem zasady działania algorytmu i testami w RSpec. Odpowiednie dla początkujących i do ćwic...

Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Rozważmy prostą wersję rozwiązania problemu przekształcania liczby rzymskiej na dziesiętną (Ruby).

Warunek

Stwórz funkcję solution, która przyjmuje ciąg — liczbę rzymską — i zwraca jej wartość jako dziesiętną liczbę całkowitą.
Walidacja poprawności zapisu rzymskiego nie jest wymagana.
Przykłady:
  • "MCMXC" → 1990
  • "MMVIII" → 2008
  • "MDCLXVI" → 1666

Jak działa konwersja liczb rzymskich na dziesiętne?

Liczby rzymskie to system liczbowy oparty na symbolach, z których każdy odpowiada określonej wartości: I — 1, V — 5, X — 10, L — 50, C — 100, D — 500, M — 1000. Aby zapisać liczbę, symbole są łączone według określonych zasad. Jeśli symbol o mniejszej wartości stoi przed większym (na przykład IV), oznacza to odejmowanie (5 - 1 = 4). Jeśli jest odwrotnie — dodaje się (VI = 5 + 1 = 6). Dzięki tej logice można kompaktowo zapisywać zarówno proste liczby, jak i złożone, takie jak MCMXC dla 1990.
Podczas przekształcania liczb rzymskich na dziesiętne algorytm komputerowy przechodzi przez symbole ciągu od prawej do lewej. Umożliwia to łatwe określenie, czy należy dodać wartość symbolu, czy ją odjąć. Na przykład w XIV przetwarzanie zaczyna się od V = 5, następnie I = 1 (mniejsze od V, więc odejmujemy: 5 - 1 = 4), następnie X = 10 (większe od I, więc dodajemy: 10 + 4 = 14). Takie podejście pozwala efektywnie zrealizować konwersję nawet w kilku linijkach kodu.

Test (rspec) do sprawdzenia metody

RSpec.describe '#solution' do
  it 'przekształca proste liczby rzymskie' do
    expect(solution('I')).to eq(1)
    expect(solution('III')).to eq(3)
    expect(solution('VIII')).to eq(8)
  end

  it 'przekształca złożone liczby rzymskie' do
    expect(solution('IV')).to eq(4)
    expect(solution('IX')).to eq(9)
    expect(solution('XL')).to eq(40)
    expect(solution('XC')).to eq(90)
  end

  it 'przekształca duże liczby rzymskie' do
    expect(solution('MCMXC')).to eq(1990)
    expect(solution('MMVIII')).to eq(2008)
    expect(solution('MDCLXVI')).to eq(1666)
    expect(solution('MMMCMXCIX')).to eq(3999)
  end
end

Metoda solution

Jedna z wersji rozwiązania (za pomocą Ruby te same rzeczy można robić na wiele sposobów).
def solution(roman)
  values = {
    'M' => 1000,
    'D' => 500,
    'C' => 100,
    'L' => 50,
    'X' => 10,
    'V' => 5,
    'I' => 1
  }

  total = 0
  prev = 0

  roman.chars.reverse.each do |char|
    current = values[char]
    if current < prev
      total -= current
    else
      total += current
      prev = current
    end
  end

  total
end

Zasada działania algorytmu

Poruszamy się od końca ciągu, dodając wartości symboli. Jeśli bieżąca liczba jest mniejsza od poprzedniej — odejmujemy ją, w przeciwnym razie — dodajemy. Pozwala to poprawnie obsługiwać przypadki takie jak IV czy CM.

🔥 Więcej postów

Wszystkie wpisy