रोमन अंक रेखा खंड


10

एक प्रोग्राम या फ़ंक्शन लिखें जो इनपुट के रूप में 1..3999 की सीमा में पूर्णांक को स्वीकार करता है और मानक रोमन अंकों में उस पूर्णांक को व्यक्त करने के लिए आवश्यक पंक्ति खंडों की संख्या लौटाता है (इसलिए आप एक्सएल का उपयोग करेंगे लेकिन वीएम नहीं)। उदाहरण:

   1 -> 1
   4 -> 3
   5 -> 2
   9 -> 3
  10 -> 2
  40 -> 4
  50 -> 2
  90 -> 3
 100 -> 1
 400 -> 3
 500 -> 2
 900 -> 5
1000 -> 4

रोमन नंबर रूपांतरण बिल्ड की अनुमति है, लेकिन आप उपरोक्त सूची से सबसे बड़ी शेष संख्या को बार-बार घटाकर उनके बिना समस्या को हल कर सकते हैं। उदाहरण: १२३४ = ४ + १ + १ + २ + २ + २ + ३ = १५।

यह , इसलिए सबसे छोटा कार्यक्रम जीतता है।


चार के बजाय 10 दो लाइन सेगमेंट क्यों है? एक्स लिखते समय, आप आम तौर पर केवल दो लाइनें लिखते हैं, लेकिन क्या लाइनों के प्रतिच्छेदन इसे चार खंड नहीं बनाते हैं?
एलेक्स ए।

@AlexA। लाइन सेगमेंट की परिभाषा आमतौर पर कुछ इस तरह होती है: "दो बिंदुओं के बीच सबसे छोटे पथ के बाद बिंदुओं का सेट"। इस पर आधारित एक्स को काटने का कोई कारण प्रतीत नहीं होता है, आपको इसे परिभाषित करने के लिए केवल दो बिंदुओं के अंतिम बिंदु की आवश्यकता है। (मुख्य रूप से रोम के लोगों ने यूक्लिडियन ज्यामिति पर लिखा है, मुझे लगता है)
फ्राईअमईनमैन

@FryAmTheEggman हम्म ठीक है। जानकर अच्छा लगा, धन्यवाद।
एलेक्स ए।

जवाबों:


2

पायथ, 92 76 70 बाइट्स

KsMc."/9hæ²z³Þ§ªW×Oû[Tnè,O¤"\/WQ=Q-Q=Nef!>TQ%2K aY@KhxKN;sY

यहाँ कोशिश करो!

कुछ स्ट्रिंग पैकिंग सुझावों के लिए @FryAmTheEggman का धन्यवाद जिसने मुझे कुछ बाइट्स बचाए!

मैं अभी भी सोच रहा हूं कि क्या इस सूची को एन्कोडिंग करने का एक गणितीय तरीका है। कुछ जानने की कोशिश करेंगे।

व्याख्या

यह दिए गए एल्गोरिथ्म का उपयोग करता है। Kविकल्प के साथ दी गई सूची और अल्टरनेशन में लाइन सेगमेंट की संक्षारक संख्या शामिल है। यह सूची एक पैक्ड स्ट्रिंग को विभाजित करके निर्मित होती है, जो प्रत्येक तत्व को पूर्णांक में मैप करने 0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4, ऑन करने /और डिकोड करने के लिए मिलती है ।

KsMc। "..." \ / WQ = QQ = Nef!> TQ% 2K aY @xxN? SY # Q = input;

   c। "..." \ / # स्ट्रिंग को / पर विभाजित करें
KsM # प्रत्येक नंबर को K को इंटिमेट करने और असाइन करने के लिए मैप करता है
            WQ # जबकि Q! = 0
                     f% 2K # केवल K के प्रत्येक 2 तत्व को लेते हैं और T के साथ फ़िल्टर करते हैं
                      !> TQ # T <= Q
                  = Ne # उस का अंतिम तत्व लें और उसे N को निर्दिष्ट करें
              = क्यूक्यू # क्यू = क्यू - एन
                                   K में N की पहली घटना का xKN # सूचकांक
                                  h # वेतन वृद्धि उस सूचकांक की है क्योंकि हम लाइन सेगमेंट चाहते हैं
                              एए @ के # उस सूचकांक से लाइन सेगमेंट प्राप्त करते हैं और वाई को जोड़ते हैं
                                      sY # लूप को समाप्त करें और Y में सभी लाइन सेगमेंट का योग प्रिंट करें

3

सी, 148 129 चार

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};f(c){while(d+=(c/n[x])*n[x+13],c%=n[x++]);return d;}

मेरा पहला कोड-गोल्फ: ^)। चूंकि प्रश्न कहता है कि मैं किसी फ़ंक्शन का उपयोग कर सकता हूं, इसलिए मैंने कुछ वर्णों को ट्रिम करने के लिए एक फ़ंक्शन में मुख्य रूप से बदलाव किया है (सबसे महत्वपूर्ण: पैरामीटर सी के रूप में स्कैन)

पैक

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};
f(c){
  while(d+=(c/n[x])*n[x+13],
        c%=n[x++]);
  return d;
}

2

मैथेमेटिका, 80 72 बाइट्स

Tr[Characters[#~IntegerString~"Roman"]/.{"I"|"C"->1,"M"->4,_String->2}]&

अनाम फ़ंक्शन जो केवल संख्याओं को रोमन अंकों में परिवर्तित करता है, प्रत्येक वर्ण को उसके सेगमेंट की संख्या से बदल देता है, और कुल लेता है।


2

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

। +
$ *
1 {1000}
टी '
1 {900}
टीडी
1 {500}
घ
1 {400}
टी
1 {100}
'
1 {90}
टी
1 {50}
घ
1 {40}
टी '
1 {10}
घ
1 {9}
टी
1 {5}
घ
1 {4}
टी
1
'
टी
d '
घ
''
'+
$ .0

जब तक बदलने के लिए कुछ नहीं बचा है, तब तक सरल की जगह। फिर एपोस्ट्रोफ की गिनती की जाती है और यह हमारे लाइन सेगमेंट की संख्या है।

यदि इनपुट और आउटपुट को unary में अनुमति दी जाती है, तो यह 115 बाइट्स है (हालांकि जो 1234 वाले टाइप करना चाहते हैं?)।

इसे ऑनलाइन आज़माएं!
इसे ऑनलाइन आज़माएं! (एकात्मक IO)


2

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

def f(a,b=0):
 for e in'᝴ᔝ஺ॣəȟĮô>9 ':e=ord(e);d=e//6;b+=a//d*(e%6);a%=d
 return b

यूनिकोड स्ट्रिंग में कोड बिंदु होते हैं:

6004 5405 3002 2403 601 543 302 244 62 57 32 27 7

यदि आप उस स्ट्रिंग को एक बाइट शाब्दिक में बदल देते हैं तो आप चूक सकते हैंe=ord(e);
xsot

मुझे नहीं लगता कि मेरे मामले में यह काम करता है। मुझे एक यूनिकोड स्ट्रिंग की आवश्यकता है :( यानी मैं उस स्ट्रिंग में कोडपॉइंट पर लूप कर रहा हूं, बाइट्स के ऊपर नहीं।
लिन

1
ओह मैं समझा। क्या आपको स्ट्रिंग के हेक्स डंप प्रदान करने का मन है? यह मेरे फोन पर ठीक से प्रदर्शित नहीं होता है।
xsot

1

जावा, 152 बाइट्स

क्योंकि, फिर पता है, जावा।

n->{int c=0;int[]r={999,4,899,5,499,2,399,3,99,1,89,3,49,2,39,4,9,2,8,3,4,2,3,3,0,1};for(int i=0;i<26;i+=2)while(n>r[i]){n-=r[i]+1;c+=r[i+1];}return c;}

दिए गए एल्गोरिथ्म का सरल शाब्दिक कार्यान्वयन। एरे ट्रांसफॉर्म सूचना को पैक करता है: यहां तक ​​कि इंडेक्स भी रोमन अंक से कम हैं और विषम इंडेक्स उस अंक के लिए गिनती हैं।

यह एक लैम्ब्डा है जो लेता है और ए int/ रिटर्न देता है Integer। इसमें शामिल हैं IntUnaryOperatorया UnaryOperator<Integer>


1

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

n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4

तार इकाइयों, दसियों और सैकड़ों अंकों के लिए लाइन सेगमेंट की संख्या का प्रतिनिधित्व करते हैं। (हजारों हजारों अंकों का केवल चार गुना है।) यह विधि अन्य विकल्पों की तुलना में कम लगती है जैसे कि एल्गोरिथ्म प्रश्न में सुझाया गया है।

संपादित करें: @ उपयोगकर्ता81655 के लिए 2 बाइट्स धन्यवाद सहेजा गया।


यह एक शांत एल्गोरिथ्म है। n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
जातियों

@ user81655 ओह, यह अच्छा है: बस +एस को बदलने के लिए -मुझे अग्रणी को हटाने की अनुमति देता है +, लेकिन फिर समूह एक और बाइट बचाता है।
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.