Hintergrund
Diese Herausforderung wurde von dieser Website inspiriert , auf der das folgende Diagramm veröffentlicht wurde:
Dieses Diagramm zeigt uns, dass der längste römische Ziffernausdruck unter 250 der von 188 ist, für dessen Angabe 9 Ziffern erforderlich sind.
Herausforderung
Die Standardsymbole verwendet meisten römischen Ziffern auszudrücken sind: { I
, V
, X
, L
, C
, D
, M
}, wobei die numerischen Werte Zeichen M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5 I
= 1 ist .
In dieser Herausforderung besteht Ihr Ziel darin, bei einer positiven Ganzzahl n die Anzahl der gültigen Darstellungen römischer Zahlen zu berechnen, die durch Verketten von n der Standardsymbole erstellt werden können.
Dann muss Ihr Programm das Ergebnis dieser Berechnung ausgeben!
Eingabe : Eine positive ganze Zahl n .
Ausgabe : Die Anzahl der gültigen römischen Zahlen mit der Länge n .
Regeln für römische Zahlen
Römische Ziffern hatten ursprünglich nur "additive" Paarungen, was bedeutet, dass Ziffern immer in absteigender Reihenfolge geschrieben wurden und die Summe der Werte aller Ziffern der Wert der Zahl war.
Später wurde die subtraktive Paarung zur Verkürzung der Ausdrücke der römischen Zahl üblich, indem eine kleinere Zahl vor eine größere gestellt wurde, um die kleinere von der größeren zu subtrahieren. Subtraktiven Paare können nicht angekettet, wie in dem folgenden ungültigen Ausdruck werden: IXL
.
Das Folgende sind die modernen Regeln für die additive und subtraktive Paarung.
- In einem subtraktiven Paar kann nur ein I, X und C als führende Ziffer verwendet werden.
- Ich kann nur in einem subtraktiven Paar vor V oder X gesetzt werden.
- X kann nur in einem subtraktiven Paar vor L oder C gesetzt werden.
- C kann nur in einem subtraktiven Paar vor D oder M gesetzt werden.
- Mit Ausnahme von subtraktiven Paaren müssen die Ziffern in absteigender Reihenfolge angegeben werden (dh, wenn Sie die führende Ziffer jedes subtraktiven Paars ablegen, werden die Ziffern in absteigender Reihenfolge angegeben).
- M, C und X können von kleineren Nennwerten nicht erreicht oder überschritten werden.
- D, L und V dürfen jeweils nur einmal vorkommen.
- Nur M kann 4 oder mehrmals wiederholt werden.
Weitere Hinweise
Wir werden die Balkennotation nicht verwenden. Stattdessen werden wir einfach weitere Ms hinzufügen , um eine beliebige Zahl auszudrücken.
Dies sind die einzigen Regeln, die wir für unsere römischen Ziffern befolgen werden. Dies bedeutet, dass auch ungerade Ausdrücke wie
IVI
in unserem System als gültig angesehen werden.Denken Sie auch daran, dass wir nicht die Anzahl der Zahlen mit Ausdrücken der Länge n zählen , da einige Zahlen mehrere Ausdrücke haben. Stattdessen zählen wir nur die Anzahl der gültigen Ausdrücke.
Testfälle
1
→ 7
2
→ 31
3
→ 105
Ich habe die obigen Angaben von Hand überprüft. Überprüfen Sie daher die Testfälle sorgfältig und fügen Sie weitere hinzu, wenn Sie können.
Gewinnkriterien
Dies ist eine Code-Golf- Herausforderung, also viel Spaß! Ich akzeptiere nur Lösungen, die mindestens Eingaben von 1 bis 9 verarbeiten können. Mehr ist Bonus!
Bearbeiten
Wie von Kommentatoren gefordert, finden Sie unten oder in diesem Pastebin-Link die 105 Combos, die ich für n = 3 gezählt habe
III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XLX XCI XCV XCX XCL XCC LII LIV LIX LVI LXI LXV LXX CII CIV CIX CVI CXI CXV CXX CXL CXC CLI CLX CCI CCV CCX CDC CMI CMV CMX CML CMC CMD CMM DII DIV DIX DVI DXI DXV DXX DXL DXC DLI DLV DLX DCI DCX DCL DCC MII MIV MIX MVI MXI MXV MXX MXC MLI MLV MLX MCI MCV MCX MCL MCC MCD MCM MDM MDM MDM MMX MML MMC MMD MMM
Bearbeiten 2:
Verwenden Sie den folgenden Code , der nicht für Golfspieler bestimmt ist , mit freundlicher Genehmigung von Jonathan Allan, um Ihre Ergebnisse zu überprüfen.
Edit 3:
Ich entschuldige mich für alle Fehler bei dieser Herausforderung. Ich werde sicher gehen, dass ich das nächste Mal einen besseren Job mache!
quelle
Antworten:
Netzhaut , 111 Bytes
Probieren Sie es online! Dies ist eine komplette Neufassung als ich 1. Regel falsch verstanden bedeuten , dass Sie nur ein jeder der subtraktiven nutzen könnten
I
,X
undC
. Erläuterung: Der erste Teil des Skripts erweitert die Eingabe in eine Folge vonCM
Paaren, gefolgt von den anderen möglichen subtraktiven Paaren. Jedes Paar ist optional, und das erste Zeichen jedes Paares ist auch innerhalb des Paares optional. In der dritten Stufe wird die Liste der Paare zu einer Liste von Retina-Befehlen erweitert, die die Eingabe übernehmen und drei Kopien mit der Option des zweiten oder beider Zeichen aus dem Paar erstellen. Anschließend werden die Ergebnisse gekürzt und dedupliziert. In der letzten Phase wird dann Code angehängt, um die endgültigen Aufgaben auszuführen: Erweitern Sie zuerst die Eingabe, um möglicherweise ein Finale hinzuzufügenI
, um dann die Ergebnisse mit der falschen Länge herauszufiltern, die Ergebnisse zu deduplizieren und schließlich die Ergebnisse zu zählen. Das resultierende Retina-Skript wird dann ausgewertet.Hinweis: Theoretisch könnten ab dem Ende der 4. Zeile 15 Byte gespeichert werden, aber dies macht das Skript zu langsam, um es auf TIO auch für zu demonstrieren
n=1
.quelle
Python 2 ,
177 168162 BytesProbieren Sie es online!
Ich bin ziemlich neu, hilf mir Golf zu spielen! Damit nach tatsächlichen römischen Ziffern gesucht wird, muss der reguläre Ausdruck angepasst werden, um die ungeraden Fälle zu berücksichtigen, wie z
IVI
-9 Bytes dank @Dead Possum!
-6 Bytes dank @ovs
quelle
^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
93
Statt105
JavaScript (ES7), 133 Byte
Bearbeiten : Korrigiert, um den Ergebnissen zu entsprechen, die von Jonathan Allans Code zurückgegeben wurden , der vom OP als Referenzimplementierung angegeben wurde.
Probieren Sie es online!
Wie?
Ab sofort wird jede Ziffer als römisches Zahlensymbol interpretiert:
2) Wir ersetzen alle gültigen subtraktiven Paare des Formulars
AB
durchB
:Beispiele:
XLIXIV
wirdLXV
XIIV
wirdXIV
,I
wenn Sie ein verlassen , schlägt der nächste Test fehlIC
bleibt unverändert, wodurch auch ein ungültigerI
an Ort und Stelle bleibt3) Wir überprüfen, ob die verbleibenden Symbole in der richtigen Reihenfolge sind und nicht öfter erscheinen, als es ihnen gestattet ist:
quelle
C
150123 BytesIch habe die Beschreibung nicht genau genug gelesen, daher ergibt sich die Anzahl der römischen Standardzahlen (wobei Ausdrücke wie
IVI
nicht gezählt werden). Da ich einige Anstrengungen unternommen habe, dachte ich, ich würde sowieso teilen.Original (150 Bytes):
quelle
F(X)
und entfernenfor(X=10;X--;)