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.
Ten post nie ma jeszcze żadnych dodatków od autora.