Dessin des structures de Lewis des alcanes

17

Je viens d'avoir une leçon à l'école sur les alcanes et j'ai pensé que cela ferait probablement un grand défi de golf de code! Ne vous inquiétez pas, ce n'est pas aussi compliqué que cela puisse paraître!

Un rapide remaniement

(Veuillez noter: pour rester bref, toutes les informations ne sont pas exactes à 100%.)

Les alcanes sont des chaînes de carbone et d'hydrogène. Chaque atome de carbone a 4 liaisons et chaque atome d'hydrogène 1 liaison. Tous les atomes de carbone de l'alcane forment une chaîne où chaque atome C est connecté à 2 autres atomes C (gauche et droite dans la structure de Lewis) et 2 atomes H (haut et bas), à l'exception des extrémités de la chaîne , où l'atome C est connecté à seulement 1 autre C mais 3 H. Voici un exemple de base pour le pentane (un alcane avec 5 atomes de carbone et 12 atomes de H):

  H H H H H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Les alcanes peuvent également avoir des branches. Mais ne vous inquiétez pas, tous les alcanes de ce défi peuvent être exprimés avec un seul niveau de ramification. Exemple:

        H
        |
      H-C-H
  H H H | H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Pour relever ce défi, vous devez également comprendre la convention de dénomination IUPAC pour les alcanes ramifiés. Il y a d'abord l'alcane racine. Dans notre exemple précédent, ce serait la partie "CCCCC". Selon la longueur de cette chaîne, elle a un nom différent. 1 C est appelé méthane, 2 C éthane, 3 C propane, puis butane, pentane, hexane, heptane, octane, nonane et décane (10 C). Ensuite, pour chaque branche, il y a un certain préfixe à cela: Tout d'abord, il y a l'index (décalage) de l'atome C auquel la branche est ajoutée (compte à partir de la gauche). Dans l'exemple, ce serait 4 (c'est le 4e atome C de gauche). Ensuite, il y a un trait d'union (ce symbole: "-") et après cela un autre nom indiquant la taille de la branche. La dénomination de la taille de la branche est presque la même que celle de la taille de la racine, juste qu'au lieu de "ane" vous ajoutez "yl". Avec cela, le nom complet de l'exemple serait

4-methylpentane

Si vous avez plusieurs branches, elles sont également ajoutées au début, séparées par un autre trait d'union. Exemple:

2-butyl-5-methylhexane

Une dernière chose: si vous avez plusieurs branches de la même taille, elles sont regroupées; leurs décalages sont séparés par une virgule et ils partagent le même nom de taille, qui est ajouté par une syllabe supplémentaire en fonction du nombre de branches regroupées: "di" pour 2 branches, "tri" pour 3, "tetra" pour 4 (vous pas besoin de plus pour ce défi). Exemple:

2-ethyl-2,4,6-trimethyldecane

Pour info, cela pourrait ressembler à ceci: (atomes H omis)

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

Cheatsheet de la nomenclature

Prefixes indicating numbers:
| Num  | Prefix |
|------|--------|
| 1    | meth   |
| 2    | eth    |
| 3    | prop   |
| 4    | but    |
| 5    | pent   |
| 6    | hex    |
| 7    | hept   |
| 8    | oct    |
| 9    | non    |
| 10   | dec    |
Suffix root:   ane
Suffix branch: yl
Prefixes grouping: di, tri, tetra

Les règles

Écrivez un programme qui lit un tel nom IUPAC à partir de STDIN, des arguments de programme ou équivalent et le dessine comme une structure de lewis ASCII dans STDOUT (ou équivalent).

  • Pour plus de simplicité, vous n'avez PAS à dessiner les atomes H (sinon vous rencontrerez des problèmes d'espacement)
  • Vous n'êtes PAS autorisé à imprimer des lignes horizontales de début ou de fin vides
  • Les chaînes que vous devez analyser ne dépasseront pas 10 et le maximum de branches dans un "groupe" est limité à 4.
  • Le "décalage" maximum d'une branche est 9 (ce qui signifie que vous n'avez pas besoin d'analyser plus d'un chiffre)
  • Vos branches doivent alterner entre monter et descendre après chaque nouvelle branche. Si cet espace est déjà occupé par une autre branche avec le même décalage, vous devez le dessiner de l'autre côté de la racine. (haut-> bas, bas-> haut)
  • Sur une entrée corrompue, mal formatée ou non tirable, votre programme peut se comporter de manière non spécifiée.

C'est le code golf, le code le plus court en octets gagne!

Bon golf! :)

Thomas Oltmann
la source
Faut 4-methylpropanedire 4-methylpentane? 4-<anything>propanesemble peu probable, sauf si j'ai complètement mal compris quelque chose.
Peter Taylor
Oui tu as raison. Je l'ai édité!
Thomas Oltmann
4
La dernière molécule que vous avez est 3-3-5-7-methyldodecaneparce que la plus longue chaîne de carbone continue est longue de 12. De plus, vous avez dit que toutes les informations de la question n'étaient pas exactes, mais je pense qu'il convient de souligner que la deuxième molécule l'est 2-methylpentane, non pas 4-methylpentaneparce que vous commencez par le carbone avec la ramification la plus proche.
Arcturus du
Je sais, mais c'était exactement l'inexactitude que je réfutais. C'est juste le compromis pour le garder assez court pour un défi de golf de code! :)
Thomas Oltmann
1
1. Your branches have to alternate between going up and down after every new branch.votre exemple viole cette règle 2. Quelle est la longueur de chaîne maximale que nous devons prendre en charge (l'analyse des préfixes fera partie du défi.) Vous devez lier (ou de préférence copier) une liste de nomenclature.
Level River St

Réponses:

3

Python 2, 620 octets

import re
i=input()
s='m|e|pr|b|p|hex|h|o|n|de';d=dict(zip(s.split('|'),range(1,11)))
z=[[eval('['+a+']'),d[b]]for a,b in re.findall('(?:(\d[,\d]*).*?[\-ia]|l)('+s+')',i[:-3])]
v=z[-1][1]
l=[[0,0]for _ in range(v)]
c=0
for a,b in sorted([(i,b)for a,b in z[:-1]for i in a]):l[a-1][c]=b;c=~c
m=[max(x) for x in zip(*l)]
L,R=[[[' 'for _ in '_'*2*i]for _ in '_'*(2*v+1)]for i in m]
c=[' |'*v+' ']
C=c+['-C'*v+'-']+c
for i in range(len(l)):
 X=L;q=2*i+1
 for a in l[i]:
  if a>0:
   for j in range(0,2*a,2):
    X[q][j]='C'
    X[q-1][j]=X[q+1][j]='-'
    X[q][j+1]='|'
  X=R
for l in zip(*L)[::-1]+C+zip(*R):print ''.join(l)

Explication

Contribution: '2-ethyl-2,4,6-trimethyldecane'

Première analyse de la chaîne avec l'expression régulière (le dernier groupe est root):

[[[2], 2], [[2, 4, 6], 1], [[], 10]]

Chaque branche est écrite dans un tableau de longueur len(root)(l'alternance haut / bas est gérée ici):

[[0, 0], [1, 2], [0, 0], [1, 0], [0, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0]]

Les branches de chaîne 'Left' et 'Right' ( L,R) et 'root' ( C) sont initialisées.

Chaque branche est ensuite ajoutée à la branche 'string' correspondante (grosse boucle).

Les deux côtés et le centre sont imprimés à la fin:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
la source