Ihre Aufgabe ist es, eine bestimmte positive ganze Zahl von einer arabischen in eine römische Zahl umzuwandeln .
Schwierig wird es, wenn man bis 4000 zählt.
Die Römer taten dies, indem sie eine Linie über einem Symbol einfügten, um dieses Symbol mit zu multiplizieren 1 000
. Überstriche können in ASCII jedoch nicht genau angezeigt werden. Außerdem gibt es doppelte Überstriche, mit denen ein Symbol multipliziert werden kann 1 000 000
, und dreifache Überstriche, mit denen ein Symbol multipliziert werden kann 1 000 000 000
, usw.
Aus diesem Grund habe ich mich entschieden, Klammern zu verwenden, um Überstriche zu ersetzen.
Die Symbole können einzeln in Klammern gesetzt werden. Beispielsweise sind beide (VI)
und (V)(I)
gültige Darstellungen von 6 000
. (V)M
ist auch eine gültige Darstellung von 6000.
(I)
ist eine gültige Darstellungsweise 1 000
.
Testfälle
Input: 1
Output: I
Input: 2
Output: II
Input: 3
Output: III
Input: 4
Output: IV
Input: 15
Output: XV
Input: 40
Output: XL
Input: 60
Output: LX
Input: 67
Output: LXVII
Input: 400
Output: CD
Input: 666
Output: DCLXVI
Input: 3000
Output: MMM
Input: 3999
Output: MMMCMXCIX
Input: 4000
Output: M(V)
Input: 4999
Output: M(V)CMXCIX
Input: 6000
Output: (VI)
Input: 6000000
Output: ((VI))
Input: 6006000
Output: ((VI)VI)
Input: 6666666666
Output: (((VI)DCLXVI)DCLXVI)DCLXVI
Wertung
Das ist Code-Golf . Kürzester Code in Bytes gewinnen.
quelle
(IV)
eine akzeptable Darstellung von 4000?Antworten:
Mathematica, 67 Bytes
Vermeidet alle Probleme,
M
indem die Eingabe in Basis 1000 konvertiert und jede Ziffer einzeln mit konvertiert wirdRomanNumeral
. Dann falten wir sie zusammen, indem wir sie von(...)
links einfügen .Leider stellt Mathematica Nullen dar, so
N
dass wir diese loswerden müssen.quelle
RomanNumeral
geht das?MMMM
für aus4000
, es fängt nur an zu spezifizieren5000
(und dann bekommst du das gleiche Problem für4000000
usw.). Auch dann werden Überstriche anstelle von Klammern verwendet. Wenn Sie damit einverstanden sind, sollten Sie dies in der Herausforderungsspezifikation angeben.JavaScript (ES6), 136 Byte
Bei Zahlen unter 4000 wird jeder römische "Buchstabe" so oft wie möglich anhand der Liste der römischen "Buchstaben" und ihrer Dezimalwerte wiederholt. Ansonsten baut rekursiv die Antwort aus Division und Modulo mit 1000 auf. Zum Glück
repeat
abgeschnitten, sodass ich es nicht selbst tun muss.quelle
Common Lisp, 108
Ungolfed
Tests
Zwei Tests ergeben andere Ergebnisse als die aus der Frage:
quelle
R 134
Es ist so gut wie nicht die beste Option, aber ich denke, die Idee sollte dieser ziemlich ähnlich sein.
quelle
Python, 188,
194-6 Bytes vor dem Entfernen von Leerzeichen
Diese Herausforderung brachte mich zu dem Zeitpunkt zurück, als ich das Programmieren lernte ...
Es ist vielleicht nicht die kürzeste Lösung, aber ich hatte Spaß daran, dieses Problem zu lösen.
Versuch es!
quelle
Ruby,
137134130 BytesRekursive Funktion, die die Zeichenfolge zurückgibt. Ich versuche, die Ziffernkodierungen, wenn möglich, ein bisschen genauer abzuspielen, bin mir aber nicht sicher, wie.
Hoppla, es ist praktisch ein direkter Port von Neils ES6-Antwort.
quelle
Ruby,
185 161144 BytesÜber ein Jahr nach dem ursprünglichen Post habe ich etwas über Golf gelernt.
Vielen Dank an Value Ink für Ihre wertvollen Kommentare.
quelle
gsub
kann einen String als erstes Argument nehmen, wodurch das Ersetzen eines Regex-Musterss.gsub! x,y
entfällt , da dies automatisch erfolgt. Ansonsten können Sie wahrscheinlich einfach auf die Zuweisung Ihresa
Arrays verzichten, da Sie es nur einmal verwenden, und es direkt in deneach_slice
Anruf einfügen."IVXXLCCDM".scan(/(.)(.)(.)/){|x,b,c|...
funktioniert auchr[x]
ist funktional äquivalent zur.(x)
wann immer Stabby Lambdas beteiligt sindr[x]
Trick wird für alle meine futer rekursiven Golf in Ruby nützlich sein!TCL 134 Bytes
Versuchen Sie es hier: https://rextester.com/BJC92885
quelle