गैर-चक्रीय कार्बन श्रृंखलाओं का नामकरण


30

(मैं एक रसायनज्ञ नहीं हूँ! मैं कुछ सामान में गलत हो सकता हूं, मैं वही लिख रहा हूं जो मैंने हाई-स्कूल में सीखा है)

कार्बन परमाणुओं की एक विशेष विशेषता है: वे 4 अन्य परमाणुओं (जो कि विशेष नहीं है) को बांध सकते हैं और वे लंबी श्रृंखलाओं में भी स्थिर रहते हैं, जो कि बहुत ही अनूठा है। क्योंकि उन्हें जंजीरों में जकड़ा जा सकता है और अलग-अलग तरीकों से जोड़ा जा सकता है, इसलिए हमें उन्हें नाम देने के लिए किसी तरह के नामकरण सम्मेलन की जरूरत है।

यह सबसे छोटा अणु है जिसे हम बना सकते हैं:

CH4

इसे मीथेन कहा जाता है। इसमें केवल एक कार्बन और 4 हाइड्रोजन परमाणु होते हैं। अगले एक है:

CH3 - CH3

इसे ईथेन कहा जाता है। यह 2 कार्बन और 6 हाइड्रोजन परमाणुओं से बना है।

अगले 2 हैं:

CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3

वे प्रोपेन और ब्यूटेन हैं। समस्याएं 4 कार्बन परमाणुओं के साथ जंजीरों से शुरू होती हैं, क्योंकि इसे 2 अलग-अलग तरीकों से बनाया जा सकता है। एक ऊपर दिखाया गया है और दूसरा है:

CH3 - CH - CH3
       |
      CH3

यह स्पष्ट रूप से अन्य के समान नहीं है। परमाणुओं की संख्या और बाइंडिंग अलग हैं। बेशक सिर्फ बाइंडिंग को मोड़ना और अणु को घुमाने से यह अलग नहीं होगा! तो यह:

CH3 - CH2 - CH2 - CH3

और इस:

CH3 - CH2
       |
CH3 - CH2

समान हैं (यदि आप ग्राफ सिद्धांत में हैं, तो आप कह सकते हैं कि यदि 2 अणुओं के बीच समरूपता है, तो वे समान हैं)। अब से मैं हाइड्रोजन परमाणुओं को नहीं लिखूंगा क्योंकि वे इस चुनौती के लिए आवश्यक नहीं हैं।

जैसा कि आप कार्बनिक रसायन विज्ञान से नफरत करते हैं और आपके पास नाम के लिए बहुत सारे कार्बन परमाणु हैं, आप एक प्रोग्राम लिखने का फैसला करते हैं जो आपके लिए ऐसा करता है। आपकी हार्ड-ड्राइव थियो पर आपके पास बहुत अधिक जगह नहीं है, इसलिए प्रोग्राम को जितना संभव हो उतना छोटा होना चाहिए।

चुनौती

एक प्रोग्राम लिखें जो बहु-पंक्ति पाठ में इनपुट (एक कार्बन श्रृंखला) के रूप में लेता है और कार्बन श्रृंखला के नाम को आउटपुट करता है। इनपुट में केवल स्थान होंगे, अपरकेस 'c' वर्ण और '' | और '-' जो एक बंधन का प्रतिनिधित्व करता है। इनपुट श्रृंखला में चक्र कभी नहीं होगा! उदाहरण:

इनपुट:

C-C-C-C-C-C
  |   |
  C   C-C

आउटपुट:

4-एथिल-2-methylhexane

कोई भी आउटपुट तब तक स्वीकार्य है जब तक वह मानव-पठनीय और अनिवार्य रूप से एक ही हो (ताकि आप चाहें तो विभिन्न विभाजकों का उपयोग कर सकते हैं)।

नामकरण सम्मेलन:

(देखें: IUPAC नियम )

  1. सबसे लंबी कार्बन श्रृंखला की पहचान करें। इस श्रृंखला को मूल श्रृंखला कहा जाता है।

  2. सभी सबस्टेशनों (मूल श्रृंखला से जुड़े समूह) को पहचानें।

  3. मूल श्रृंखला के कार्बनों को उस संख्या से अंत करें जो सबस्टिट्यूट को सबसे कम संख्या देता है। संख्याओं की श्रृंखला की तुलना करते समय, श्रृंखला जो "सबसे कम" होती है वह वह होती है जिसमें पहले अंतर के अवसर पर सबसे कम संख्या होती है। यदि दो या अधिक पक्ष श्रृंखलाएं समान स्थिति में हैं, तो सबसे कम संख्या उस व्यक्ति को असाइन करें जो पहले नाम में आएगा।

  4. यदि एक ही स्थानापन्न एक से अधिक बार होता है, तो प्रत्येक बिंदु का स्थान जिस पर घटाव होता है, दिया जाता है। इसके अलावा, स्थानापन्न समूह की संख्या जितनी बार होती है, उपसर्ग (डीआई, त्रि, टेट्रा, आदि) द्वारा इंगित की जाती है।

  5. यदि दो या अधिक अलग-अलग प्रतिस्थापन हैं, तो वे आधार नाम (उपसर्गों को अनदेखा) का उपयोग करके वर्णानुक्रम में सूचीबद्ध हैं। एकमात्र उपसर्ग जिसका उपयोग वर्णमाला के क्रम में प्रतिस्थापनों को डालते समय किया जाता है, iso के रूप में आइसोप्रोपिल या आइसोबायल में होता है। उपसर्ग सेकंड और टर्ट- का उपयोग एक दूसरे के साथ तुलना करने पर सिवाय वर्णमाला के क्रम को निर्धारित करने में नहीं किया जाता है।

  6. यदि समान लंबाई की श्रृंखलाएं मूल श्रृंखला के रूप में चयन के लिए प्रतिस्पर्धा कर रही हैं, तो चुनाव श्रृंखला में जाता है:

    • श्रृंखला जिसमें साइड चेन की सबसे बड़ी संख्या होती है।
    • श्रृंखला जिनके सबस्टिट्यूट में सबसे कम संख्या होती है।
    • सबसे छोटी श्रृंखला में कार्बन परमाणुओं की सबसे बड़ी संख्या वाली श्रृंखला।
    • श्रृंखला कम से कम शाखाओं वाली साइड चेन (एक ग्राफ जिसमें पत्तियों की संख्या सबसे कम होती है)।

मूल श्रृंखला के लिए, नामकरण है:

Number of carbons   Name
1                  methane
2                  ethane
3                  propane
4                  butane
5                  pentane
6                  hexane
7                  heptane
8                  octane
9                  nonane
10                 decane
11                 undecane
12                 dodecane

कोई भी श्रृंखला 12 से अधिक नहीं होगी, इसलिए यह पर्याप्त होगी। उप-श्रृंखलाओं के लिए यह समान है लेकिन अंत में 'ae' के बजाय हमारे पास 'yl' है।

आप मान सकते हैं कि Cएस विषम कॉलम में हैं और बाइंडिंग ( |और -वर्ण) कार्बन परमाणुओं के बीच 1 लंबे हैं।

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

इनपुट:

C-C-C-C

आउटपुट:

बुटान

इनपुट:

C-C-C
  |
  C

आउटपुट:

2-methylpropane

इनपुट:

C-C-C-C
  |
  C
  |
  C-C

आउटपुट:

3-methylhexane

इनपुट:

C-C-C-C-C
  |
  C
  |
  C

आउटपुट:

3-methylhexane

इनपुट:

    C
    |
    C
    |
C-C-C-C
  |
  C-C-C
  |
  C-C

आउटपुट:

3,4-डाइमिथाइल-5-ethylheptane

संपादित करें: गलत उदाहरणों के लिए क्षमा करें। मैं एक अच्छा छात्र नहीं था :( वे अब तय किए जाने चाहिए।


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

2
इस नियम के अनुसार If the same substituent occurs more than once, the location of each point on which the substituent occurs is given. In addition, the number of times the substituent group occurs is indicated by a prefix (di, tri, tetra, etc.)., क्या अंतिम उदाहरण को 3,4- di मिथाइल-5-एथिलहेप्टेन नहीं कहा जाना चाहिए ? (हम सिर्फ ऑर्गेनिक केमिस्ट्री शुरू कर रहे हैं, मैं गलत हो सकता हूं: P)
NieDzejkob

@NieDzejkob मैं सहमत हूँ, क्योंकि दो मिथाइल चेन हैं।
जोनाथन फ्रेच

@NieDzejkob वास्तव में, निश्चित।
पीटर लेनकेफी

जवाबों:


18

पायथन 2 , 1876 1871 1870 1859 1846 1830 1826 1900 1932 1913 1847 1833 1635 1613 1596 बाइट्स

s=input().split('\n')
W=enumerate
J=len
Y=sorted
l=J(s[0])
s=''.join(s)
S=set
M=max
A=min
p=map
f=lambda k:[(x/l,x%l)for x,V in W(s)if V==k]
g=lambda x,i,h=lambda x,i,j:x[:i]+(x[i]+j,)+x[i+1:]:[(h(q,i,-1),h(q,i,1))for q in x]
v=f('C');e=g(f('-'),1)+g(f('|'),0)
E=[V for V in v if sum(e,()).count(V)==1]
o=lambda v:[E[~E.index(v)]for E in e if v in E]
T=lambda a:lambda b:z((a,b))
Z=lambda a:p(T(a[0]),a[1])
n=lambda R:'mepbphhondudetrueeeco nothotnxptn ddh p t t'[R-1::12].strip()+(R>9)*'ec'
G=lambda K:[H[i]for i,V in W(K)if V==A(K)]
q=lambda x:[`k[0]`for k in H if k[1]==x]
B='-'.join
def z(n,c=[]):k=[x for x in S(o(n[0]))-S(c)];p=[z((j,n[1]),c+k)for j in k];return 1-~-(n[0]==n[1])*(p and A(p)or J(v))
C=[(a,b)for a in E for b in E]
a=p(z,C)
s=[(k,[E for E in v if~-z((k[0],E))+z((k[1],E))==z((k[0],k[1]))])for k in[C[x]for x,V in W(a)if V==M(a)]]
H=[]
R=0
for k,_ in s:R=M(J(_),R);_.sort(key=T(k[0]));a=sum([list(S(o(k))-S(_))for k in _],[]);H+=zip(p(lambda a:Z((a,_)).index(2),a),p(Z,[(O,[x for x in S(v)-S(_)if z((x,O),_)<J(v)])for O in a])),
X=n(R)
U=any(H)
if U:H=G([[h[0]for h in Q]for Q in H if J(Q)==M(p(J,H))]);K=[[J(Q[1])for Q in j]for j in H];H=[H[i]for i,V in W(K)if A(V)==A(sum(K,[]))];K=[J([Q[1]for Q in j if J(S(Q[1]))-J(Q[1])])for j in H];H=[[p[0]+1,n(M(p[1]))+[['isopropyl','butyl-tert','butyl-sec','isobutyl'][J(p[1])+p[1].count(3)-3],'yl'][Y(p[1])==range(1,1+M(p[1]))]]for p in G(K)[0]]
print(U and B([','.join(q(x))+'-'+'dttphhondireeeecoe itnxptnc  rtataaa  aa a '[J(q(x))-2::9].strip()+B(x.split('-')[::-1])for x in Y(list(S(zip(*H)[1])))])+X or[X,'meth']['t'==X])+'ane'

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

अच्छा तो तुम जाओ। निश्चित रूप से गोल्फ नहीं, लेकिन यह काम करता है (मुझे उम्मीद है): डी

मुझे लगभग 10 घंटे लगे, शायद? संभवतः आकार और समय दोनों में मेरा सबसे लंबा गोल्फ है, और यह कहते हुए कि मैं जावा डी का उपयोग करने के लिए कुछ विचार कर रहा हूं:

तर्क:

  1. ASCII प्रतिनिधित्व से ग्राफ प्रतिनिधित्व को प्रत्येक कार्बन परमाणु के साथ एक नोड के रूप में और प्रत्येक बंधन को आसन्न रूप में दर्शाए गए किनारे के रूप में परिवर्तित करें।
  2. सभी पत्तों का पता लगाएं; यही है, केवल एक बंधन के साथ नोड्स। सबसे लंबी श्रृंखला इनमें से एक से दूसरे में होने की गारंटी है।
  3. पत्तियों के डाइएडिक उत्पाद का पता लगाएं; यह है, एज नोड्स के सभी जोड़े। फिर, इन सभी श्रृंखलाओं की लंबाई लें।
  4. प्रत्येक श्रृंखला के लिए, उसके उपचरों को खोजें।
  5. सही चेन लेने के लिए सामान तैयार करें। यदि संबंध हैं, तो यह वास्तव में मायने नहीं रखता है। मजेदार तथ्य: हमेशा एक टाई होगी क्योंकि प्रत्येक श्रृंखला को दो बार गिना जाता है, एक बार रिवर्स में।
  6. इसे ठीक से प्रिंट करें।

संपादित करें : यदि कोई साइड चेन न हो तो फिक्स्ड बग जहां यह त्रुटियों का कारण बनता है।

संपादित करें : एमडी एक्सएफ को कुछ अतिरिक्त रिक्त स्थान (लूप के लिए इंडेंटेशन) के लिए धन्यवाद।

संपादित करें : मैं एक ही स्थानापन्न के लिए उपसर्ग के बारे में पूरी तरह से भूल गया।

नोट : प्रत्येक पंक्ति को कार्य करने के लिए समान चौड़ाई की आवश्यकता होती है। यही है, अनुगामी रिक्त स्थान की आवश्यकता होती है।

मजेदार तथ्य: अधिकांश चक्रीय हाइड्रोकार्बन को "मीथेन" के रूप में निर्धारित किया जाएगा

मजेदार तथ्य: यदि आप C-C-...-C-C13 से के साथ करते हैं ethane, तो यह thane14 के लिए, ropane15 के लिए, आदि देगा।

-79 बाइट्स की
बदौलत जोनाथन फ्रेच -119 बाइट्स की बदौलत NieDzejkob
-17 बाइट्स के लिए धन्यवाद ओट्स

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