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! :)
4-methylpropane
dire4-methylpentane
?4-<anything>propane
semble peu probable, sauf si j'ai complètement mal compris quelque chose.3-3-5-7-methyldodecane
parce 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'est2-methylpentane
, non pas4-methylpentane
parce que vous commencez par le carbone avec la ramification la plus proche.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.Réponses:
Python 2, 620 octets
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:
la source