Aus dem Kurs: Programmierrätsel: JavaScript

Römische Zahlen

In alten Kirchen oder alten Gebäuden sieht man es manchmal, da ist eingraviert, wann ein Gebäude fertiggestellt wurde und zwar mit römischen Zahlen, die Tausend ist ein M, für 100 nimmt man ein C und so weiter. Und ihre Aufgabe besteht nun darin, ein Konverter zu schreiben, eine kleine App zu entwickeln oder zumindest mal das Herzstück für eine App, der man eine römische Zahl gibt, eine Zeichenkette mit M, C, L, X und so weiter, und aus dieser Zeichenkette kommt dann eine für uns gebräuchliche arabische Zahl in im Zehner-System heraus. Hier sehen Sie die Zeichenketten, die die Funktion annimmt, und die Zahlen, die sie dabei ausgeben muss. Die Zwei sind zwei Is, 2020 ist MM zweimal tausend und dann zweimal 10. Aber achten Sie darauf, dass nicht mehr als vier Zeichen hintereinander kommen dürfen, also vier gleiche Zeichen, das heißt, die Vier wird dargestellt durch eine Fünf, und da ist vorne dran ein I, also 5-1=4. So wird jetzt eine Vier dargestellt. Ähnlich sehen Sie es hier bei 1976, die 900 wird durch eine 1000 dargestellt und da habe ich vorne dran das 100 Zeichen, also CM. Sie können jetzt pausieren, sich selber eine Lösung ausdenken, ansonsten geht es gleich hier weiter mit meiner Lösung. Ich habe jetzt ausnahmsweise den Funktionsnamen nicht auf Englisch gewählt, sondern auf Latein convertire, das bekommt allerdings hier eine number, also eine Zeichenkette und gibt dann eben die Zahl zurück. Der Trick, der mich zur Lösung gebracht hat war der, dass ich diese Zahlen 900, 400, 90 und so weiter, die durch zwei Ziffern dargestellt werden, also wo links die linke Ziffer oder das linke Zeichen vom rechten Zeichen abgezogen wird, dass ich die als eigenständige Zahlen kodiert habe. Ob beispielsweise ein M, ein C vorne dran hat und berechnet das, sondern ich sage naja, wenn ich hier ein CM habe, dann gilt das wie eine 900. Und hier habe ich einfach die Werte aufgeschrieben, also für 900, 400 und so weiter, bis runter zur 1, wichtig hier die Doppelzeichen, die kommen zuerst dran. Denn wenn ich mal M ersetzt habe, dann würde ich einen CM nicht mehr erkennen, also brauche ich zuerst die Doppelten, die ich teste. Und die gehe ich der Reihe nach durch mit let n in nums, hier habe ich ja dieses Array, und jetzt gehe ich in meine Zeichenkette Number und ersetze nun das Vorkommen von diesem N hier, durch ein Plus-Zeichen gefolgt von dem Wert, den dieses Zeichen hat, also 900 beispielsweise. Und das mache ich hier mit einem new RegExp, weil ich möchte an diesem regulären Ausdruck hinten noch ein Flag ansetzen, G für Global, dass alle Vorkommende gefunden worden sind, hier ersetzt werden, und die ersetze ich durch eben ein Plus-Zeichen, gefolgt von der Zahl. und das ist eine einfache Rechnung, die können wir uns mal anschauen. Console.log (number), und dann gehe ich mal auf die Konsole. Und dann sehen Sie hier, dass bei den Tests zum Beispiel hier sowas herauskommt, aus diesem XXII wird ein Plus 10, Plus 10, Plus 1, Plus 1, und diese Zeichenketten hier, die packe ich einfach in diese Funktion eval, das heißt diese Zeichenkette wird ausgeführt, wird ausgerechnet und zurückgegeben.

Inhalt