जब रोम में, रोम के रूप में गिनती करते हैं?


20

पृष्ठभूमि

यह चुनौती इस वेबसाइट से प्रेरित है , जिसने निम्नलिखित चित्र प्रकाशित किया है:

यहां छवि विवरण दर्ज करें

यह आरेख हमें दिखाता है कि 250 के तहत सबसे लंबी रोमन न्यूमेरल अभिव्यक्ति 188 की है, जिसे व्यक्त करने के लिए 9 अंकों की आवश्यकता होती है।

चुनौती

मानक सबसे रोमन अंकों व्यक्त करने के लिए इस्तेमाल किया प्रतीकों निम्नलिखित हैं: { I, V, X, L, C, D, M}, जहां पात्रों के संख्यात्मक मान रहे हैं M= 1000, D= 500, C= 100, L= 50, X= 10, V= 5, I= 1।

इस चुनौती में, आपका लक्ष्य एक सकारात्मक पूर्णांक n दिया गया है, मान्य रोमन न्यूमेरिकल निरूपणों की संख्या की गणना करें, जो मानक प्रतीकों के समवर्ती n के माध्यम से बनाए जा सकते हैं ।

फिर, आपके प्रोग्राम को इस अभिकलन के परिणाम का उत्पादन करना चाहिए!

इनपुट : एक सकारात्मक पूर्णांक एन

आउटपुट : लंबाई के मान्य रोमन अंक अभिव्यक्तियों की संख्या n

रोमन न्यूमेरिकल एक्सप्रेशंस के नियम

रोमन संख्याएं मूल रूप से केवल "योगात्मक" जोड़ी थी, जिसका अर्थ है कि अंकों को हमेशा अवरोही क्रम में लिखा गया था, और सभी अंकों के मूल्यों का योग संख्या का मूल्य था।

बाद में, जोड़-तोड़ करने वाले जोड़, छोटे से बड़े को घटाने के लिए एक छोटे से अंक को बड़े के सामने रखने का उपयोग रोमन न्यूमेरल अभिव्यक्तियों को छोटा करने के लिए आम हो गया। घटिया जोड़े को जंजीर में नहीं डाला जा सकता है, जैसे कि निम्नलिखित अमान्य अभिव्यक्ति में IXL:।

एडिटिव और सबट्रेक्टिव पेयरिंग के लिए आधुनिक दिन के नियम निम्नलिखित हैं।

  1. केवल एक I, X, और C को घटाव जोड़ी के भाग में अग्रणी संख्या के रूप में उपयोग किया जा सकता है।
  2. मुझे केवल एक जोड़-तोड़ जोड़ी में वी या एक्स से पहले रखा जा सकता है।
  3. एक्स को केवल एक अव्यावहारिक जोड़ी में L या C से पहले रखा जा सकता है।
  4. सी को केवल डी या एम से पहले एक अव्यावहारिक जोड़ी में रखा जा सकता है।
  5. घटाए जाने वाले जोड़े के अलावा, अंकों को अवरोही क्रम में होना चाहिए (इसका अर्थ है कि यदि आप प्रत्येक घटाए गए जोड़े की अग्रणी संख्या को छोड़ते हैं, तो अंक अवरोही क्रम में होंगे)।
  6. M, C, और X को छोटे संप्रदायों के बराबर या अधिक नहीं किया जा सकता है।
  7. डी, एल, और वी केवल एक बार दिखाई दे सकते हैं।
  8. केवल M को 4 या अधिक बार दोहराया जा सकता है।

आगे के नोट

  • हम बार संकेतन का उपयोग नहीं करेंगे ; बल्कि, हम किसी भी संख्या को व्यक्त करने के लिए और अधिक एम जोड़ेंगे ।

  • ये एकमात्र नियम हैं जो हम अपने रोमन अंकों के लिए अनुसरण करेंगे। इसका अर्थ है कि विषम भाव, जैसे कि IVI, हमारी प्रणाली में भी मान्य माने जाएंगे।

  • यह भी याद रखें कि हम उन संख्याओं की गिनती नहीं कर रहे हैं जिनकी लंबाई n की अभिव्यक्ति है , क्योंकि कुछ संख्याओं में कई अभिव्यक्तियाँ हैं। इसके बजाय, हम पूरी तरह से मान्य अभिव्यक्तियों की संख्या की गिनती कर रहे हैं।

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

17

231

3105

मैंने हाथ से ऊपर की जाँच की है, इसलिए कृपया परीक्षण के मामलों की दोहरी जांच करना सुनिश्चित करें, और यदि आप कर सकते हैं तो अधिक जोड़ें!

जीत का मानदंड

यह एक चुनौती है, इसलिए मज़े करो! मैं केवल उन समाधानों को स्वीकार करूंगा जो 9 में से कम से कम आदानों को संभाल सकते हैं। 9. कोई और बोनस है!

संपादित करें

जैसा कि टिप्पणीकारों ने अनुरोध किया है, नीचे पाएं, या इस पास्टबिन लिंक पर, 105 कॉम्बोस I की गणना n = 3 के लिए की गई है

III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XXX XCX XCX XCL XCC XII LII LIV LVI LXI LXI LXV LII CIV CIX CVI CXI CXV CXC CXC CXC CXC CLI CLV CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLX CLASSIC। सीएमआई सीएमवी सीएमएक्स सीएमएल सीएमसी सीएमडी सीएमडी डीआईएम डीआईवाई डिक्स डीएक्सआई डीएक्सआई डीएक्सवी डीएक्सएल डीएक्सएल डीएलआई डीएलआई डीएलवी डीएलएक्स डीसीआई डीसीएक्स डीसीएल डीसीएल डीसीएल डीसीआई एमआइवी मिक्स एमवीएक्स एमएक्सएक्स एमएक्सवी एमएक्सएल एमएक्सएल एमएलसी एमएलवी एमसीएक्स एमसीएक्स एमसीएल एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स एमसीएक्स डीसीएक्स एमएमएक्स एमएमएल एमएमसी एमएमडी एमएमएम

2 संपादित करें:

अपने परिणामों की जांच करने के लिए, जोनाथन एलन के सौजन्य से निम्नलिखित गैर-गोल्फ कोड का उपयोग करें ।

संपादित करें 3:

मैं इस चुनौती में सभी त्रुटियों के लिए माफी माँगता हूँ। मैं अगली बार एक बेहतर काम करना सुनिश्चित करूँगा!


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मीगो

जवाबों:


3

रेटिना , 111 बाइट्स

~(`.+
*$(CM)CDXCXCXCXLIXIXIXIVII
.(.)
.+¶$$&$¶$$&$1$¶$$&$&¶L`.{0,$+}\b¶D`¶
¶$
¶.+¶$$&$¶$$&I¶L`[A-Z]{$+}\b¶D`¶.+

इसे ऑनलाइन आज़माएं! यह एक पूर्ण पुनर्लेखन है क्योंकि मैंने नियम 1. गलत समझा है। इसका मतलब है कि आप केवल एक-एक घटाव का उपयोग कर सकते हैं I, Xऔर C। स्पष्टीकरण: स्क्रिप्ट का पहला भाग इनपुट को CMजोड़े में एक स्ट्रिंग के रूप में फैलता है, इसके बाद अन्य संभव घटिया जोड़े होते हैं। प्रत्येक जोड़ी वैकल्पिक है, और जोड़ी के भीतर प्रत्येक जोड़ी का पहला चरित्र भी वैकल्पिक है। तीसरा चरण फिर रेटिना कमांड की एक सूची में जोड़े की सूची का विस्तार करता है जो इनपुट लेते हैं और जोड़ी से दूसरे या दोनों वर्णों के विकल्प के साथ तीन प्रतियां बनाते हैं, फिर परिणामों को काटते हैं और काटते हैं। अंतिम चरण फिर अंतिम कार्यों को करने के लिए कोड को जोड़ता है: पहले इनपुट को विस्तारित करने के लिए संभवतः एक अंतिम जोड़ने के लिएI, फिर गलत लंबाई के परिणामों को फ़िल्टर करने के लिए, फिर परिणामों को कम करने के लिए, और अंत में परिणामों को गिनने के लिए। परिणामस्वरूप रेटिना स्क्रिप्ट का मूल्यांकन किया जाता है।

नोट: सिद्धांत में 15 बाइट्स को 4 वीं पंक्ति के अंत से बचाया जा सकता है, लेकिन इससे TIO पर प्रदर्शित करने के लिए स्क्रिप्ट बहुत धीमी हो जाती है n=1


@JonathanAllan आह, तो आप एक ही अग्रणी अंक के साथ कई घटावदार जोड़े शामिल कर रहे हैं, जो गलत है।
नील

2
@JonathanAllan नई रीराइट, संयोग से ठीक उसी बाइट की गिनती के लिए!
नील

5

पायथन 2 , 177 168 162 बाइट्स

import re,itertools as q
f=lambda n:sum(None!=re.match("^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$",(''.join(m)))for m in q.product('MDCLXVI',repeat=n))

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

मैं बहुत नया हूँ, मेरी मदद करो यह गोल्फ! यह वास्तविक रोमन अंकों के लिए जाँच करता है, रेगेक्स को विषम मामलों जैसे कि खाते के लिए समायोजित करने की आवश्यकता हैIVI

-9 बाइट्स @Doss पोसुम को धन्यवाद!

-6 बाइट्स थैंक्स टू @ovs


हाँ, मुझे लगता है कि n = 3 मामला उदाहरण में गलत हो सकता है। मैं मूल रूप से 93 के साथ मिल रहा था^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
ईस्टन बोर्नमेयर


1
@JonathanAllan मैंने लगभग दो दिन बिताए, मैथ स्टैटेक्सचेंज पर चारों ओर से पूछकर यह सुनिश्चित करने की कोशिश की गई कि ये नियम समझ में आए। मुझे लगता है कि मैं पर्याप्त नहीं था :(
हजारों

1
@RushabhMehta यह एक बहुत अच्छी तरह से स्वरूपित चुनौती है और कार्यक्रम के लिए मजेदार है, रोमन अंक की परिभाषा में किटी-किरकिरी में एक दुर्भाग्यपूर्ण बारीकियों के बारे में बुरा नहीं लगता है। यह आपकी चुनौती है, इसे निर्दिष्ट करें जैसा कि आप फिट देखते हैं। यह अन्य अर्थों में व्यावहारिक है, और अधिक कठिन है
ईस्टन बोर्नमेयर

1
यह 3 के लिए सही जवाब देने के लिए प्रतीत नहीं होता है93105
Jo King

3

जावास्क्रिप्ट (ईएस 7), 133 बाइट्स

संपादित करें : जोनाथन एलन के कोड द्वारा लौटाए गए परिणामों से मेल खाने के लिए निश्चित , जिसे ओपी द्वारा एक संदर्भ कार्यान्वयन के रूप में दिया गया था।


n=>[...Array(m=k=7**n)].reduce(s=>s+/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test((--k+m).toString(7).replace(/0[62]|2[34]|4[51]/g,s=>s[1])),0)

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

कैसे?

एन1

[...Array(m = k = 7 ** n)].reduce(s => … (--k + m).toString(7) …, 0)

अब से, प्रत्येक अंक की व्याख्या रोमन अंक चिह्न के रूप में की जाएगी:

0मैं,1,2एक्स,3एल,4सी,5डी,6वी

2) हम फॉर्म के सभी वैध घटाए गए जोड़ों को प्रतिस्थापित ABकरते हैं B:

.replace(/0[62]|2[34]|4[51]/g, s => s[1]))  // in the code
.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1]))  // with Roman symbols

उदाहरण:

  • XLIXIV हो जाता है LXV
  • XIIVहो जाता है XIV, Iकि एक छोड़कर अगले परीक्षण विफल हो जाएगा
  • ICअपरिवर्तित रहता है, जो Iजगह में एक अवैध भी छोड़ देता है

3) हम जाँचते हैं कि शेष चिन्ह सही क्रम में हैं और वे जितनी बार अनुमति देते हैं उससे अधिक बार नहीं दिखाई देते हैं:

/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test(…)  // in the code
/^M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(…)  // with Roman symbols

पवित्र गाय, मुझे उम्मीद नहीं थी कि यह गैर गूढ़ भाषाओं में 200 से कम बाइट्स में किया जाएगा! मन समझा रहा है कि यह कैसे काम करता है?
डॉन थाउजेंड

हालाँकि, मैंने देखा है कि यह TIO पर * n *> 4 के लिए काम नहीं करता है, जो कुछ दुर्भाग्यपूर्ण है।
डॉन थाउजेंड

@RushabhMehta मैंने उच्च मूल्यों का परीक्षण करने के लिए एक गैर-पुनरावर्ती संस्करण जोड़ा है। जब मैं यह गोल्फिंग कर रहा हूँ तो एक स्पष्टीकरण जोड़ूँगा।
अरनौलड

0

सी, 150 123 बाइट्स

मैंने विवरण को पर्याप्त रूप से नहीं पढ़ा है, इसलिए यह मानक रोमन अंकों की संख्या पैदा करता है (जहां अभिव्यक्ति की IVIगणना नहीं की जाती है)। चूंकि मैंने इसमें कुछ प्रयास किया है, मैंने सोचा कि मैं किसी भी तरह साझा करूंगा।

#define F(X) for(X=10;X--;)
x[]={0,1,2,3,2,1,2,3,4,2};f(i,o,a,b,c){for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];return o;}

मूल (150 बाइट्स):

#define F(X) for(X=10;X--;)
i,o,a,b,c,x[]={0,1,2,3,2,1,2,3,4,2};main(){scanf("%i",&i);for(i++;i--;)F(a)F(b)F(c)o+=i==x[a]+x[b]+x[c];printf("%i\n",o);}

1
आपको केवल मान्य प्रस्तुतियाँ पोस्ट करने की अनुमति है।
ओकेक्स

@ कर्टिसबेकटेल आप मेरे द्वारा बनाए गए समाधान को यहां रख सकते हैं, लेकिन मैं इसे चुनौती के नियमों को पूरा करने के लिए संशोधित करने का प्रयास करूंगा।
डॉन थाउजेंड

1
मुझे लगता है कि आप के बीच की जगह को हटा सकते हैं F(X)औरfor(X=10;X--;)
Zacharý
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.