Nennen von nicht-cyclischen Kohlenstoffketten

30

(Ich bin kein Chemiker! Ich könnte mich in einigen Dingen irren, ich schreibe, was ich in der Schule gelernt habe.)

Kohlenstoffatome haben ein besonderes Merkmal: Sie können an 4 andere Atome binden (was nicht besonders ist) und sie bleiben auch in langen Ketten stabil, was sehr einzigartig ist. Da sie auf viele verschiedene Arten verkettet und kombiniert werden können, benötigen wir eine Art Namenskonvention, um sie zu benennen.

Dies ist das kleinste Molekül, das wir herstellen können:

CH4

Es heißt Methan. Es besteht nur aus einem Kohlenstoff und 4 Wasserstoffatomen. Der nächste ist:

CH3 - CH3

Dies nennt man Ethan. Es besteht aus 2 Kohlenstoff- und 6 Wasserstoffatomen.

Die nächsten 2 sind:

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

Sie sind Propan und Butan. Die Probleme beginnen bei den Ketten mit 4 Kohlenstoffatomen, da sie auf zwei verschiedene Arten aufgebaut werden können. Eines ist oben gezeigt und das andere ist:

CH3 - CH - CH3
       |
      CH3

Dies ist offensichtlich nicht dasselbe wie das andere. Die Anzahl der Atome und die Bindungen sind unterschiedlich. Nur Bindungen zu falten und das Molekül zu drehen, macht es natürlich nicht anders! Also das:

CH3 - CH2 - CH2 - CH3

Und das:

CH3 - CH2
       |
CH3 - CH2

Sind die gleichen (Wenn Sie in der Graphentheorie sind, können Sie sagen, dass wenn es Isomorphismus zwischen 2 Molekülen gibt; sie sind die gleichen). Von nun an werde ich keine Wasserstoffatome mehr aufschreiben, da diese für diese Herausforderung nicht unbedingt erforderlich sind.

Da Sie organische Chemie hassen und viele verschiedene Kohlenstoffatome zu nennen haben, beschließen Sie, ein Programm zu schreiben, das dies für Sie erledigt. Sie haben nicht zu viel Speicherplatz auf Ihrer Festplatte, daher muss das Programm so klein wie möglich sein.

Die Herausforderung

Schreiben Sie ein Programm, das einen mehrzeiligen Text als Eingabe (eine Kohlenstoffkette) und den Namen der Kohlenstoffkette ausgibt. Die Eingabe enthält nur Leerzeichen, Großbuchstaben 'c' und '|' und '-', was eine Bindung darstellt. Die Eingabekette enthält niemals Zyklen! Beispiel:

Eingang:

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

Ausgabe:

4-Ethyl-2-methylhexan

Jede Ausgabe ist akzeptabel, solange sie für den Menschen lesbar und im Wesentlichen gleich ist (Sie können also beispielsweise verschiedene Trennzeichen verwenden, wenn Sie dies wünschen).

Die Namenskonvention:

(Siehe: IUPAC-Regeln )

  1. Identifizieren Sie die längste Kohlenstoffkette. Diese Kette wird als Elternkette bezeichnet.

  2. Identifizieren Sie alle Substituenten (Gruppen, die an die Stammkette angefügt sind).

  3. Nummerieren Sie die Kohlenstoffe der Grundkette ab dem Ende, das den Substituenten die niedrigsten Zahlen verleiht. Beim Vergleich einer Reihe von Zahlen ist die "niedrigste" Reihe diejenige, die bei der ersten Differenz die niedrigste Zahl enthält. Wenn sich zwei oder mehr Seitenketten an gleichen Positionen befinden, weisen Sie derjenigen die niedrigste Nummer zu, die im Namen an erster Stelle steht.

  4. Wenn der gleiche Substituent mehr als einmal vorkommt, wird die Position jedes Punktes angegeben, an dem der Substituent vorkommt. Außerdem wird die Häufigkeit des Auftretens der Substituentengruppe durch ein Präfix (Di, Tri, Tetra usw.) angegeben.

  5. Wenn es zwei oder mehr verschiedene Substituenten gibt, werden sie in alphabetischer Reihenfolge unter Verwendung des Basisnamens aufgelistet (ignorieren Sie die Präfixe). Das einzige Präfix, das verwendet wird, wenn die Substituenten in alphabetischer Reihenfolge angeordnet werden, ist iso wie in Isopropyl oder Isobutyl. Die Präfixe sec- und tert- werden nicht zur Bestimmung der alphabetischen Reihenfolge verwendet, es sei denn, sie werden miteinander verglichen.

  6. Wenn Ketten gleicher Länge als übergeordnete Kette um die Auswahl konkurrieren, wird die Auswahl in Reihe zu Folgendem durchgeführt:

    • die Kette mit der größten Anzahl von Seitenketten.
    • die Kette, deren Substituenten die niedrigsten Zahlen haben.
    • die Kette hat die größte Anzahl von Kohlenstoffatomen in der kleinsten Seitenkette.
    • die Kette mit den am wenigsten verzweigten Seitenketten (ein Diagramm mit der geringsten Anzahl von Blättern).

Für die übergeordnete Kette lautet die Benennung:

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

Keine Kette ist länger als 12, das reicht also aus. Für die Unterketten ist es dasselbe, aber anstelle von 'ane' am Ende haben wir 'yl'.

Sie können davon ausgehen, dass sich das Cs in den ungeraden Spalten befindet und die Bindungen ( |und -Zeichen) zwischen den Kohlenstoffatomen 1 lang sind.

Testfälle:

Eingang:

C-C-C-C

Ausgabe:

Butan

Eingang:

C-C-C
  |
  C

Ausgabe:

2-Methylpropan

Eingang:

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

Ausgabe:

3-Methylhexan

Eingang:

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

Ausgabe:

3-Methylhexan

Eingang:

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

Ausgabe:

3,4-Dimethyl-5-ethylheptan

Edit: Sorry für die falschen Beispiele. Ich war kein guter Schüler :(. Sie sollten jetzt behoben werden.

Peter Lenkefi
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis
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.).Sollte das letzte Beispiel nach dieser Regel nicht 3,4- Di- methyl-5- ethylheptan heißen ? (Wir fangen gerade mit der organischen Chemie an, ich könnte mich irren: P)
NieDzejkob
@NieDzejkob Ich würde zustimmen, da es zwei Methylketten gibt.
Jonathan Frech
@NieDzejkob In der Tat behoben.
Peter Lenkefi

Antworten:

18

Python 2 , 1876 1871 1870 1859 1846 1830 1826 1900 1932 1913 1847 1833 1635 1613 1596 Bytes

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'

Probieren Sie es online!

Na siehst du. Mit Sicherheit nicht der Golfspieler, aber es funktioniert (hoffe ich): D

Hat mich vielleicht 10 Stunden gekostet? Wahrscheinlich mein längster Golf in Größe und Zeit, und das sagt etwas aus, wenn man bedenkt, dass ich früher Java D verwendet habe:

Logik:

  1. Konvertieren Sie von der ASCII-Darstellung in die grafische Darstellung, wobei jedes Kohlenstoffatom als Knoten und jede Bindung als Kante in benachbarter Form dargestellt wird.
  2. Finde alle Blätter. Das heißt, Knoten mit nur einer Bindung. Die längste Kette ist garantiert von einer zur nächsten.
  3. Finden Sie das dyadische Produkt der Blätter; das heißt, alle Paare von Randknoten. Dann nimm die Länge all dieser Ketten.
  4. Suchen Sie für jede Kette ihre Unterketten.
  5. Mach Sachen, um die richtige Kette zu finden. Wenn es Krawatten gibt, ist das eigentlich egal. Eine lustige Tatsache: Es wird immer ein Unentschieden geben, da jede Kette zweimal gezählt wird, einmal in umgekehrter Reihenfolge.
  6. Drucken Sie es richtig aus.

BEARBEITEN : Fehler behoben , durch den Fehler verursacht wurden, wenn keine Seitenketten vorhanden waren.

BEARBEITEN : Dank an MD XF für das Bemerken einiger zusätzlicher Leerzeichen (Einrückung für die for-Schleife).

EDIT : Ich habe das Präfix für den gleichen Substituenten völlig vergessen.

HINWEIS : Jede Linie muss dieselbe Breite haben, damit dies funktioniert. Das heißt, nachfolgende Leerzeichen sind erforderlich.

Unterhaltsame Tatsache: Die meisten cyclischen Kohlenwasserstoffe werden als "Methan" bestimmt.

Fun fact: Wenn du C-C-...-C-Cmit 13 Cs machst , wird es geben ethane, dann thanefür 14, ropanefür 15, etc.

-79 Bytes dank Jonathan Frech
-119 Bytes dank NieDzejkob
-17 Bytes dank Ovs

HyperNeutrino
quelle