Bei einer streng positiven Ganzzahl geben Sie die kürzestmögliche römische Zahl nur mit der additiven Regel zurück. Die Ausgabe muss aus null oder mehr Zeichen MDCLXVI
in dieser Reihenfolge bestehen. Die Nummer 14
muss also XIIII
eher geben als XIV
.
Die numerischen Werte der Zeichen sind M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Beispiele
3
→ III
4
→ IIII
9
→ VIIII
42
→ XXXXII
796
→ DCCLXXXXVI
2017
→ MMXVII
16807
→ MMMMMMMMMMMMMMMMDCCCVII
4 -> IIII
ist9 -> VIIII
auch stattIX
?VIIII
ist die einzig erlaubte Ausgabe für 9.Antworten:
Plain English ,
10591025678641451399 Bytes34 Byte durch Entfernen einer Fehlerfalle eingespart. Dann werden 384 Bytes durch Golfen eingespart. Dann werden 190 Bytes gespart, indem die Divisionsoperation mit der Anfügungsoperation ("z") zu einer neuen Operation ("p") kombiniert wird. Dann wurden durch Golfen 52 Bytes gespart.
Hier ist die unbenutzte Version des endgültigen Codes sowie eine Fehlerfalle für eine negative Zahl:
quelle
APL (Dyalog) ,
2522 BytesProbieren Sie es online!
quelle
/
) anstelle von reshape (⍴
) verwenden, um die Verkettungsreduktion (¨
und,/
) auszuschneiden .⎕
) nehmen und commute (⍨
) verwenden, um die Parens zu entfernen und zu komponieren (∘
).{}
oder∇f∇
um die FunktionRetina ,
57-42BytesKonvertiert zu Unary und ersetzt gierig Bündel von
I
s durch die höheren Konfessionen in der angegebenen Reihenfolge.Probieren Sie es online aus
Dank Martin 15 Bytes gespart
quelle
I
als Einheit verwenden?Python 2 , 64 Bytes
Probieren Sie es online!
Anstatt die Ausgabezeichenfolge von Anfang an zu erstellen, indem der größte Teil gierig übernommen wird, wird sie vom Ende an erstellt. Zum Beispiel ist die Anzahl von
I
'sn%5
, dann ist die Anzahl vonV
' sn/5%2
und so weiter. Dies ist eine gemischte Basenumwandlung mit aufeinanderfolgenden Verhältnissen von 5 und 2 abwechselnd.Hier ist ein iteratives Äquivalent:
Python 2 , 68 Bytes
Probieren Sie es online!
Die
M
müssen separat behandelt werden, da eine beliebige Anzahl von ihnen vorhanden sein kann, da es keine größere Ziffer gibt. Nachdem die anderen Platzwerte zugewiesen wurden, wird der verbleibende Wert inM
's umgewandelt.Zum Vergleich eine gierige Strategie (69 Bytes):
Python 2 , 69 Bytes
Probieren Sie es online!
Der aktuelle Ziffernwert
d
wird durch 2 oder 5 geteilt, um die nächste Ziffer zu erhalten. Der Wert vond%3
sag uns welches: wennd%3==1
, dividiere durch2
; und wennd%3==2
, durch 5 teilen.quelle
Mathematica, 81 Bytes
Die explizite Verwendung der Werte und die Ableitung der entsprechenden Ziffern scheint ein Byte länger zu sein:
quelle
FromRomanNumeral@r
Excel,
236193161 Bytes43 Bytes gespart dank @ BradCZu diesem Zeitpunkt gehört die Antwort wirklich ganz @ BradC . Weitere 32 Bytes gespeichert.
Formatiert:
quelle
CONCATENATE
mit&
zwischen den einzelnen Elementen, undQUOTIENT
mitINT(A/B)
.REPT
bereits abgeschnitten wird, wenn es sich nicht um eine Ganzzahl handelt. Sie können also 30 weitere Bytes einsparen, indem Sie jede einzelne entfernenINT()
. Save 2 mehr durch beide ersetzen1000
mit1E3
(obwohl Excel scheint nicht zu wollen , dass die Art und Weise zu halten , wenn Sie die Eingabetaste drücken).1E3
Verhalten gesehen. Antwort aktualisiert.Perl 5 , 66 Bytes
65 Byte Code +
-p
Flag.Probieren Sie es online!
MDCLXVI=~/./g
Kann ohne Änderung der Byteanzahl durch ersetzt werdenM,D,C,L,X,V,I
. und--$|?2:5
von$|--*3+2
.Viel länger ( 99 Bytes ) gibt es:
quelle
CJam ,
3528 Bytes-7 Bytes dank Martin Ender
Probieren Sie es online!
Erläuterung
quelle
C #, 127 Bytes
Eine rein hartcodierte ternäre Anweisung mit Rekursion.
Voll / Formatierte Version:
quelle
n>0
ist einfachn
.int
kann nicht implizit in a umgewandelt werdenbool
.05AB1E ,
292625 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
817569 Bytes6 Bytes gespart dank @Neil für die Portierung der Antwort von @ Jörg Hülsermann
6 Bytes gespart dank @Shaggy
Testfälle:
Code-Snippet anzeigen
quelle
n%=x
innerhalb derrepeat
Methode zu verschieben, um einige Bytes zu sparen.n=>'MDCLXVI'.replace(/./g,(c,i)=>c.repeat(n/a,n%=a,a/=i%2?5:2),a=1e3)
/// , 50 bytes
Probieren Sie es online!
Nimmt die Eingabe in unary auf, und ich verwende (ab) das Fußzeilenfeld von TIO für die Eingabe, sodass der Ausgabe eine neue Zeile vorangestellt wird.
quelle
Python 3 ,
100 97 96 94 93 9190 Bytesdef
; Array als Standardparameter reduzierte einen Einrückungsraum; unerwünschte Variablendeklaration entfernta%=
Kurzschrift gespeichert(a//i)
entfernt[]
auf Kosten eines Einrückungsraums entfernt wurde, wodurch 1 Byte gespart wird.Probieren Sie es online!
quelle
a%=i
ist ein Byte kürzer :)b
als Variable in der Funktion speichern . Das beseitigt die Notwendigkeit von Klammern -b=1000,500,100,50,10,5,1
Cubix , 69
7480BytesProbieren Sie es online!
Beobachten Sie es laufen
Ich habe es geschafft, es ein bisschen mehr zu komprimieren, aber es gibt immer noch einige nervige No-Ops, besonders auf der Oberseite.
52"IVXLCDM"U
Legen Sie die erforderlichen Teiler und Zeichen auf den Stapel. Die 5 und 2 werden verwendet, um den div / mod-Wert zu verringern, und die Zeichen werden nach der Verwendung verworfen.UIN0/&0\&,/U
Wendet euch auf die Oberseite und startet eine lange Tour, um die Eingabe zu erhalten und 1000 auf den Stapel zu schieben. Eine erste Teilung wird durchgeführt und eine Kehrtwender
zum nächsten Snippet durchgeführt. In diesem Bereich wollte ich Einsparungen erzielen.,r%ws;rr
Beginn der Divmod-Schleife. Ganzzahl-Teilung, drehen Sie den Mod "Ergebnis weg" und ordnen Sie den oberen Bereich des Stapels neu an, um die Eingabe, den aktuellen Teiler und das Divisionsergebnis zu reduzieren.3tus
Bringe das aktuelle Zeichen nach oben und tausche es mit dem Divisionsergebnis aus.!vsoUs(0;U
Dies ist die Druckschleife. Wenn das Div-Ergebnis größer als 0 ist, tauschen Sie es mit der Zeichenausgabe aus, tauschen Sie es zurück, dekrementieren Sie es, drücken Sie eine 0 und lassen Sie sie fallen. Bei 0 umleiten über den Pop-Stack (Ergebnis der Teilung entfernen) und um den Würfel.\u;pwpsq,!@Urq;u
Mit ein wenig Umleitung wird der Charakter vom Stapel entfernt, die 5 und 2 werden nach oben verschoben, vertauscht und einer wird nach unten gedrückt. Der Rest wird verwendet, um den Teiler zu reduzieren. Halten Sie an, wenn es auf 0 reduziert wird, andernfalls drücken Sie die 5 oder 2 nach unten und betreten Sie die Schleife erneut.quelle
Mathematica, 130 Bytes
quelle
Python 2 ,
10990 BytesProbieren Sie es online!
quelle
1000
kann sein1e3
(wenn es Ihnen nichts ausmacht, ein Schwimmer zu sein, der kein Problem sein sollte)float
, und Sie können einen String nicht mit einem Float multiplizieren: cPHP , 70 Bytes
Probieren Sie es online!
quelle
T-SQL, 164 Bytes
Zeilenumbrüche wurden nur zur besseren Lesbarkeit hinzugefügt.
Diese Version ist viel länger (230 Zeichen), fühlt sich aber viel "SQL-ähnlicher" an:
Erstellt eine Tabelle m mit allen Zeichenwertzuordnungen und durchläuft dann die Suche nach dem größten Wert <= der Zahl, wobei das übereinstimmende Zeichen verkettet wird.
quelle
Japt , 34 Bytes
Online testen!
quelle
JavaScript (ES6), 65 Byte
Eine rekursive Funktion.
Wie?
Der zweite rekursive Aufruf
f(n-a)
sollte wirklich seinf(n-a,a)
. Durch den zweiten Parameter weggelassen,a
undi
neu initialisiert (bis 1000 bzw. 0) jedes Mal , wenn eine neue römische Ziffer wird auf das Endergebnis angehängt. Dies führt zu mehr Rekursion als erforderlich, ändert jedoch nicht das Ergebnis der Funktion und spart 2 Bytes.Testfälle
Code-Snippet anzeigen
quelle
J ,
26-23Bytes3 Bytes gespart dank Adám.
Probieren Sie es online!
Ähnlich wie bei der APL antworte imGrunde das Gleiche.quelle
#.inv
statt#:
?#.inv
anstelle von#:
, da so etwas2 #: 4
ist0
, während2 #.inv 4
ist1 0 0
#
ist/
;~
ist⍨
;$
ist⍴
;&
ist∘
;#:
ist⊤
. Der einzige Unterschied ist, dass Sie unendlich verwenden,_
während Sie0
wie die APL-Antwort verwenden könnten .Batch, 164 Bytes
Übernimmt die Eingabe für STDIN.
quelle
Oracle SQL, 456 Byte
Ausgänge:
Bitte beachten Sie, dass die tatsächliche Größe der Zeile 460 Byte beträgt, da sie die Eingabenummer (2849) enthält.
Ungolfed:
Wie es funktioniert: Ich berechne, wie viele von jedem Buchstaben ich brauche, indem ich mit dem höheren Wert eins (unendlich für M) das Maximum errechne und dann eine ganzzahlige Division zwischen dem Wert des aktuellen Buchstabens und dem Ergebnis desselben durchführe.
ZB 2348, wie viele
C
s brauche ich?trunc((2348-mod(2348,500))/100)
= 3.Dann habe ich
listagg
diesen Brief 3 mal zusammen (ausnutzenCONNECT BY
, um die 3 Zeilen zu generieren, die ich brauche). Zum Schluss hab ichlistagg
alles zusammen.Ein bisschen sperrig, aber das meiste ist das
select from dual
s in der Umrechnungstabelle und ich kann nicht wirklich viel dagegen tun ...quelle
Java (OpenJDK 8) ,
119 bis118 ByteProbieren Sie es online!
Dank @TheLethalCoder ein Byte gespeichert
quelle
v
undi
in der ersten for-Schleife ein Byte speichern?Charcoal ,
61 5046 BytesProbieren Sie es online!
Erläuterung:
quelle
Nν
ist ein Byte kürzer alsANν
,¬‹
ist ein Byte kürzer als das Subtrahieren von 1, und wenn Sie÷
(IntDivide) anstelle von∕
(Divide) verwenden, können Sie diesφ
als äußere Schleifenbedingung verwenden. Ich denke jedoch, dass Sie es auf 40 Bytes reduzieren können, indem SieMDCLXVI
stattdessen direkt eine Schleife ausführen.C ++, 272 Bytes
quelle
C 183 Bytes
Gleicher Algorithmus wie zuvor, nur mit einfachen c-Arrays anstelle einer std :: map, teilweise inspiriert von der Antwort von @ xnor, und unter Verwendung einer Zeichenfolge zum Speichern der Buchstaben.
quelle
Common Lisp, 113 Bytes
Dies ist eine anonyme Funktion, die das Ergebnis als Zeichenfolge zurückgibt.
Ungolfed, mit beschreibenden Variablennamen und Kommentaren:
In CL ist ein Formatierer für römische Zahlen integriert. Leider funktioniert es nicht für Zahlen größer als 3999.
quelle
Kohle , 34 Bytes
Ursprünglich basiert auf @ CarlosAlegos Antwort. Ein Port von @ xnors Python-Lösung ist ebenfalls 34 Byte groß:
Edit: Ein Port von @ xnors anderer Python-Lösung hat 33 Bytes!
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Beachten Sie, dass ich
⁺׳﹪φ³±¹
anstelle von verwendet habe,⁻׳﹪φ³¦¹
weil der Deverbosifier derzeit das Trennzeichen nicht einfügen kann.quelle