R [oman | everse] Polnische Notation

11

Es ist das Jahr MDLXVII in einer Welt, in der das Römische Reich niemals unterging und der Zusammenbruch in die dunklen Zeiten niemals stattfand. Aufgrund der längeren Zeit von Pax Romana ermöglichte die wirtschaftliche Stabilität des Reiches einen raschen Fortschritt der Technologie.

Die Römer haben begonnen, sich mit Schaltkreisen zu beschäftigen, und einen ausgeklügelten Taschenrechner erfunden, für den kein "Gleich" -Knopf erforderlich ist. Sie nennen es "römisch-polnische Notation"

Um eine Berechnung durchzuführen, geben sie zuerst ihre Operanden und dann die Operation ein.

Zum Beispiel wäre 100 + 11 * 20 C XI XX * +.

zusätzlich

Die Römer haben festgestellt, dass sie häufig mehrere Berechnungen gleichzeitig durchführen müssen, und würden es vorziehen, wenn die Methode jeden Wert "auf dem Stapel" in einer Art Array / Liste / Tupel-ähnlicher Struktur zurückgibt. (zB X I + X I - CC II +würde zurückkehren [11, 9, 202])


Die Herausforderung besteht darin, ein Taschenrechnerprogramm zu entwickeln, mit dem diese Berechnungen durchgeführt werden können.

Klarstellung : Subtraktive Notation ist erforderlich. Ich hatte nicht bemerkt, dass es im antiken römischen Reich kein anerkanntes Merkmal war. Die Aufgabe war daher nicht eindeutig, und ich entschuldige mich.

Mindestrichtlinien

  • Ihre Ausgabe erfolgt in arabischen Ziffern.
  • Sie müssen nur von römischen Ziffern bis zu 5000 konvertieren.
  • Sie müssen +, -, /, * Operationen unterstützen (Addition, Subtraktion, Division und Multiplikation).
  • Ob die Division auf Gleitkomma oder Ganzzahl basiert, ist implementierungsspezifisch. Beides funktioniert für diese Herausforderung.
  • Ihre Ausgabe muss Zahlen bis zu 4 Milliarden unterstützen.
  • Die kürzeste Antwort insgesamt UND in jeder Sprache gewinnt. Dies ist eine Code Golf Challenge, aber ich liebe die Vielfalt.

Im Falle eines Unentschieden werden Faktoren wie die Unterstützung von römischen Ziffern über 5000 oder zusätzliche Operationen als die früheste Einreichung angesehen, die gewinnt.

Jesse Daniel Mitchell
quelle
1
Können wir Eingaben als Liste von Zeichenfolgen verwenden, die entweder eine römische Zahl oder einen Operator haben?
user202729
Kann die Eingabe in Kleinbuchstaben erfolgen oder muss sie in Großbuchstaben erfolgen?
Dzaima
1
@JesseDanielMitchell Als Hinweis ... versuchen Sie, die Regeln nicht zu ändern und vorhandene Antworten ungültig zu machen . Außerdem schlage ich (wie üblich) vor, in der Sandbox zu posten .
user202729

Antworten:

6

Python 2 + Roman , 118 Bytes

from roman import*
s=[]
for i in input().split():s+=[eval(s.pop(-2)+i+s.pop())if i in"+-/*"else`fromRoman(i)`]
print s

Demo

Es kann nicht wegen des Moduls getestet online es Verwendung macht, aber man kann sehen , wie diese ausgeführt werden hier (ein volles Programm zu akzeptieren Eingabe von STDIN - einen Ausdruck mit Anführungszeichen - und das Drucken der Ausgabe an STDOUT - in Form einer Liste , der Stapel). Verwendet eine etwas ältere Version, da ich nicht die Mühe machen werde, ein neues GIF für nur wenige Bytes zu erstellen:

Demo GIF

Um das Paket zu installieren, können Sie Folgendes in der Terminal- / Befehlszeile ausführen:

pip install roman
Mr. Xcoder
quelle
2
pyTester/Py.pyಠ_ಠ
totalhuman
@totallyhuman Es ist nur ein Dummy-Projekt, das ich nur dafür gemacht habe ...
Mr. Xcoder
6

Haskell , 217 Bytes

-13 Bytes dank Bruce Forte. -73 Bytes dank Ørjan Johansen.

foldl(!)[].words
s@ ~(x:y:z)!n=last$(a n:s):[y`f`x:z|(f,c)<-zip[(+),(-),(*),(/)]"+-*/",n==[c]]
a s=last$0:[n+a(drop(length x)s)|(n,x)<-zip l$words"I IV V IX X XL L XC C CD D CM M",x<=s,x++"Y">s]
l=[1,4,5,9]++map(10*)l

Probieren Sie es online aus!

Manuelle Implementierung, yay!

total menschlich
quelle
2
Ich habe das ein bisschen reduziert (so nah dran, den neuen Python zu schlagen ...) Probieren Sie es online aus!
Ørjan Johansen
1
Der Python wurde auch gekürzt. Wenn jedoch sein Argument, dass die subtraktive Notation nicht unterstützt werden muss, bestätigt wird, gibt es auch hier mehr Einsparungen.
Ørjan Johansen
1
In jedem Fall weitere 3 Bytes aus mit l=1:4:5:9:map(10*)l.
31.
Ich erinnerte mich an einen Resttrick, den ich einmal gefunden hatte, um römische Ziffern zu konvertieren, der sich automatisch um die Subtraktion kümmert. Probieren Sie es online aus!
Ørjan Johansen
2

JavaScript (Knoten) + romans + stk-lang , 74 Bytes

s=>(R=require)("stk-lang")(s.replace(/\w+/g,R("romans").deromanize)).stack

Gibt eine Liste von Großzahlen zurück.

Ausführung

Führen Sie Folgendes aus:

npm install romans
npm install stk-lang
node

Fügen Sie dann die Funktion ein. Beispiel:

C:\Users\conorob\Programming\golf-new\roman
λ npm install romans
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN Programming No description
npm WARN Programming No repository field.
npm WARN Programming No README data
npm WARN Programming No license field.

+ [email protected]
added 1 package in 0.801s

C:\Users\conorob\Programming\golf-new\roman
λ npm install stk-lang
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\conorob\Programming\package.json'
npm WARN Programming No description
npm WARN Programming No repository field.
npm WARN Programming No README data
npm WARN Programming No license field.

+ [email protected]
added 1 package in 0.847s

C:\Users\conorob\Programming\golf-new\roman
λ node
> s=>(R=require)("stk-lang")(s.replace(/\w+/g,R("romans").deromanize)).stack
[Function]
> f=_
[Function]
> f("X I + X I - CC II +").map(e => e.toString())
[ '11', '9', '202' ]
> f("C XI XX * +").map(e => e.toString())
[ '320' ]
> f("MMMM M I - +").map(e => e.toString())
[ '4999' ]
Conor O'Brien
quelle
Wie viele Leute benutzen ein Lambda als Aufforderung?
Stan Strum
@ StanStrum Ich mag es, und es ist die Standardeinstellung für Terminals wie cmder
Conor O'Brien
Wusste das nicht. Ich denke, ich bin nie von $und abgewichen >. Ehrlich gesagt, ich mag es aber
Stan Strum
2

Dyalog APL , 93 Bytes

CY'dfns'
a←⍬⋄{0::{a,←⍵}roman⍵⋄f←⍎'+-÷×'⌷⍨'+-/*'⍳⍵⋄rf2aa↓⍨←¯2a,←r}¨{1↓¨⍵⊂⍨⍵∊' '}' ',⍞⋄a

Probieren Sie es online aus!

116 Bytes ohne den eingebauten Roman

Dzaima
quelle
Woah, noch nie zuvor eine modifizierte Aufgabe in einem Golf gesehen
Zacharý
@ Zacharý es ist die einzige Möglichkeit, eine Variable aus ihrem dfns-Bereich heraus zu ändern, daher musste sie hier verwendet werden.
Dzaima
Vergib mir meine Unwissenheit, aber was ist eine modifizierte Aufgabe?
Caird Coinheringaahing
@cairdcoinheringaahing var fn←arr- es ist gleichbedeutend mit var ← var fn arr. Hier wird es an mehreren Stellen verwendet, a,←⍵wobei es an die Variable a
angehängt wird
1

Python 3 , 280 206 Bytes

N=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
def d(s):
	n=0
	for v in map(N.get,s):n+=v-n%v*2
	return n
def c(w):
	s=[]
	for t in w.split():s+=[str(d(t)if t[0]in N else eval(s.pop(-2)+t+s.pop()))]
	return s

Probieren Sie es online aus!

Diesmal mit subtraktiver Notationsunterstützung. Methode cist der Haupteinstiegspunkt; Das andere ist Unterstützung.

Protokoll bearbeiten:

David Foerster
quelle
Sie brauchen die Einrückungsblöcke nach ifund nicht else.
Ørjan Johansen
Lassen Sie mich Ihnen diesen Trick anbieten, den ich einmal gefunden habe:n+=v-n%v*2
Ørjan Johansen
1
Sie können die beiden strVerwendungszwecke auch kombinieren . Probieren Sie es online aus!
Ørjan Johansen
0

JavaScipt (ES6), 152 151 Byte

1 Benutzer dank user202729 gespeichert

p=>p.split` `.map(c=>s.push(eval("+-/*".indexOf(c)+1?(T=s.pop(),s.pop())+c+T:c.replace(/./g,c=>"+"+{I:1,V:5,X:10,L:50,C:100,D:500,M:1e3}[c]))),s=[])&&s

Testfälle

Erklärung (weniger Golf)

V={I:1,V:5,X:10,L:50,C:100,D:500,M:1e3}     // Values of the roman numerals
p=>(
 s=[],                                      // Initialize the stack
 p.split` `.map(c=>                         // For every part in the input:
  "+-/*".indexOf(c)+1?                      //   If the input is an operator:
   s.push(eval((T=s.pop(),s.pop())+c+T))    //     Evaluate the operator on the top of the stack
  :                                         //   Else (if it is a roman numeral):
   s.push(eval(c.replace(/./g,c=>"+"+V[c])))//     Push the sum of the characters' values
 ),s)                                       // return the stack
Herman L.
quelle
Ich bin mir ziemlich sicher, dass das 1e3auch funktioniert und ein paar Bytes spart.
user202729
0

Gelee , 82 Bytes

ị“+-×÷”;”/v®ṫ-¤®ṖṖ¤;©
4Ḷ⁵*p1,5P€
“IVXLCDM”iЀị¢µIN‘Ṡæ.µ®;©
Ḳµ“+-*/”W€i⁸Ñ⁸Ǥ¹?µ€ṛ®Ḋ

Probieren Sie es online aus!

Ursprünglich im Chat gepostet .


Erläuterung:

Da Jelly keinen Stapel hat, lege ich den Stapel in das Register.

Wenn das Programm startet, der Registerwert ®ist 0, der als behandelt wird [0]für die Zwecke dieses Programms.


ị“+-×÷”;”/v®ṫ-¤®ṖṖ¤;©       Link 1: Given an operator index (an
                            integer in range 1..4), apply it.

ị“+-×÷”                     Index to the string "+-×÷"
       ;”/                  Concatenate with the character "/",
                            which is Jelly splat operator.
          v   ¤             Evaluate with parameter...
           ®                  the register's
            ṫ                 tail
             -                from -1. (2 last items)
               ®  ¤;        Concatenate with the register value,
                ṖṖ            pop twice.
                    ©       Store the result to register.

4Ḷ⁵*p1,5P€          Link 2: Niladic, generate [1,5,10,50,...]
4Ḷ                  Lowered range of 4, gives [0,1,2,3].
  ⁵*                Raise to power of 10. Value = 1,10,100,1000.
    p1,5            Calculate Cartesian product with [1,5].
                      Value = [1,1],[1,5],[10,1],[10,5],...
        P€          Calculate product of each item.

Alternatively, ×þ1,5F would also work instead of p1,5P€.

“IVXLCDM”iЀị¢µIN‘Ṡæ.µ®;©   Link 3: Given roman number, push it
                            to the stack (register).
         i                  Find index of ...
          Ѐ                  each character ...
“IVXLCDM”                     in "IVXLCDM".
            ị¢              Index to last link. (link 2)
              µ             With that value, (consider LIX ->
                            [50,1,10] for example)
               I             
Ḳµ“+-*/”W€i⁸Ñ⁸Ǥ¹?µ€ṛ®Ḋ

[TODO complete explanation]

user202729
quelle
-1

Python 3 , 216 187 Bytes

from operator import*
N=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)
def f(w):
	s=[]
	for t in w.split():s+=[str(sum(map(N.get,t)))if t[0]in N else str(eval(s.pop(-2)+t+s.pop()))]
	return s

Probieren Sie es online aus!

Weil es in den Kommentaren sowohl der Frage als auch dieser Antwort auftauchte und wahrscheinlich zu Abstimmungen führte: Diese Einreichung unterstützt keine subtraktive Notation. Begründung: Subtraktive Notation wurde im Römischen Reich selten verwendet und erst später populär gemacht (siehe Subtraktive Notation , Absatz 3, letzter Satz). Die Aufgabe setzt ein Römisches Reich voraus, das programmierbare integrierte Schaltkreise entwickelt hat, und nicht eines, das die gleichen kulturellen Veränderungen wie das Europa des 13. Jahrhunderts durchgemacht hat. In der Beschreibung wird die subtraktive Notation nicht erwähnt, und in keinem der Beispiele wird sie verwendet.

David Foerster
quelle
Hm ... Sie unterstützen keine Zahlen wie CIV(104).
Ørjan Johansen
... kann deine Logik dort nicht bemängeln. : P
Ørjan Johansen
2
Agh, du hattest recht. Ich hatte nicht über die mögliche Mehrdeutigkeit nachgedacht, ich war mir nicht bewusst, dass subtraktive Notation im antiken römischen Reich kein alltägliches Merkmal war.
Jesse Daniel Mitchell
1
Ich habe tatsächlich überlegt, nach der subtraktiven Notation im OP zu fragen (und habe das Fehlen eines Beispiels bemerkt), wurde aber abgelenkt. Wenn Sie bei zukünftigen Herausforderungen an Unklarheiten bei der Definition denken, zögern Sie nicht, fragen Sie einfach (eine Antwort mit einer Einschränkung und einem Link zu Ihrem Kommentar sollte ausreichen, wenn Sie Beiträge verfassen möchten). Jetzt ist eine Entscheidung in Sie sollten versuchen, es zu beheben :)
Jonathan Allan