[Oman | इलवर्स] पोलिश नोटेशन


11

यह एक ऐसी दुनिया में वर्ष MDLXVII है जिसमें रोमन साम्राज्य कभी नहीं गिरा, और अंधेरे युग में पतन कभी नहीं हुआ। पैक्स रोमाना की विस्तारित अवधि के कारण, साम्राज्य की आर्थिक स्थिरता ने प्रौद्योगिकी को तीव्र गति से प्रगति करने में सक्षम बनाया।

रोमनों ने सर्किट्री के साथ छेड़छाड़ करना शुरू कर दिया है, और एक सरल कैलकुलेटर का आविष्कार किया है जिसे "बराबर" बटन के उपयोग की आवश्यकता नहीं है। वे इसे "रोमन पोलिश संकेतन" कहते हैं

गणना करने के लिए, वे पहले अपने ऑपरेंड में प्रवेश करते हैं, फिर ऑपरेशन में।

उदाहरण के लिए, 100 + 11 * 20 होगा C XI XX * +

इसके अतिरिक्त

रोमन ने पाया है कि उन्हें अक्सर एक ही समय में कई गणना करने की आवश्यकता होती है, और किसी प्रकार की सरणी / सूची / टपल-जैसी संरचना में "स्टैक पर हर मूल्य" को वापस करने की विधि के लिए पसंद करेंगे। (उदा। X I + X I - CC II +[11, 9, 202] लौटेंगे)


इन गणनाओं को बनाने में सक्षम कैलकुलेटर प्रोग्राम विकसित करना चुनौती है।

स्पष्टीकरण : घटाव की सूचना की आवश्यकता होती है। मुझे एहसास नहीं था कि यह प्राचीन रोमन साम्राज्य में मान्यता प्राप्त विशेषता नहीं थी। कार्य इसलिए अस्पष्ट था, और मैं माफी माँगता हूँ।

न्यूनतम दिशानिर्देश

  • आपका आउटपुट अरबी अंकों में होगा।
  • आपको केवल रोमन अंकों से 5000 तक कन्वर्ट करने की आवश्यकता है।
  • आपको +, -, /, * संचालन (इसके अलावा, घटाव, विभाजन और गुणा) का समर्थन करने की आवश्यकता होगी।
  • क्या विभाजन फ़्लोटिंग पॉइंट आधारित है या पूर्णांक आधारित कार्यान्वयन विशिष्ट है। या तो इस चुनौती के लिए काम करता है।
  • आपके आउटपुट को 4 बिलियन तक की संख्याओं का समर्थन करना होगा।
  • सबसे छोटा जवाब, और प्रत्येक भाषा में जीतता है। यह एक कोड गोल्फ चैलेंज है लेकिन मुझे विविधता पसंद है।

एक टाई होने की स्थिति में, 5000 से ऊपर के रोम अंकों के लिए समर्थन या अतिरिक्त संचालन जैसे कारकों पर विचार किया जाएगा जो सबसे पहले प्रस्तुत करेंगे।


1
क्या हम इनपुट को स्ट्रिंग्स की सूची के रूप में ले सकते हैं, प्रत्येक में एक रोमन नंबर या एक ऑपरेटर है?
user202729

क्या इनपुट को लोअरकेस में लिया जा सकता है, या इसे अपरकेस होना चाहिए?
दिज़िमा

1
@JesseDanielMitchell नोट के रूप में ... नियमों को बदलने और मौजूदा उत्तरों को अमान्य करने का प्रयास करें । इसके अलावा, (हमेशा की तरह) मैं सैंडबॉक्स में पोस्ट करने का सुझाव देता हूं ।
user202729

जवाबों:


6

अजगर 2 + रोमन , 118 बाइट्स

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

डेमो

यह मॉड्यूल यह का उपयोग करता है की वजह से ऑनलाइन परीक्षण नहीं किया जा सकता है, लेकिन आप कैसे इस चलाने के लिए देख सकते हैं यहाँ (एक पूर्ण कार्यक्रम STDIN से इनपुट को स्वीकार - उद्धरण के साथ एक अभिव्यक्ति है - और STDOUT करने के लिए उत्पादन मुद्रण - एक सूची के रूप में , ढेर)। थोड़े पुराने संस्करण का उपयोग करता है, क्योंकि मैं केवल कुछ बाइट्स के लिए एक नया GIF बनाने के लिए परेशान नहीं करूंगा:

डेमो GIF

पैकेज को स्थापित करने के लिए, आप टर्मिनल / कमांड लाइन में निम्नलिखित चला सकते हैं:

pip install roman

2
pyTester/Py.pyಠ_ಠ
totallyhuman

@totallyhuman यह सिर्फ एक डमी परियोजना है जिसे मैंने सिर्फ इसके लिए बनाया है ...
श्री एक्सकोडर

6

हास्केल , 217 बाइट्स

-13 बाइट्स ब्रूस फोर्ट के लिए धन्यवाद। -73 बाइट्स अर्जन जोहान्सन को धन्यवाद।

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

इसे ऑनलाइन आज़माएं!

मैनुअल कार्यान्वयन, याय!


2
मैंने उसे थोड़ा नीचे काट दिया (इसलिए नए पायथन को पीटने के करीब ...) इसे ऑनलाइन आज़माएं!
अर्जन जोहानसन

1
अजगर भी कट गया। लेकिन अगर उनका तर्क कि घटिया अंकन का समर्थन करने की आवश्यकता नहीं है, को बरकरार रखा जाता है, तो यहां और भी बचत होती है।
अर्जन जोहान्सन

1
किसी भी मामले में, एक और 3 बाइट्स के साथ बंद l=1:4:5:9:map(10*)l
ბიმო

मुझे रोमन अंकों को परिवर्तित करने के लिए एक बार बची हुई ट्रिक याद आई, जो कि घटाव का ध्यान स्वतः रखती है। इसे ऑनलाइन आज़माएं!
अर्जन जोहान्सन


2

जावास्क्रिप्ट (नोड) + रोमन्स + stk-lang , 74 बाइट्स

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

Bigintegers की एक सूची देता है।

क्रियान्वयन

निम्नलिखित चलाएँ:

npm install romans
npm install stk-lang
node

फिर फ़ंक्शन पेस्ट करें। उदाहरण:

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.

+ romans@1.0.0
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.

+ stk-lang@1.0.0
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' ]

कितने लोग लैंबडा का उपयोग शीघ्र के रूप में करते हैं?
स्टेन स्ट्रम

@StanStrum मुझे यह पसंद है, और यह cmder की
कॉनर ओ'ब्रायन

नहीं पता था कि लगता है कि मैं $और से कभी विचलित नहीं हुआ हूं >। ईमानदारी से, मैं इसे पसंद करता हूं
स्टेन स्ट्रम

2

दिल्लोग एपीएल , 93 बाइट्स

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

इसे ऑनलाइन आज़माएं!

बिल्ट-इन के बिना 116 बाइट्स


Woah, गोल्फ में संशोधित असाइनमेंट से पहले कभी नहीं देखा
Zacharý

@ Zacharý यह एकमात्र तरीका है जिसे मैं अपने dfns दायरे से बाहर एक चर को संशोधित करने के लिए जानता हूं, इसलिए इसका उपयोग यहां किया जाना था
दिजिमा

मेरी अज्ञानता को क्षमा करें, लेकिन संशोधित असाइनमेंट क्या है?
केयर्ड सिक्काहिंगाहिंग

@cairdcoinheringaahing var fn←arr- यह इसके बराबर है var ← var fn arr। यहाँ इसका उपयोग कई स्थानों पर किया a,←⍵जा रहा है , जो एक है जो चर पर लागू होता हैa
द्विजिमा

1

पायथन 3 , 280 206 बाइट्स

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

इसे ऑनलाइन आज़माएं!

इस बार घटाव संकेतन समर्थन के साथ। विधि cमुख्य प्रवेश बिंदु है; अन्य समर्थन है।

लॉग संपादित करें:


आप के बाद खरोज ब्लॉक की जरूरत नहीं है ifऔर else
अर्जन जोहानसन

वास्तव में, मैं आपको यह ट्रिक प्रदान करता हूं जो मैंने एक बार पाया था:n+=v-n%v*2
अर्जन जोहानसन

1
आप दो strउपयोगों को भी जोड़ सकते हैं । इसे ऑनलाइन आज़माएं!
अर्जन जोहानसन

0

जावास्पिल्ट (ईएस 6), 152 151 बाइट्स

सहेजा गया 1 बाइट उपयोगकर्ता 202029 के लिए धन्यवाद

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

परीक्षण के मामलों

स्पष्टीकरण (कम गोल्फ वाला)

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

मुझे पूरा यकीन है कि 1e3यह भी काम करेगा और कुछ बाइट्स बचाएगा।
user202729

0

जेली , 82 बाइट्स

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

इसे ऑनलाइन आज़माएं!

मूल रूप से चैट में पोस्ट किया गया


स्पष्टीकरण:

क्योंकि जेली में एक स्टैक नहीं है, मैंने स्टैक को रजिस्टर में डाल दिया है।

जब कार्यक्रम शुरू होता है, तो रजिस्टर मूल्य ®होता है 0, जिसे [0]इस कार्यक्रम के प्रयोजनों के लिए माना जाता है ।


ị“+-×÷”;”/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]


-1

पायथन 3 , 216 187 बाइट्स

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

इसे ऑनलाइन आज़माएं!

क्योंकि यह सवाल और इस जवाब दोनों की टिप्पणियों में सामने आया और संभावित रूप से डाउन-वोट के कारण हुआ: यह सबमिशन अव्यावहारिक अंकन का समर्थन नहीं करता है। Rationale: रोमन साम्राज्य में घटिया संकेतन का उपयोग शायद ही कभी किया गया था और केवल बाद में लोकप्रिय हो गया था (देखें घटाव अधिसूचना , पैराग्राफ 3, अंतिम वाक्य)। यह कार्य एक रोमन साम्राज्य है कि प्रोग्राम योग्य एकीकृत सर्किट विकसित करता है, न कि 13 वीं शताब्दी के यूरोप के समान सांस्कृतिक परिवर्तन। विवरण में घटिया अंकन का उल्लेख नहीं है और कोई भी उदाहरण इसका उपयोग नहीं करता है।


हम्म ... आप CIV(104) जैसे नंबरों का समर्थन नहीं कर रहे हैं ।
अर्जन जोहानसन

... वहाँ अपने तर्क को गलत नहीं कर सकते। : पी
अर्जन जोहानसन

2
ए जी, आप सही थे। मैंने संभावित अस्पष्टता के बारे में नहीं सोचा था, मुझे पता नहीं था कि प्राचीन रोमन साम्राज्य में घटिया संकेतन एक सामान्य विशेषता नहीं थी।
जेसी डैनियल मिशेल

1
मैंने वास्तव में ओपी के तहत घटिया अंकन के बारे में पूछने पर विचार किया (और एक उदाहरण की कमी पर ध्यान दिया), लेकिन विचलित हो गया। यदि आप भविष्य की चुनौतियों में परिभाषा अस्पष्टता के बारे में सोचते हैं, तो संकोच न करें, बस पूछें (एक चेतावनी के साथ जवाब देना और आपकी टिप्पणी का लिंक आपको पोस्ट करना चाहते हैं, तो करना चाहिए)। अब एक सत्तारूढ़ आप में है इसे ठीक करने का प्रयास करना चाहिए :)
योनातन एलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.