Ziel:
Schreiben Sie eine Funktion, die eine Zahl als Eingabe annimmt und eine kurze römische Zahl für diese Zahl als Ausgabe zurückgibt.
Römische Zahlensymbole:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Als Beispiel für das, was ich meine, wenn ich "römische Kurzzahlen" sage, wollen wir in Betracht ziehen, eine römische Zahl zu finden, die 1983 repräsentiert, weil dies das Jahr ist, in dem ich geboren wurde. Eine Möglichkeit ist, dies wie gewohnt zu tun (10 Buchstaben):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Die andere Möglichkeit besteht darin, es auf kurze Weise zu tun (6 Zeichen):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Weißt du was das heißt?!?!!?? Wenn ich Römer wäre, hätte ich jedes Mal, wenn ich mein Geburtsdatum schrieb, 4 Zeichen speichern können! Woot Woot !!
Bevor ich mich jedoch in Aufregung zurückmische, muss ich eine Frage schreiben, daher sollte ich wahrscheinlich die Regeln für römische Kurzzahlen definieren, damit wir uns alle auf einer Seite befinden:
Kurzschrift-Regeln für römische Ziffern:
- Berücksichtigen Sie Symbole immer von links nach rechts, bis keine Zeichen mehr zu berücksichtigen sind.
- Wenn sich rechts neben dem aktuellen Symbol keine höherwertigen Symbole befinden:
- Addieren Sie den Wert des aktuellen Symbols zur laufenden Summe dieser römischen Ziffer.
- Wenn sich rechts neben dem Symbol höherwertige Symbole befinden, überlegen Sie:
- Suchen Sie das Symbol mit dem höchsten Wert ganz rechts neben dem aktuellen Symbol
- Betrachten Sie alle Zeichen bis zu diesem Symbol als eine römische Ziffer
- Berechnen Sie den Wert dieser römischen Ziffer mit diesen Schritten
- Subtrahieren Sie den Wert dieser römischen Ziffer von der laufenden Summe dieser römischen Ziffer.
- Gehen Sie zum nächsten Symbol nach der gerade betrachteten Gruppe
- Jede römische Ziffer muss mindestens 1 Symbol enthalten.
- Das ist es! Alle folgenden Regeln werden akzeptiert!
Beispiele:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
Frageregeln:
Erstellen Sie eine Funktion, die eine einzelne Zahl als Eingabe annimmt und eine römische Zahl für diese Zahl als Ausgabe zurückgibt, indem Sie die obigen Regeln anwenden. Berechnen Sie den CodeGolfScore dieser Funktion.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Generieren Sie mit Ihrer Funktion aus Regel 1 die römischen Ziffern zwischen -1000 (das ist richtig, NEGATIV eintausend) und 3000. Addieren Sie dann die Zeichenlänge dieser römischen Ziffern, um Ihren totalCharacterCount zu erhalten . Hier ist ein Pseudocode zur Verdeutlichung:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Der niedrigste FinalScore gewinnt!
Hinweis: Da die Anzahl der totalCharacter-Zeichen im Bereich von Zehntausenden + liegt, sollte der Algorithmus für die Zeichenlänge oberste Priorität haben. Code-Golf-Scores sind nur der Auslöser für den Fall, dass mehrere Benutzer den optimalen Algorithmus oder die optimalen Algorithmen finden, die nahe beieinander liegen.
Viel Glück und viel Spaß bei Ihren MMXII-Feierlichkeiten morgen Abend !!!
""
für Null erlaubt oder müssen wir VVX
etwas Äquivalentes verwenden?
IXV = -(-1 + 10) + 5 = -4
(ganz rechts gewinnt) oder IXV = -1 + 10 + 5 = 14
(am höchsten bewertete Gewinne)?
DDDDM
für-1000
?