Erstellen Sie einen Basisrechner für römische Ziffern.
Bedarf
- Unterstützt
+
,-
,*
,/
- Eingabe und Ausgabe sollten nur ein Subtrahiererpräfix pro Symbol erwarten (dh 3 kann nicht sein,
IIV
weil es zweiI
davor gibtV
) - Die Handhabung des Subtraktion Prinzips in Ein- und Ausgang muss bei Mindestunterstützung moderner Standard Konventionen, in denen nur Zehnerpotenzen sind von größeren Zahlen abgezogen (zB
I
,X
,C
sind erforderlich , Subtrahierern aber nichtV
,L
,D
) und Subtraktion wird nie von einer Reihe mehr getan , als 10x der Subtrahierer (zBIX
muss unterstützt werden,IC
ist aber nicht erforderlich). - Eingabe und Ausgabe sollten in der Reihenfolge des Werts von links nach rechts erfolgen, beginnend mit dem größten (dh 19 =
XIX
nichtIXX
, 10 ist größer als 9). - Von links nach rechts, kein Operator-Vorrang, als ob Sie einen Handrechner verwenden würden.
- Unterstützt die Eingabe / Ausgabe ganzer positiver Zahlen zwischen 1-4999 (keine Notwendigkeit für V̅)
- Keine Bibliotheken, die römische Zahlen für Sie konvertieren
Damit Sie sich entscheiden
- Groß- und Kleinschreibung
- Leerzeichen oder keine Leerzeichen bei der Eingabe
- Was passiert, wenn Sie eine dezimale Ausgabe erhalten? Abschneiden, keine Antwort, Fehler usw.
- Was tun bei Ausgaben, die Sie nicht verarbeiten können? Negative oder Zahlen sind zu groß, um gedruckt zu werden.
- Ob eine liberalere Verwendung des Subtraktionsprinzips als die Mindestanforderung unterstützt werden soll.
Extra Gutschrift
- -50 - Bis zu 99999 oder größer handhaben. Symbole müssen ein Vinculum enthalten
Sample Input / Output
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
Der kürzeste Code gewinnt.
code-golf
roman-numerals
Danny
quelle
quelle
IM = 999
gewünscht?IM
. Ob die AusgabeIM
oderCMXCIX
für 999 ist, liegt bei Ihnen. Beides entspricht den Anforderungen.Antworten:
JavaScript (ES6), 238
Verwendung:
Kommentierte Version:
quelle
T-SQL, 1974 - 50 = 1924 Bytes
Ich weiß, dass das Golfen in SQL dem Spielen von 18 Löchern mit nichts als einem Sandkeil entspricht, aber ich habe die Herausforderung dieses Lochs genossen und ich denke, ich habe es geschafft, einige interessante Dinge methodisch zu tun.
Dies unterstützt das Vinculum sowohl für die Eingabe als auch für die Ausgabe. Ich habe mich an die Konvention gehalten, eine nachgestellte Tilde zu verwenden, um sie darzustellen, also ist V ~ 5000, X ~ 10000 usw. Entsprechend der Verwendung von modernen römischen Zahlen sollten auch Ausgaben von bis zu 399.999 verarbeitet werden. Danach wird eine teilweise nicht standardmäßige römische Codierung für alle Elemente im von INT unterstützten Bereich durchgeführt.
Da es sich ausschließlich um Ganzzahl-Mathematik handelt, werden alle nicht ganzzahligen Ergebnisse implizit gerundet.
Ich arbeite immer noch an einer satzbasierten Lösung, um einige WHILE-Schleifen zu ersetzen, die die Byteanzahl verringern und ein eleganteres Beispiel für idiomatisches SQL darstellen könnten. Es gibt auch einige Bytes zu gewinnen, indem die Verwendung von Tabellen-Aliasen auf ein Minimum reduziert wird. Aber da es in dieser Sprache im Wesentlichen nicht zu gewinnen ist, bin ich meistens nur hier, um mein Don Quijote-Outfit zu präsentieren. :)
SELECT @i oben wiederholt die Eingabe:
Und das SELECT am Ende gibt zurück:
Und Sie können es selbst an dieser SQLFiddle testen
Und ich werde wiederkommen, um ein paar Kommentare hinzuzufügen, wie es funktioniert, denn warum sollte man eine offensichtlich verlierende Antwort posten, wenn man sie nicht für einen pädagogischen Wert ausnutzen will?
quelle
Javascript -
482476 ZeichenDer Sample Input / Output funktioniert:
Es geht auch schlecht mit großen Zahlen um:
Und es akzeptiert, benötigt aber auch keine Leerzeichen.
Aber seit ich Golf gespielt habe, gibt es einige Probleme:
Diese alternative Version verarbeitet Zahlen über 5000 bis 99999, hat jedoch
600598584 Zeichen:quelle
Javascript
479361348278253303 Zeichen - 50 für die Unterstützung von Zahlen bis zu 1 Million, einschließlich vinculum-Unterstützung:
Verbrauch:
p(text)
zBp('XIX + LXXX')
kehrt zurückXCIX
.Code mit erläuternden Kommentaren:
Dies funktioniert für die angegebenen Beispiele und für alle anderen, die ich ausprobiert habe. Beispiele:
quelle
Ruby 2.1,
353 (und viele andere Iterationen), 295 - 50 = 245Die vinculum-Behandlung fügt ~ 23 Zeichen hinzu.
Dies behandelt "IL" oder "VM" in der Eingabe und schlägt ohne Fehler bei Negativen (High-Ints) oder Dezimalzahlen (Kürzungen) oder Leerzeichen fehl. Behandelt jetzt auch eine negative erste Zahl (obwohl die Summe immer noch schlecht ausfällt, wenn sie negativ ist). Scheitert auch schlecht, wenn Sie mit * beginnen oder / oder wenn das Ergebnis 4 Millionen oder mehr beträgt.
Verwendet Object # send für die "Handrechner" -Funktionalität.
Ungolfed:
quelle
Python 2 -
427418404401396395392 ZeichenLiest von der Standardeingabe. Es werden nur Großbuchstaben verarbeitet (bei 8 zusätzlichen Zeichen kann die Groß- und Kleinschreibung unberücksichtigt bleiben) und Leerzeichen benötigt. Keine Validierung - Ich habe nicht getestet, wie es in verschiedenen Fällen bricht. Zahlen wie VC = 95 werden jedoch verarbeitet.
Und die ungolfed version:
Ich habe das Gefühl, Perl wäre besser gewesen, aber ich weiß nicht genug davon. Für einen ersten Versuch mit Codegolf fühle ich mich jedoch ziemlich gut dabei.
quelle
PHP -
549525524520 BytesNichts allzu innovatives: Normalisiert die Operatoren, um den Vorrang von links nach rechts zu gewährleisten, konvertiert römische in dezimale Zeichen, führt
eval
die Anweisung aus, z. B. wird XCIX + I / L * D + IV in so etwas wie return ((((((+90 +9) + (+1)) / (+50)) * (+500)) + (+4)); konvertiert dann die Dezimalstelle zurück in die römische.z.B
quelle
Python - 446 Bytes
Dies könnte erheblich verbessert werden. Ich hatte das Gefühl, ich musste den ersten Schwung mit Python machen. Es macht 3 Dinge beim ersten Durchgang
x
um alle möglichen Kombinationen (auch wenn sie nicht verwendet werden). Während zum BeispielXIX
wird die Teilwerte des gelext,"X":10
,"XI":11
und"XIX":19
in die Symboltabelle hinzugefügtAm Ende wird
eval
die ursprüngliche Zeichenfolge aufgerufen (außer bei hinzugefügten Parens) und die Symboltabelle ausgegeben.Dann habe ich gerade eine bekannte Lösung eingefügt, um eine Ganzzahl in eine römische umzuwandeln, da ich lange genug daran gearbeitet hatte ... Bitte verbessere mich, damit ich etwas Neues lerne :)
quelle