Eingang:
Eine ganze Zahl.
Ausgabe:
- Konvertieren Sie zuerst die Ganzzahl in die entsprechende römische Zahl.
- Konvertieren Sie dann jeden Großbuchstaben dieser römischen Ziffer in ihren ASCII / UNICODE-Dezimalwert.
- Und die Summe davon ausgeben.
Beispiel:
1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input ^ output
Römische Ziffern: Hier ist ein vielleicht nützlicher Umrechner für römische Ziffern .
Herausforderungsregeln:
- Standardregeln für römische Zahlen werden angewendet, daher gibt es keine alternativen Formen wie
IIII
oderVIIII
anstelle vonIV
undIX
. * - Die Macron-Linien über den römischen Ziffern nach 1.000 sind
¯
(UNICODE Nr. 175). Eine Zeile zählt also als+175
und zwei als+350
. - Sie können einen beliebigen Eingabe- und Ausgabetyp verwenden, sofern dieser die ganzen Zahlen darstellt.
- Die Testfälle liegen im Bereich von
1 - 2,147,483,647
.
* Regeln für römische Ziffern (Zitat aus Wikipedia):
Zahlen werden durch Kombinieren von Symbolen und Addieren der Werte gebildet, also
II
zwei (zwei Einsen) undXIII
dreizehn (zehn und drei Einsen). Da jede Zahl einen festen Wert hat, anstatt ein Vielfaches von zehn, einhundert usw. zu repräsentieren, besteht keine Notwendigkeit, Nullen zu "platzieren", wie dies bei Zahlen wie 207 oder 1066 der Fall ist. Diese Zahlen sind geschrieben alsCCVII
(zweihundert, fünf und zwei Einsen) undMLXVI
(tausend, fünfzig, zehn, fünf und eins).Die Symbole werden von links nach rechts in der Reihenfolge ihres Werts angeordnet, beginnend mit dem größten. In einigen speziellen Fällen wird die subtraktive Notation jedoch häufig wie folgt verwendet , um zu vermeiden, dass vier Zeichen nacheinander wiederholt werden (z. B.
IIII
oderXXXX
):
I
steht vorV
oderX
gibt eins weniger an, also vier istIV
(eins weniger als fünf) und neun istIX
(eins weniger als zehn)X
platziert vorL
oderC
zeigt zehn weniger an, also sind vierzigXL
(zehn weniger als fünfzig) und neunzigXC
(zehn weniger als hundert)C
platziert vorD
oderM
zeigt hundert weniger an, also vierhundert istCD
(hundert weniger als fünfhundert) und neunhundert istCM
(hundert weniger als tausend)
Zum BeispielMCMIV
ist eintausendneunhundertvier, 1904 (M
ist eintausend,CM
ist neunhundert undIV
ist vier).Einige Beispiele für die moderne Verwendung römischer Ziffern sind:
1954 alsMCMLIV
; 1990 alsMCMXC
; 2014 alsMMXIV
QUELLE
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
100 -> 67
1 -> 73
4 -> 159
22 -> 322
5000 -> 261
2016 -> 401
1000000000 -> 427
1991 -> 449
9999 -> 800
1111111111 -> 2344
2147483647 -> 5362
quelle
9999
->M(X)CMXCIX
->77+263+67+77+88+67+73+88
->800
und2147483647
->((MMCXLV)MMCDLXXX)MMMDCXLVII
->427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73
->5362
. Also habe ich die zweite korrigiert, aber die9999
stimmte.2222222222
liegt nicht im angegebenen Bereich. Ich stimme auch zu5362
.Antworten:
Mathematica,
181173166151 BytesGolf gespielt
Ungolfed
Die
RomanNumeral
Implementierung von Mathematica liefert (IX) CMXCIX für 9999, und das Programm gibt 971 für diese Zahl zurück.Wie geschrieben gibt eine römische Ziffer vom Typ ((...)) (...) ... eine verschachtelte Liste der ASCII-Codes für die römischen Ziffern der Länge 4, ((...)) ... zurück. gibt eine Liste der Länge 3 zurück, (...) ... gibt eine Liste der Länge 2 zurück und ... gibt eine Liste der Länge 1 zurück. Die letzte Zeile konvertiert diese Regeln in die entsprechende Anzahl von Makros für jeden Abschnitt der list, fügt diese Makros hinzu und summiert dann die gesamte verschachtelte Liste, um die Ausgabe zurückzugeben.
quelle
Python 3,
281278273269 BytesMein erster Versuch mit Codegolf, los geht's. Versucht es zu tun, ohne auf die verknüpfte Frage zu schauen, also ist es wahrscheinlich schrecklich :)
8 Bytes kleiner dank Gábor Fekete
Ungolfed:
quelle
return 0 if n==0 else
mitreturn 0if n<1else
f
wenn der Name der Funktion lautetg
.n//9*10>=10*l
zun//9>=l
, um weitere Daten zu speichern.Ruby, 188 Bytes
Eine Anpassung, die auf meiner alten Ruby-Antwort für die Umrechnung von römischen Zahlen basiert . Probieren Sie es online!
quelle
Mathematica, 198 Bytes
Leider hilft das eingebaute hier nicht viel, obwohl ich mir sicher bin, dass dies weitaus mehr golfen kann.
Hinweis: Bewertet
9999 -> 971
wie hier .quelle
Batch, 373 Bytes
Arbeitet , indem jede Ziffer der Zahl entsprechend eine Nachschlagtabelle für die Werte übersetzen 1, 4, 5 und 9. Uses
M(V)
,M(X)
,(M(V))
und(M(X))
. Wenn Sie es vorziehen(IV)
,(IX)
,((IV))
und((IX))
dann verwendencall:l 77 509 261 511
undcall:l 252 859 436 861
jeweils.quelle
JavaScript (ES6), 183 Byte
Hinweis: nicht nur bevorzugt
(IV)
zuM(V)
, sondern auch bevorzugt(VI)
zu(V)M
; Tatsächlich wird M nur am Anfang der Zahl verwendet.quelle
Python, 263 Bytes
quelle
R, 115 Bytes
Also ... ich poste meine Lösung, weil ich die Frage ziemlich interessant finde. Ich habe mein Bestes mit R ‚Kapazitäten s ohne Pakete mit römischen Zahlen umgehen: Sie können nur Eingabe von Zahlen zwischen
1
und3899
, wie dieas.roman
‘ s - Dokumentation erklärt.Deshalb habe ich ein bisschen geschummelt, indem ich den Bereich dazwischen gegeben
1
habe11
14
in derfor
Schleife angegeben habe:Es ist die Länge der.as.roman(3899)
Ausgabe (MMMDCCCXCIX
)Tatsächlich ist laut dieser Website die längste römische Zahl
MMDCCCLXXXVIII
(14 Zeichen), was entspricht2888
.Außerdem können Sie
length
die Ausgabe dieser Funktion nicht berechnen .Wenn jemand eine Lösung für die oben genannten Probleme findet, kann er dies gerne kommentieren.
quelle
Python 3, 315 Bytes
Ungolfed-Version:
Erläuterung: Diese Version verwendet einen anderen Ansatz. Sie zählt römische Ziffern in der Zahl.
[abs(((n-4)%5)-1)]
ist die Anzahl derI
s in der römischen Zahl.[((n+10**g)//(10**g*5))%2for g in r(10)]
ist die Anzahl derV,L,D,(V),(L),(D),((V)),((L)),((D))
s in der Zahl.[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
ist die Nummer derX,C,M,(X),(C),(M),((X)),((C)),((M))
s in der Nummer.Dann multipliziert es die Vorkommen mit dem Wert des Zeichens und gibt dessen Summe zurück.
quelle