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 16:03

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

meme code
meme code@memecode
Jak kursy Scratch pomagają dzieciom rozwijać umiejętności miękkie?
11 kwi 18:24

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

meme code
meme code@memecode
24 kwi 20:17

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

meme code
meme code@memecode
24 kwi 20:55

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

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

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

meme code
meme code@memecode
9 maj 19:27

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

meme code
meme code@memecode
Zadanie na sprawdzenie poprawności rozmieszczenia nawiasów (Ruby)
21 maj 10:27

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

meme code
meme code@memecode
Jak znaleźć podtablicę o maksymalnej sumie (Maximum Subarray Sum) w Ruby
22 maj 11:01

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

meme code
meme code@memecode
Reklama w Google dla początkujących: Krok po kroku do udanego startu
28 maj 10:21

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

meme code
meme code@memecode
Czym jest jemalloc i jak ma się do Ruby / Ruby on Rails
30 maj 11:53

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

meme code
meme code@memecode
5 cze 01:52

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

meme code
meme code@memecode
Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały
5 cze 18:23

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

meme code
meme code@memecode