Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

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

Okładka posta: Zadanie: Przekształcenie liczby rzymskiej na dziesiętną (Ruby)
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.

[Codecov] Jaka jest różnica między pokryciem patch a pokryciem projektu?
9 kwi '25 16:03

[Codecov] Jaka jest różnica między pokryciem patch a pokryciem projektu?

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?
11 kwi '25 18:24

Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?

24 kwi '25 20:17

Naprawiamy minikube "Próbujesz uruchomić binarkę amd64 na systemie M1."

24 kwi '25 20:55

Instalujemy minikube na Macu z M1 (rezygnujemy z qemu, uruchamiamy na dockerze)

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca
25 kwi '25 23:02

Gdzie znaleźć starszą wersję Google Chrome i ją pobrać? Na przykładzie starego Maca

9 maj '25 19:27

[FIXED] nie można załadować takiego pliku -- html/pipeline (LoadError) występuje podczas rails generate thredded:install

Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)
21 maj '25 10:27

Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)

Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby
22 maj '25 11:01

Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby

Reklama w Google dla początkujących: Krok po kroku do udanego startu
28 maj '25 10:21

Reklama w Google dla początkujących: Krok po kroku do udanego startu

Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails
30 maj '25 11:53

Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails

5 cze '25 01:52

[Fixed] niezainicjowana stała ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały
5 cze '25 18:23

Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały