Umwandlung von römischen Zahlen in Ganzzahlen in Python

8

Dies ist jetzt mein aktueller Code nach dem, was user2486 gesagt hat.

%Vor%

Ich bekomme diesen Fehler mit während ns: UnboundLocalError: lokale Variable 'ns', auf die vor der Zuweisung verwiesen wird

    
Jake 11.10.2013, 00:00
quelle

13 Antworten

4

Betrachten Sie diesen zusätzlichen Pseudo-Code und Hinweise (einige davon sind gültig für Python, andere nicht, aber es gibt Notizen).

%Vor%
user2864740 11.10.2013, 00:18
quelle
12

Sie müssen das Rad nicht neu erfinden (es sei denn, Sie möchten es). Python kommt mit einem Konverter:

%Vor%

Wenn Sie es für Zahlen ab 5000 benötigen, müssen Sie eine neue Funktion schreiben und vielleicht Ihre eigene Schriftart erstellen, um die Zeilen über den römischen Ziffern darzustellen. (Es wird nur mit einigen Zahlen funktionieren. Stoppen bei 4999 ist eine wirklich gute Idee.)

Um in römische Ziffern zu konvertieren, verwenden Sie roman.toRoman(myInt) .

Jemand anders hat tatsächlich mit demselben Quellcode verlinkt, den das römische Modul in einem der obigen Kommentare verwendet, aber ich glaube nicht, dass sie erwähnt haben, dass es tatsächlich mit Python kommt.

EDIT: Beachten Sie, dass Sie auf einigen Systemen (Windows, glaube ich) nicht einfach import roman von der Standardinstallation eingeben können. Der Quellcode funktioniert jedoch immer noch unter Windows, und er ist mit dem Python 3.4.1-Quellcode-Download (wahrscheinlich auch früheren) an diesem Ort /Python-3.4.1/Doc/tools/roman.py

enthalten     
Shule 02.04.2014 05:34
quelle
3

Hier ist meine Lösung:

%Vor%     
Valentin Shergin 03.01.2015 17:17
quelle
1

Okay, es gibt viele Dinge, die mit dem, was Sie gerade haben, nicht stimmen.

Erstens, der Grund dafür, dass Sie eine Menge Nullen erhalten, ist, dass Sie Ihre while string != "": -Schleife nie verlassen und niemals ganze Zahlen zur Summe hinzufügen. So bleibt total gleich Null und wird weiterhin gedruckt. Ich habe den von Ihnen geposteten Code kommentiert, damit Sie verstehen, was vor sich geht.

%Vor%

user2864740 hat einige gute Kommentare in ihrer veröffentlichten Lösung, schaut darüber, um einige der Dinge zu sehen, die ihr falsch gemacht habt.

Hier ist Python (2.7 leider) Code, der tut, was Ihr gegebener Pseudocode sagt.

%Vor%

Bitte beachten Sie, dass der von Ihnen gepostete Pseudocode NICHT korrekt ist. Beachten Sie, was es für die Eingabe 'IIV' tun wird. Es wird 1 von 1 subtrahiert und dann 5 addiert. Aber was es tun sollte, ist 2 von 5 zu subtrahieren.

    
Peacemaker636 11.10.2013 00:22
quelle
1

Rechts-nach-links-Lösung, die etwas pythischer (keine Indizes) und relativ kurz ist.

Algorithmus:

  • Kehren Sie die römische Zahl um und ordnen Sie sie einer Liste von Zahlen zu
  • zu
  • Finde heraus, welche Zahlen subtrahiert werden sollen, und summiere dann die Liste

Beispiel:

'xiv' = & gt; sum(5, -1, 10) = & gt; 14

%Vor%

Ausgabe:

%Vor%

Hinweis: Es wäre schön, eine (kurze, inline) Methode zu finden, um die Zeichen der Sequenz im laufenden Betrieb zu ändern. Beispiel: (5, 1, 10) == & gt; (5, -1, 10) .

Update: Das ist so nah wie vor dem Aufgeben. Es ist identisch mit dem obigen Code, aber es verwendet itertools.tee() mit zip() , um Paare der vorherigen und aktuellen Werte zu generieren, um die Notwendigkeit für die Zustandsvariablen zu eliminieren. Der einzige Aufruf von next(cur) macht diese Liste kürzer als prev . Dies ist der gesamte Status, den wir benötigen, um herauszufinden, ob der aktuelle Wert hinzugefügt oder subtrahiert werden soll.

Beispiel:

%Vor%

Code:

%Vor%     
Harvey 28.03.2017 01:45
quelle
1

Römische Zahlen werden von links nach rechts gelesen, wenn Sie den Wert jedes Symbols addieren oder subtrahieren.

Wenn ein Wert niedriger als der folgende Wert ist, wird er subtrahiert. Sonst wird es hinzugefügt.

Zum Beispiel wollen wir die römische Zahl MCMLIV zu einer arabischen Zahl umwandeln:

%Vor%

Wir können jetzt die Zahl berechnen:

%Vor%

ref: Ссылка

%Vor%     
r366y 01.02.2018 07:43
quelle
0

Es gibt eine sehr detaillierte Beschreibung der Entwicklung der römischen Zahlenumrechner im Dive Into Python 3 von Mark Pilgrim . Weitere Informationen finden Sie in der 5.3. Fallstudie: Römische Ziffern , die das Problem und die Details einführt.

Aber das ist nicht alles. Siehe die Kapitel 9. Komponententests , wo die Analyse und Implementierung von Umrechnern mit römischen Zahlen fortgesetzt wird, einschließlich interessanter Optimierungen und Ausnahmen Werfen - die (unit) testgetriebene Entwicklung.

Es steht in direktem Zusammenhang mit dem Verweis des Enginefree auf den Code im ersten Kommentar unterhalb der Frage (der Code wurde von Mark Pilgrim geschrieben).

    
pepr 11.10.2013 07:59
quelle
0

Hier ist etwas, das ich mit Wörterbuch erfunden habe. Es sollte v.einfach sein. Sag mir was du denkst. Ich muss sagen, dass es nicht mit den römischen Zahlen funktioniert, die in Form von MIM geschrieben wurden (anstelle von MCMXCIX für 1999). Dies gilt nur für gültige römische Ziffern.

%Vor%     
Vicks 19.01.2015 17:16
quelle
0

Sie können diesen Code verwenden:

%Vor%
    
Vishav Vikram Kapoor 22.02.2016 11:07
quelle
0

Was ist mit diesem Code?

%Vor%     
runitfirst 05.01.2017 11:31
quelle
0

Arbeiten Sie von rechts nach links der römischen Zahl, um Werte hinzuzufügen oder zu subtrahieren. Einfach.

%Vor%     
Gatis Seja 23.03.2017 23:32
quelle
0
%Vor%     
Mohan Meruva 31.07.2017 10:41
quelle
-2

versuche das:

%Vor%

Das Lambda steht für eine einzeilige Funktion. Deshalb werden sie anonyme Funktionen genannt. Sie müssen sie nicht mit def und all dieser Formalität definieren.

Sie können so etwas in die Shell eingeben:

  
    
      

f = Lambda x: x + 3       f (3)           6           oder       f = Lambda x, y: x + y       f ("foo", "bar")           'Foobar'

    
  

Ich verwende map , um meine newborn-Funktion auf jedes Element eines iterablen Elements anzuwenden. In diesem Fall ist das iterable eine Zeichenfolge wie "mclvii". Dadurch habe ich eine Liste erstellt, in der jeder Wert seinen jeweiligen Wert darstellt. Sehen Sie sich ein Lambda-Beispiel an, um Quadrate zu berechnen:

%Vor%

Also, es ist Lambda, wenn Sie eine Funktion im laufenden Betrieb benötigen, und eine Zuordnung, wenn Sie eine Funktion auf alle Elemente in einer Liste anwenden möchten.

Nun ein Beispiel mit Rekursion:

%Vor%     
Lucas Ribeiro 11.10.2013 00:42
quelle

Tags und Links