Herausforderung
Wenn Sie eine Eingabezeichenfolge angeben, geben Sie einen Wahrheitswert zurück, wenn diese eine korrekte römische Zahl zwischen 1 (= I
) und 3999 (= MMMCMXCIX
) darstellt, andernfalls einen falschen Wert.
Einzelheiten
- Die Eingabe ist eine nicht leere Zeichenfolge, die nur die Zeichen enthält
IVXLCDM
. - Die römischen Ziffern (die wir hier in dieser Herausforderung verwenden) sind wie folgt definiert:
Wir verwenden nur folgende Symbole:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Um zu definieren, welche Zeichenfolgen tatsächlich gültige römische Ziffern sind, ist es wahrscheinlich am einfachsten, die Konversationsregel anzugeben: Um eine Dezimalzahl a3 a2 a1 a0
(wobei jede ai
eine Ziffer darstellt. Zum Beispiel um darzustellen, was 792
wir haben a3=0, a2=7, a1=9, a0=2
) als römische Ziffer zu schreiben , zerlegen wir sie in die Macht der Zehner. Die verschiedenen Zehnerpotenzen können wie folgt geschrieben werden:
1-9: I, II, III, IV, V, VI, VII, VIII, IX
10-90: X, XX, XXX, XL, L, LX, LXX, LXXX, XC
100-900: C, CC, CCC, CD, D, DC, DCC, DCCC, CM
1000-3000: M, MM, MMM
Beginnend auf der linken Seite mit der höchstwertigen Ziffer der können wir die Zahl, die jede Ziffer darstellt, separat konvertieren und verketten. Für das obige Beispiel würde dies also so aussehen:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Daher 792
lautet die römische Ziffer für DCCXCII
. Hier finden Sie eine vollständige Liste aller römischen Ziffern, die für diese Herausforderung relevant sind: OEIS a006968.txt
Beispiele
Wahrheit
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
quelle
MMMM
ungültig? Gibt es einen Buchstaben für 5000, der stattdessen für M <letter> verwendet werden sollte?I,V,X,L,C,D,M
.Antworten:
Ausführlich , 1362 Bytes
Ausgaben
I
für gültige römische Ziffern im BereichI-MMMCMXCIX
undNULLA
(0) oder Benutzereingaben sind ansonsten keine gültigen römischen Ziffern.quelle
C # (Visual C # Interactive Compiler) ,
79109 ByteDies scheint eine Regex-Herausforderung zu sein, ich bin sicher, dass eine kürzere Lösung gefunden werden kann ...
Probieren Sie es online!
quelle
{0,3}
zu{,3}
?{5,}
Arbeit, aber nicht{,5}
./u:System.Text.RegularExpressions.Regex
geändert werden sollte :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Gleiche Länge, aber seltsamer (was ist das Ziel, oder?)Wolfram Language (Mathematica) , 35 Byte
Probieren Sie es online!
5 Bytes gespart, dank @attinat
die
[1,3999]
begrenzung kostet leider 7 bytes ...hier ist der code für jede römische nummer
Wolfram Language (Mathematica) , 28 Byte
Probieren Sie es online!
der obige code funktioniert für jede nummer, nicht nur für [1,3999]
quelle
IVXLCDM
."Boole
ist auch kürzer (um ein Byte) alsIf
auf diese Weise zu verwenden.CP-1610- Baugruppe ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 ByteLassen Sie uns dies auf einem System versuchen, das Perl um gute 7 Jahre voraus ist. :-)
Nimmt einen Zeiger auf eine nullterminierte Zeichenfolge in R4 . Setzt das Null- Flag, wenn die Eingabe eine gültige römische Zahl ist, oder löscht es anderweitig.
Wie?
Der reguläre Ausdruck kann in 4 Gruppen mit derselben Struktur umgeschrieben werden, vorausgesetzt, es
#
handelt sich um ein ungültiges Zeichen, das garantiert nicht in der Eingabezeichenfolge enthalten ist.Das erste Suffix der GruppeN ist die Hauptziffer der Gruppe N- 1 . Daher können wir die Muster mit dem Paar ( main_digit , second_suffix )
Unsere Routine versucht, die eingegebene Zeichenfolge zeichenweise nach diesen Mustern zu analysieren und prüft schließlich, ob das Ende der Zeichenfolge erreicht ist.
Ausgabe
Screenshot von jzIntv
1. Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Diese Routine ist 47 DECLE lang und beginnt bei 4876 US-Dollar und endet bei 48A4 US-Dollar (im Lieferumfang enthalten).
quelle
Java 8, 70 Bytes
Hafen von @ Innat3 's C # Antwort , also stelle sicher, dass du ihn positiv bewertest!
Probieren Sie es online aus.
Erläuterung:
quelle
R ,
747156 BytesVielen Dank an @RobinRyder, @Giuseppe und @MickyT für ihre Vorschläge, wie Grep effektiv mit den in R integrierten Funktionen verwendet werden kann
as.roman
.Probieren Sie es online!
quelle
as.roman
wird sowieso nicht funktionieren, da es nur3899
aus irgendeinem Grund funktioniert .as.roman
: Zuerst die Initiale entfernen,M
wenn es eine gibt, dann prüfen, ob das Ergebnis in istas.roman(1:2999)
. Dies erfordert eine spezielle Behandlung für den Fall, dass die Eingabe erfolgtM
.romans
das eine nützliche Sache für R ist ??? Es wurde in 2.5.0 (April 2007) hinzugefügt ...Wolfram Language (Mathematica) , 32 Byte
Probieren Sie es online!
quelle
Jelly ,
48 47 4644 Bytes-1 danke an Nick Kennedy
Ein monadischer Link, der eine nicht leere Liste von Zeichen akzeptiert, die nur aus1 und 3999 ) oder
IVXLCDM
diesen bestehen, ergibt entweder1
(wenn es sich um eine gültige römische Zahl zwischen 1 und 2 handelt)0
(falls nicht).Probieren Sie es online!Oder sehen Sie die Testsuite an .
Wie?
quelle
Perl 5 (
-p
), 57 BytesTIO
{0,3}
Quantifizierer von geändert wurde*
&!/(.)\1{3}/
um sicherzustellen, dass das gleiche Zeichen nicht viermal hintereinander vorkommen kann.-/(.)\1{3}/
da geben würde ,-1
fürIIIIVI
zum Beispielquelle
Python 2 , 81 Bytes
Probieren Sie es online!
Schauen wir uns den letzten Teil des regulären Ausdrucks an, der mit den römischen Ziffern bis 9 übereinstimmt (einschließlich der leeren Zeichenfolge).
Dies hat zwei Alternativen, die durch Folgendes getrennt sind
|
:V?I{,3}
: OptionalV
gefolgt von bis zu 3I
. Das paßt die leere ZeichenketteI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: EinI
gefolgt von einemV
oderX
. Das passtIV
undIX
.Die gleichen Dinge mit
X,L,C
den Zehnerpaaren, mitC,D,M
Anpassen der Hunderter und schließlich für das^M{,3}
Zulassen von bis zu dreiM
Tausendern am Anfang.Ich habe versucht, die Vorlage für jedes Zeichentrio zu generieren, anstatt sie dreimal zu schreiben, aber das war viel länger.
quelle
^
Anker ist am Anfang nicht erforderlich .match
impliziert bereits, dass es am Anfang der Zeichenfolge übereinstimmt.^
.f=
Code keine anonymen Funktionen enthält. Es ist nur für TIO.lambda
s sind legal, daher sollten auch nicht zugewiesene gebundene Methoden für kompilierten regulären Ausdruck gut sein.Retina ,
5651 BytesPort of @NahuelFouilleuls Perl 5-Antwort , also stelle sicher, dass du ihn positiv bewertest!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
05AB1E ,
6198 BytesAufregend-52 Bytes danke an @Adnan , weil anscheinend die Roman Number von 05AB1E nicht dokumentiert wurde, haha .. xD
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) An, um zu verstehen, warum dies so
ŽF¯
ist3999
.Ursprüngliche 61-Byte-Antwort:
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Siehe meinen Tipp zu 05AB1E (Abschnitte Wie komprimiere ich Zeichenfolgen, die nicht Teil des Wörterbuchs sind ? , Wie komprimiere ich große Ganzzahlen? Und Wie komprimiere ich Ganzzahllisten?). ), um zu verstehen, warum:
•1∞Γ'иÛnuÞ\₂…•
ist397940501547566186191992778
Ž8в
ist2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
ist[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
ist"xivcxlmcd"
quelle
.X
nicht dokumentiert ist, aber ich denke, das sollte funktionieren:3999L.XQO
3999
. :)Perl -MRegexp :: Common -pe, 34 Bytes
Der
&!/(.)\1{3}/
Teil ist notwendig, daRegexp::Common
vier (aber nicht fünf) der gleichen Zeichen in einer Reihe erlaubt sind. Auf diese Weise passt es zu römischen Zahlen, die auf Ziffernblättern verwendet werden, woIIII
oft 4 verwendet werden.quelle
Python 3 ,
116113109107105106 BytesProbieren Sie es online!
-1 Byte dank ShadowRanger
quelle
^
ist der Zeilenabstand unnötig, da ermatch
nur am Anfang einer Zeichenkette steht.$
notwendig (fullmatch
impliziert nur Anker an beiden Enden, und das würde offensichtlich mehr als a kosten$
).Ruby , (
-n
) 56 BytesProbieren Sie es online!
Gibt 0 (wahr) oder null (falsch) aus.
quelle