असंतोष की डिग्री


11

असंतोष की डिग्री

यह एक विशेष रूप से कठिन कोड पहेली नहीं है - लेकिन मैं इसे हल करने के आपके कई तरीकों को देखने के लिए इच्छुक हूं।

असंतृप्ति की डिग्री परमाणुओं के बीच दोहरे रासायनिक बांडों की संख्या है, और / या रासायनिक परिसर में संख्या के छल्ले।

आपको XaYbZc (जहां a, b और c यौगिक में X, Y या Z के परमाणुओं की संख्या है) के रूप में रासायनिक यौगिक के आणविक सूत्र दिए जाएंगे - सूत्र किसी भी लम्बाई का हो सकता है और इसमें कोई रासायनिक तत्व हो सकता है आवर्त सारणी में (हालांकि तत्व C, H, N, F, Cl, Br के अलावा, मुझे अनदेखा किया जा सकता है क्योंकि वे सूत्र में नहीं हैं)। यौगिक में कम से कम एक परमाणु कार्बन होगा। आपको इसकी डिग्री की गणना और प्रदर्शन करना चाहिए।

उदाहरण के लिए, यौगिक बेंजीन (नीचे चित्रित) में 4 का एक डीओयू है क्योंकि इसमें तीन डबल बॉन्ड हैं (परमाणुओं के बीच एक डबल लाइन द्वारा दिखाया गया है), और एक रिंग (एक लूप में जुड़े परमाणुओं की एक संख्या):

बेंजीन की अंगूठी

जैसा कि लिबरटेक्स द्वारा परिभाषित किया गया है :

DoU = (2C + 2 + N - X - H) / 2

कहाँ पे:

  • C कार्बन परमाणुओं की संख्या है
  • N नाइट्रोजन परमाणुओं की संख्या है
  • X है हलोजन परमाणुओं की संख्या ( F, Cl, Br, I)
  • H हाइड्रोजन परमाणुओं की संख्या है

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

C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety. 
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input

सीएच के स्पष्टीकरण के लिए यहां देखें

संक्षेप में, आपको यह पता लगाना होगा कि यौगिक में उपरोक्त तत्व (C, H, N, F, Cl, Br, I) में से कोई भी है या नहीं और कितने हैं। फिर, उपरोक्त सूत्र का उपयोग करके अनसैचुरेशन की डिग्री की गणना करें।

केवल C, H, N, F, Cl, Br और I DoU फॉर्मूला के लिए मान्य इनपुट हैं। इस पहेली के प्रयोजनों के लिए, किसी भी अन्य तत्वों को पूरी तरह से नजरअंदाज किया जा सकता है (उदाहरण के लिए यदि कंपाउंड C6H6Mn था तो परिणाम अभी भी 4 होगा)। यदि उपरोक्त यौगिकों में से कोई भी नहीं है, तो उत्तर शून्य होगा।

आप मान सकते हैं कि सभी यौगिक इनपुट रासायनिक रूप से संभव हैं, इनमें कम से कम एक परमाणु कार्बन होता है, और इसका अस्तित्व ज्ञात है। यदि इनपुट अमान्य है, तो प्रोग्राम 0 या -1 आउटपुट कर सकता है, या कोई परिणाम नहीं दे सकता है।

नियम

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


प्रस्तावित परीक्षण मामले: सोडियम ऑक्साइड: Na2Oऔर मिथाइलिडाइन: CHऔर CCl4He। ये कुछ कोने के मामले हैं जो कुछ समाधानों को तोड़ सकते हैं। वैसे, यह नहीं कि यह गणितज्ञ (शायद) के अलावा किसी के लिए भी मायने रखता है, लेकिन क्या हम मान सकते हैं कि यौगिक (मौजूद) हो सकते हैं?
स्टीवी ग्रिफिन

मुझे समझ नहीं आ रहा है C9H2O1 --> 0। यह 9 नहीं होना चाहिए? (2*9+2+0-0-2)/2
DL34

अंतिम पैराग्राफ के अनुसार, क्या आपका मतलब है कि कोड अमान्य इनपुट से निपटने में सक्षम होना चाहिए? वैसे, क्या यह गारंटी है कि परिसर में हर एक तत्व में C1H1 की तरह '1' अनुगामी है?
कीउ गण

@KeyuGan हाँ और हाँ।
आर्ची रोज

जवाबों:


2

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

0अमान्य इनपुट के लिए रिटर्न

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,s|=n==2,n>2?3:n],1)*s

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

वैकल्पिक संस्करण, 103 बाइट्स

यदि इनपुट को वैध होने की गारंटी दी गई है - जैसा कि चुनौती का परिचय भ्रामक रूप से सुझाव दे रहा है - हम बस कर सकते हैं:

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,n>2?3:n],1)

डेमो


2

पायथन 3 , 142 151 148 बाइट्स

import re
l=dict(re.findall("(\D+)(\d+)",input()))
m=lambda k:int(l.get(k,0))
print(m("C")and m("C")+1+(m("N")-sum(map(m,"F I H Cl Br".split())))/2)

त्रुटि पर 0 देता है।

@HyperNeutrino को धन्यवाद बाइट्स नीचे लाने के लिए।

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


उफ़ - परीक्षण के मामले अद्यतन!
आर्ची रोज


@HyperNeutrino टेस्ट के मामले थोड़े अस्पष्ट थे। अब अमान्य इनपुट पर कोई आउटपुट नहीं है।
MooseOnTheRocks


dictवहाँ का अच्छा उपयोग !
DLosc

0

पिप , 70 67 बाइट्स

`C\d`Na&1+/2*VaR+XDs._R['C'NC`H|F|I|Cl|Br`].s["+2*"'+'-]RXU.XX"+0*"

रासायनिक सूत्र को एक कमांड-लाइन तर्क के रूप में लेता है। 0अमान्य इनपुट के लिए आउटपुट । इसे ऑनलाइन आज़माएं!

व्याख्या

रासायनिक सूत्र को गणितीय सूत्र में बदलने के लिए रेगेक्स प्रतिस्थापन की एक श्रृंखला का उपयोग करता है, इसे निकालता है, और अंतिम मूल्य प्राप्त करने के लिए एक जोड़े को घुमाता है।

प्रतिस्थापन (थोड़ा ungolfed संस्करण):

aR+XDs._R"C ""+2*"R"N "'+R`(H|F|I|Cl|Br) `'-RXU.XX"+0*"

a                    Cmdline arg
 R+XD                 Replace runs of 1 or more digits (\d+)
     s._               with a callback function that prepends a space
                       (putting a space between each element and the following number)
 R"C "                Replace carbon symbol
      "+2*"            with +2* (add 2* the number of carbon atoms to the tally)
 R"N "                Replace nitrogen symbol
      '+               with + (add the number of nitrogen atoms to the tally)
 R`(H|F|I|Cl|Br) `    Replace hydrogen or halogen symbol
                  '-   with - (subtract the number of atoms from the tally)
 RXU.XX               Replace uppercase letter followed by another char ([A-Z].)
       "+0*"           with +0* (cancel out numbers of all other kinds of atoms)

हम परिणामी स्ट्रिंग को eval करते हैं V। यह हमें देता है 2C + N − X − H। सही मान प्राप्त करने के लिए, हम निम्नलिखित समायोजन करते हैं:

`C\d`Na&1+/2*V...

             V...  Value of expression calculated above
          /2*      multiplied by 1/2
        1+         plus 1
`C\d`Na            Is carbon in the original formula? (i.e. C followed by a digit)
       &           Logical AND: if no carbon, return 0, otherwise return the formula value

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.