(¡No soy químico! Podría estar equivocado en algunas cosas, estoy escribiendo lo que aprendí en la escuela secundaria)
Los átomos de carbono tienen un atributo especial: se pueden unir a otros 4 átomos (que no es tan especial) y se mantienen estables incluso en cadenas largas, lo cual es muy singular. Debido a que se pueden encadenar y combinar de muchas maneras diferentes, necesitamos algún tipo de convención de nomenclatura para nombrarlos.
Esta es la molécula más pequeña que podemos hacer:
CH4
Se llama metano. Se compone de un solo carbono y 4 átomos de hidrógeno. El siguiente es:
CH3 - CH3
Esto se llama etano. Está formado por 2 átomos de carbono y 6 de hidrógeno.
Los siguientes 2 son:
CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3
Son propano y butano. Los problemas comienzan con las cadenas con 4 átomos de carbono, ya que se pueden construir de 2 maneras diferentes. Uno se muestra arriba y el otro es:
CH3 - CH - CH3
|
CH3
Obviamente, esto no es lo mismo que el otro. El número de átomos y las uniones son diferentes. ¡Por supuesto, simplemente doblar las uniones y rotar la molécula no la hará diferente! Así que esto:
CH3 - CH2 - CH2 - CH3
Y esto:
CH3 - CH2
|
CH3 - CH2
Son lo mismo (si te gusta la teoría de grafos, puedes decir que si hay isomorfismo entre 2 moléculas; son lo mismo). De ahora en adelante no escribiré átomos de hidrógeno ya que no son esenciales para este desafío.
Como odias la química orgánica y tienes muchos átomos de carbono diferentes para nombrar, decides escribir un programa que haga esto por ti. No tienes demasiado espacio en tu disco duro, por lo que el programa debe ser lo más pequeño posible.
El reto
Escriba un programa que tome un texto de varias líneas como entrada (una cadena de carbono) y genere el nombre de la cadena de carbono. La entrada solo contendrá espacios, letras mayúsculas 'c' y '|' y '-' que representa un enlace. ¡La cadena de entrada nunca contendrá ciclos! Ejemplo:
Entrada:
C-C-C-C-C-C
| |
C C-C
Salida:
4-etil-2-metilhexano
Cualquier salida es aceptable siempre que sea legible por humanos y esencialmente igual (por lo que puede usar diferentes separadores, por ejemplo, si lo desea).
La convención de nomenclatura:
(Ver: reglas de IUPAC )
Identifica la cadena de carbono más larga. Esta cadena se llama la cadena principal.
Identifique todos los sustituyentes (grupos anexos de la cadena principal).
Numere los carbonos de la cadena principal desde el extremo que les da a los sustituyentes los números más bajos. Al comparar una serie de números, la serie que es la "más baja" es la que contiene el número más bajo en la primera diferencia. Si dos o más cadenas laterales se encuentran en posiciones equivalentes, asigne el número más bajo al que aparezca primero en el nombre.
Si se produce el mismo sustituyente más de una vez, se proporciona la ubicación de cada punto en el que se produce el sustituyente. Además, el número de veces que se produce el grupo sustituyente se indica mediante un prefijo (di, tri, tetra, etc.).
Si hay dos o más sustituyentes diferentes, se enumeran en orden alfabético utilizando el nombre base (ignore los prefijos). El único prefijo que se utiliza al colocar los sustituyentes en orden alfabético es iso como en isopropilo o isobutilo. Los prefijos sec y tert no se usan para determinar el orden alfabético, excepto cuando se comparan entre sí.
Si las cadenas de igual longitud compiten por la selección como la cadena principal, entonces la elección va en serie a:
- La cadena que tiene el mayor número de cadenas laterales.
- la cadena cuyos sustituyentes tienen los números más bajos.
- La cadena tiene el mayor número de átomos de carbono en la cadena lateral más pequeña.
- la cadena tiene las cadenas laterales menos ramificadas (un gráfico que tiene el menor número de hojas).
Para la cadena principal, el nombre es:
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
Ninguna cadena será más larga que 12, por lo que será suficiente. Para las subcadenas es lo mismo pero en lugar de 'ane' al final tenemos 'yl'.
Puede suponer que los C
s están en las columnas impares y los enlaces ( |
y los -
caracteres) tienen 1 longitud entre los átomos de carbono.
Casos de prueba:
Entrada:
C-C-C-C
Salida:
butano
Entrada:
C-C-C
|
C
Salida:
2-metilpropano
Entrada:
C-C-C-C
|
C
|
C-C
Salida:
3-metilhexano
Entrada:
C-C-C-C-C
|
C
|
C
Salida:
3-metilhexano
Entrada:
C
|
C
|
C-C-C-C
|
C-C-C
|
C-C
Salida:
3,4-dimetil-5-etilheptano
Editar: Perdón por los ejemplos equivocados. No era un buen estudiante :(. Deberían arreglarse ahora.
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.).
¿no debería llamarse el último ejemplo 3,4- di metil-5-etilheptano? (recién estamos comenzando la química orgánica, podría estar equivocado: P)Respuestas:
Python 2 ,
187618711870185918461830182619001932191318471833163516131596 bytesPruébalo en línea!
Bueno, allá vas. Ciertamente no es el más golfista pero funciona (espero): D
Me llevó unas 10 horas, tal vez? Probablemente mi golf más largo tanto en tamaño como en tiempo, y eso dice algo considerando que solía usar Java D:
Lógica:
EDITAR : Se corrigió el error donde solía causar errores si no había cadenas laterales.
EDITAR : Gracias a MD XF por notar algunos espacios adicionales (sangría para el bucle for).
EDITAR : Olvidé por completo el prefijo para tener el mismo sustituyente.
NOTA : cada línea debe tener el mismo ancho para que esto funcione. Es decir, se requieren espacios finales.
Dato curioso: la mayoría de los hidrocarburos cíclicos se determinarán como "metano"
Dato curioso: Si lo hace
C-C-...-C-C
con 13 Cs, se le daráethane
, a continuación,thane
para el 14,ropane
15, etc.-79 bytes gracias a Jonathan Frech
-119 bytes gracias a NieDzejkob
-17 bytes gracias a ovs
fuente