(Je ne suis pas chimiste! Je peux me tromper sur certaines choses, j'écris ce que j'ai appris au lycée)
Les atomes de carbone ont un attribut spécial: ils peuvent se lier à 4 autres atomes (ce qui n'est pas si spécial) et ils restent stables même en longues chaînes, ce qui est très unique. Parce qu'ils peuvent être enchaînés et combinés de différentes manières, nous avons besoin d'une sorte de convention de dénomination pour les nommer.
Il s'agit de la plus petite molécule que nous puissions fabriquer:
CH4
Ça s'appelle du méthane. Il se compose d'un seul carbone et de 4 atomes d'hydrogène. Le suivant est:
CH3 - CH3
C'est ce qu'on appelle l'éthane. Il est composé de 2 atomes de carbone et 6 atomes d'hydrogène.
Les 2 suivants sont:
CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3
Ce sont le propane et le butane. Les problèmes commencent avec les chaînes à 4 atomes de carbone, car il peut être construit de 2 manières différentes. L'un est illustré ci-dessus et l'autre est:
CH3 - CH - CH3
|
CH3
Ce n'est évidemment pas la même chose que l'autre. Le nombre d'atomes et les liaisons sont différents. Bien sûr, le simple fait de plier les fixations et de faire tourner la molécule ne la rendra pas différente! Donc ça:
CH3 - CH2 - CH2 - CH3
Et ça:
CH3 - CH2
|
CH3 - CH2
Sont les mêmes (si vous êtes dans la théorie des graphes, vous pouvez dire que s'il y a isomorphisme entre 2 molécules; ce sont les mêmes). Désormais, je n'écrirai plus les atomes d'hydrogène car ils ne sont pas indispensables à ce challenge.
Comme vous détestez la chimie organique et que vous avez beaucoup d'atomes de carbone différents à nommer, vous décidez d'écrire un programme qui le fait pour vous. Vous n'avez pas trop d'espace sur votre disque dur, donc le programme doit être aussi petit que possible.
Le défi
Écrivez un programme qui prend un texte sur plusieurs lignes en entrée (une chaîne de carbone) et sort le nom de la chaîne de carbone. L'entrée ne contiendra que des espaces, des caractères «c» majuscules et «|» et «-» qui représente une liaison. La chaîne d'entrée ne contiendra jamais de cycles! Exemple:
Contribution:
C-C-C-C-C-C
| |
C C-C
Sortie:
4-éthyl-2-méthylhexane
Toute sortie est acceptable tant qu'elle est lisible par l'homme et essentiellement la même (vous pouvez donc utiliser différents séparateurs par exemple si vous le souhaitez).
La convention de dénomination:
(Voir: Règles IUPAC )
Identifiez la chaîne de carbone la plus longue. Cette chaîne est appelée la chaîne parente.
Identifiez tous les substituants (groupes issus de la chaîne parente).
Numérotez les carbones de la chaîne parente de l'extrémité qui donne aux substituants les nombres les plus bas. Lorsque l'on compare une série de nombres, la série qui est la "plus basse" est celle qui contient le plus petit nombre à l'occasion de la première différence. Si deux chaînes latérales ou plus sont dans des positions équivalentes, attribuez le numéro le plus bas à celui qui viendra en premier dans le nom.
Si le même substituant apparaît plus d'une fois, l'emplacement de chaque point sur lequel le substituant apparaît est donné. De plus, le nombre de fois où le groupe substituant apparaît est indiqué par un préfixe (di, tri, tétra, etc.).
S'il existe deux ou plusieurs substituants différents, ils sont répertoriés par ordre alphabétique en utilisant le nom de la base (ignorez les préfixes). Le seul préfixe utilisé lors de la mise en ordre alphabétique des substituants est l'iso comme l'isopropyle ou l'isobutyle. Les préfixes sec- et tert- ne sont pas utilisés pour déterminer l'ordre alphabétique, sauf lorsqu'ils sont comparés les uns aux autres.
Si des chaînes de longueur égale sont en compétition pour la sélection en tant que chaîne parente, le choix se fait en série pour:
- la chaîne qui a le plus grand nombre de chaînes latérales.
- la chaîne dont les substituants ont le plus petit nombre.
- la chaîne ayant le plus grand nombre d'atomes de carbone dans la plus petite chaîne latérale.
- la chaîne ayant les chaînes latérales les moins ramifiées (un graphique ayant le moins de feuilles).
Pour la chaîne parente, la dénomination est:
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
Aucune chaîne ne dépassera 12, ce sera donc suffisant. Pour les sous-chaînes, c'est la même chose, mais au lieu de «ane» à la fin, nous avons «yl».
Vous pouvez supposer que les C
s sont dans les colonnes impaires et que les liaisons ( |
et les -
caractères) sont longues de 1 entre les atomes de carbone.
Cas de test:
Contribution:
C-C-C-C
Sortie:
butane
Contribution:
C-C-C
|
C
Sortie:
2-méthylpropane
Contribution:
C-C-C-C
|
C
|
C-C
Sortie:
3-méthylhexane
Contribution:
C-C-C-C-C
|
C
|
C
Sortie:
3-méthylhexane
Contribution:
C
|
C
|
C-C-C-C
|
C-C-C
|
C-C
Sortie:
3,4-diméthyl-5-éthylheptane
Edit: Désolé pour les mauvais exemples. Je n'étais pas un bon élève :(. Ils devraient être corrigés maintenant.
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.).
le dernier exemple ne devrait-il pas être appelé 3,4- di méthyl-5-éthylheptane? (nous commençons à peine la chimie organique, je me trompe peut-être: P)Réponses:
Python 2 ,
187618711870185918461830182619001932191318471833163516131596 octetsEssayez-le en ligne!
Et bien voilà. Certainement pas le plus golfique mais ça marche (j'espère): D
Ça m'a pris environ 10 heures, peut-être? Probablement mon plus long golf en taille et en temps, et cela veut dire quelque chose étant donné que j'utilisais Java D:
Logique:
EDIT : correction d'un bug qui causait des erreurs s'il n'y avait pas de chaînes latérales.
EDIT : Merci à MD XF d'avoir remarqué quelques espaces supplémentaires (indentation pour la boucle for).
EDIT : J'ai complètement oublié le préfixe pour avoir le même substituant.
REMARQUE : chaque ligne doit avoir la même largeur pour que cela fonctionne. Autrement dit, des espaces de fin sont requis.
Fait amusant: la plupart des hydrocarbures cycliques seront déterminés comme du «méthane»
Fait amusant: si vous le faites
C-C-...-C-C
avec 13 C, cela donneraethane
, puisthane
pour 14,ropane
pour 15, etc.-79 octets grâce à Jonathan Frech
-119 octets grâce à NieDzejkob
-17 octets grâce aux ovs
la source