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 !!!
quelle
DDDDM
für-1000
?""
für Null erlaubt oder müssen wirVVX
etwas Äquivalentes verwenden?IXV = -(-1 + 10) + 5 = -4
(ganz rechts gewinnt) oderIXV = -1 + 10 + 5 = 14
(am höchsten bewertete Gewinne)?Antworten:
Haskell, 25637 (= 268 + 25369)
26045 (= 222 + 25823)verwendet werden als zb
Mit dem können Sie die Längensumme direkt auswerten
Das dauert in der Größenordnung von einer Minute.
quelle
C ++, 345 Codezeichen, 25021 römische Ziffern = 25366
ein bisschen deobfuscated, mit einem Fahrer:
V
berechnet den numerischen Wert eines gegebenen römische Ziffer Zeichenkettes
der LängeL
. Zeichenfolgen sind mit der Basis 7 codiert (erste Ziffer ist s% 7, zweite Ziffer ist s / 7% 7, ...). Jede Ziffer ist mit I = 0, V = 1, ..., M = 6 codiert.f
Führt eine Brute-Force-Aufzählung möglicher römischer Ziffernfolgen durch, um eine zu finden, dieV
ausgewertet wirdn
.Die Gesamtzahl der römischen Ziffern ist optimal. Die längste römische Ziffer, die für [-1000,3000] benötigt wird, ist 11 Ziffern (z. B. -827 = CMDDMLXXIII), was auf meinem Computer ungefähr 5 Minuten dauert.
quelle
LMCLXXIII
als Antwort auf-777
. Ich würde das so lesen, dass es-50+1000-100+50+10+10+3 = 923 ≠ -777
nur mit "ganz rechts höher bewertet" statt "am höchsten " gibt-777
. Aber genau darum haben Sie in den Kommentaren gebeten!VVVXI
an,-4
wannIXVX
es tatsächlich kürzer ist, wie ich gerade bemerkt habe) - aber das ist vollkommen legal.Ruby, 25987 (= 164 + 25823)
Sie können
r
direkt anrufen , um die Ergebnisse zu erhalten. Die Summe über dem angegebenen Bereich ergibtdas ist die optimale Summe wie bei den anderen Lösungen.
quelle
C # 23537 (639 Zeichen Code + 22898 Zeichen Ausgabe)
Berechnen:
Enumerable.Range(-1000, 3000).Sum(i => M.R(i).Length);
quelle