Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Aufgabe: Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby)

Beitrags-Cover: Aufgabe: Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby)
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Betrachten wir eine einfache Möglichkeit, das Problem der Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby) zu lösen.

Aufgabe

Erstellen Sie eine Funktion solution, die einen String — eine römische Zahl — akzeptiert und ihren Wert als dezahlen Ganzzahl zurückgibt.
Eine Validierung der Richtigkeit der römischen Schreibweise ist nicht erforderlich.
Beispiele:
  • "MCMXC" → 1990
  • "MMVIII" → 2008
  • "MDCLXVI" → 1666

Wie funktioniert die Umwandlung von römischen Zahlen in Dezimalzahlen?

Römische Zahlen sind ein Zahlensystem, das auf Symbolen basiert, von denen jedes einem bestimmten Wert entspricht: I — 1, V — 5, X — 10, L — 50, C — 100, D — 500, M — 1000. Um eine Zahl zu schreiben, werden die Symbole nach bestimmten Regeln kombiniert. Wenn ein Symbol mit einem geringeren Wert vor einem größeren steht (zum Beispiel IV), bedeutet das Subtraktion (5 - 1 = 4). Stehen sie jedoch in umgekehrter Reihenfolge — werden sie addiert (VI = 5 + 1 = 6). Dank dieser Logik können sowohl einfache als auch komplexe Zahlen kompakt geschrieben werden, wie MCMXC für 1990.
Bei der Umwandlung von römischen Zahlen in Dezimalzahlen durchläuft der Computeralgorithmus die Zeichen des Strings von rechts nach links. Dies ermöglicht es, leicht zu bestimmen, ob der Wert des Symbols addiert oder subtrahiert werden muss. Zum Beispiel beginnt die Verarbeitung in XIV mit V = 5, dann I = 1 (weniger als V, daher subtrahieren: 5 - 1 = 4), dann X = 10 (mehr als I, daher addieren: 10 + 4 = 14). Dieser Ansatz ermöglicht eine effiziente Implementierung der Umwandlung selbst in wenigen Codezeilen.

Test (rspec) zur Überprüfung der Methode

RSpec.describe '#solution' do
  it 'wandelt einfache römische Zahlen um' do
    expect(solution('I')).to eq(1)
    expect(solution('III')).to eq(3)
    expect(solution('VIII')).to eq(8)
  end

  it 'wandelt zusammengesetzte römische Zahlen um' 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 'wandelt große römische Zahlen um' 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

Methode solution

Eine der Möglichkeiten zur Lösung (mit Ruby können die gleichen Dinge auf viele Arten gemacht werden).
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

Funktionsweise des Algorithmus

Wir bewegen uns vom Ende des Strings und addieren die Werte der Symbole. Wenn die aktuelle Zahl kleiner als die vorherige ist — subtrahieren wir sie, andernfalls — addieren wir sie. Dies ermöglicht eine korrekte Verarbeitung von Fällen wie IV oder CM.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

[Codecov] Was ist der Unterschied zwischen Patch- und Projektabdeckung?
09. Apr, 16:03 Uhr

[Codecov] Was ist der Unterschied zwischen Patch- und Projektabdeckung?

meme code
meme code@memecode
Wie helfen Scratch-Kurse Kindern, Soft Skills zu entwickeln?
11. Apr, 18:24 Uhr

Wie helfen Scratch-Kurse Kindern, Soft Skills zu entwickeln?

meme code
meme code@memecode
24. Apr, 20:17 Uhr

Wir fixieren minikube "Sie versuchen, die amd64-Binärdatei auf einem M1-System auszuführen."

meme code
meme code@memecode
24. Apr, 20:55 Uhr

Wir fixieren minikube auf dem Mac mit M1 (wir verzichten auf qemu, starten auf docker)

meme code
meme code@memecode
Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.
25. Apr, 23:02 Uhr

Wo findet man eine ältere Version von Google Chrome und lädt sie herunter? Am Beispiel eines alten Macs.

meme code
meme code@memecode
09. Mai, 19:27 Uhr

[FIXED] kann solche Datei nicht laden -- html/pipeline (LoadError) tritt auf während rails generate thredded:install

meme code
meme code@memecode
Aufgabe zur Überprüfung der richtigen Platzierung von Klammern (Ruby)
21. Mai, 10:27 Uhr

Aufgabe zur Überprüfung der richtigen Platzierung von Klammern (Ruby)

meme code
meme code@memecode
Wie man das Teilarray mit der maximalen Summe (Maximum Subarray Sum) in Ruby findet
22. Mai, 11:01 Uhr

Wie man das Teilarray mit der maximalen Summe (Maximum Subarray Sum) in Ruby findet

meme code
meme code@memecode
Google-Werbung für Anfänger: Schritt-für-Schritt-Anleitung für einen erfolgreichen Start
28. Mai, 10:21 Uhr

Google-Werbung für Anfänger: Schritt-für-Schritt-Anleitung für einen erfolgreichen Start

meme code
meme code@memecode
Was ist jemalloc und wie hängt es mit Ruby / Ruby on Rails zusammen
30. Mai, 11:53 Uhr

Was ist jemalloc und wie hängt es mit Ruby / Ruby on Rails zusammen

meme code
meme code@memecode
05. Jun, 01:52 Uhr

[Fixed] nicht initialisierte Konstante ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Die Vorschau im Netzwerk-Tab ist nach dem Update von Chrome sehr klein geworden.
05. Jun, 18:23 Uhr

Die Vorschau im Netzwerk-Tab ist nach dem Update von Chrome sehr klein geworden.

meme code
meme code@memecode