Nombrar compuestos iónicos

8

Un compuesto iónico se nombra así: (metal name) (non-metal suffixed with -ide). Aquí hay una lista de todos los sufijos que deben ser reemplazados por -ide:

-on -ogen -ygen -ine -orus -ur -ic -ium

El número de átomos de cada elemento en el compuesto no se usa para nombrar compuestos iónicos. Ignora las reglas de nombres de metales multivalentes.

NaCl -> sodium + chlorine -> sodium chloride.
K2S -> potassium + sulphur -> potassium sulphide (or sulfide).
Yb2P3 -> ytterbium + phosphorus -> ytterbium phosphide.
PbTe2 -> lead + tellurium -> lead telluride.

Una cadena que contiene un compuesto iónico ( NaCl, K2S, Yb2P3) se le dará como entrada. No se darán iones poliatómicos. El programa tiene que generar el nombre de este compuesto.

Puesto que nadie quiere recopilar los datos de tabla periódica sí mismos, aquí es una pasta que tiene los nombres, símbolos, y si es o no es un metal de cada elemento, en este orden: (name) (symbol) (is metal?). Puede guardar esto en un archivo externo (no se contará la longitud del archivo), o puede almacenar los datos dentro de su programa (simplemente descontar la longitud de esa cadena desde allí). Es posible que no necesite toda la información proporcionada. Cada elemento está separado por una nueva línea.

Como siempre con los desafíos de código de golf, gana el código más corto.

beary605
fuente
1
¿"Ignorar las reglas de nomenclatura para metales multivalentes" significa que está bien omitir el "(II)" en "cloruro de cobre (II)"?
favor
2
La especificación y los ejemplos se contradicen. Después de la especificación, los nombres serían sodium chloride, potassium sulide, ytterbium phosphoridey lead telluriide.
Peter Taylor
Además, no ha especificado el formato de entrada.
Peter Taylor
1
¡Estas ni siquiera son las reglas correctas para nombrar compuestos iónicos! Mi profesor de química nunca lo aprobaría.
PhiNotPi
1
Bueno, su pregunta parece estar limitada a compuestos iónicos que contienen dos átomos, pero no especificó eso. Los compuestos iónicos están hechos de dos tipos únicos de iones, en una proporción que hace que el compuesto sea neutro. Estos iones pueden tener un átomo cada uno, o pueden ser (y a menudo son) iones poliatómicos. Si mezclas el ion amonio (NH4 +) con el ion sulfato (SO4 2-), obtienes sulfato de amonio ((NH4) 2SO4). Supongo que mi punto principal es que te estás olvidando de toda una clase de compuestos iónicos, incluso al excluir nombres de metales multivalentes.
PhiNotPi

Respuestas:

1

Rubí, 114

f,s=$*[0].split /\d*(?=[A-Z]|\Z)/
puts (n=Hash[*<<X.split-%w[0 1]].invert)[f]+" "+n[s].sub(/(i..|.gen|..)\Z/,"ide")
Hydrogen H 0
Helium He 0
Lithium Li 1
Beryllium Be 1
Boron B 0
Carbon C 0
Nitrogen N 0
Oxygen O 0
Fluorine F 0
Neon Ne 0
Sodium Na 1
Magnesium Mg 1
Aluminium Al 1
Silicon Si 0
Phosphorus P 0
Sulfur S 0
Chlorine Cl 0
Argon Ar 0
Potassium K 1
Calcium Ca 1
Scandium Sc 1
Titanium Ti 1
Vanadium V 1
Chromium Cr 1
Manganese Mn 1
Iron Fe 1
Cobalt Co 1
Nickel Ni 1
Copper Cu 1
Zinc Zn 1
Gallium Ga 1
Germanium Ge 1
Arsenic As 0
Selenium Se 0
Bromine Br 0
Krypton Kr 0
Rubidium Rb 1
X

Utiliza una pasta del texto del elemento que no he contado en la partitura. Quito la etiqueta de metal (dado que supongo que los compuestos siempre se dan primero con el metal, por lo que en realidad no lo necesito) y construyo un diccionario con él. Identifico la parte a reemplazar con "ide" comprobando el final de la cadena para tres letras que comienzan con i, cuatro letras que terminan con gen, o de lo contrario solo los dos últimos caracteres.

histocrat
fuente
¿Qué hace el cloro y el fósforo, por ejemplo?
Graham
NaCl => Cloruro de sodio (cumple con las especificaciones). Yb2P3 => Fosforuro de iterbio (no cumple con las especificaciones actuales). También representa Nitrógeno como Nitrogida en lugar de Nitruro. Ahora que la parte de "sílaba" de la especificación ha desaparecido, probablemente tendré que robar su lista codificada.
histocrat
De acuerdo, debería cumplir con las especificaciones nuevamente.
histocrat
1

Python, 134 personajes.

#T is a string containing the provided information on the elements
from re import*
print sub('(orus|[oy]ge|i?..)$','ide',' '.join(split(r'(\w+) %s '%e,T)[1]for e in findall('[A-Z][a-z]?',raw_input())))

T = """Hydrogen H 0
Helium He 0
Lithium Li 1
Beryllium Be 1
Boron B 0
Carbon C 0
Nitrogen N 0
Oxygen O 0
Fluorine F 0
Neon Ne 0
Sodium Na 1
Magnesium Mg 1
Aluminium Al 1
Silicon Si 0
Phosphorus P 0
Sulfur S 0
Chlorine Cl 0
Argon Ar 0
Potassium K 1
Calcium Ca 1
Scandium Sc 1
Titanium Ti 1
Vanadium V 1
Chromium Cr 1
Manganese Mn 1
Iron Fe 1
Cobalt Co 1
Nickel Ni 1
Copper Cu 1
Zinc Zn 1
Gallium Ga 1
Germanium Ge 1
Arsenic As 0
Selenium Se 0
Bromine Br 0
Krypton Kr 0
Rubidium Rb 1
Strontium Sr 1
Yttrium Y 1
Zirconium Zr 1
Niobium Nb  1
Molybdenum Mo 1
Technetium Tc 1
Ruthenium Ru 1
Rhodium Rh 1
Palladium Pd 1
Silver Ag 1
Cadmium Cd 1
Indium In 1
Tin Sn 1
Antimony Sb 1
Tellurium Te 0
Iodine I 0
Xenon Xe 0
Cesium Cs 1
Barium Ba 1
Lanthanum La 1
Cerium Ce 1
Praseodymium Pr 1
Neodymium Nd 1
Promethium Pm 1
Samarium Sm 1
Europium Eu 1
Gadolinium Gd 1
Terbium Tb 1
Dysprosium Dy 1
Holmium Ho 1
Erbium Er 1
Thulium Tm 1
Ytterbium Yb 1
Lutetium Lu 1
Hafnium Hf 1
Tantalum Ta 1
Tungsten W 1
Rhenium Re 1
Osmium Os 1
Iridium Ir 1
Platinum Pt 1
Gold Au 1
Mercury Hg 1
Thallium Tl 1
Lead Pb 1
Bismuth Bi 1
Polonium Po 1
Astatine At 0
Radon Rn 0
Francium Fr 1
Radium Ra 1
Actinium Ac 1
Thorium Th 1
Protactinium Pa 1
Uranium U 1
Neptunium Np 1
Plutonium Pu 1
Americium Am 1
Curium Cm 1
Berkelium Bk 1
Californium Cf 1
Einsteinium Es 1
Fermium Fm 1
Mendelevium Md 1
Nobelium No 1
Lawrencium Lr 1
Rutherfordium Rf 1
Dubnium Db 1
Seaborgium Sg 1
Bohrium Bh 1
Hassium Hs 1
Meitnerium Mt 1
Darmstadtium Ds 1
Roentgenium Rg 1
Copernicium Cp 1
Ununtrium Uut 0
Flerovium Fl 0
Ununpentium Uup 0
Livermorium Lv 0
Ununseptium Uus 0
Ununoctium Uuo 0"""
Nolen Royalty
fuente
0

APL 142 150

Si se me permite almacenar los nombres y símbolos de elementos en un par de matrices anidadas dentro del espacio de trabajo APL, entonces el siguiente código debería hacerlo:

(e[s⍳c[1]]),((∊¯1×((+/¨⍳¨i)=+/¨(¯1×i)↑¨t⍳¨⊂n)/i←⍴¨t←'ic' 'on' 'ur' 'ine' 'ium' 'ogen' 'ygen' 'orus')↓n←∊e[s⍳(c←(98>⎕av⍳c)⎕penclose c←⍞~⍕⍳9)[2]]),'ide'

Funciona aproximadamente de la siguiente manera:

c←(98>⎕av⍳c)⎕penclose c←⍞~⍕⍳9

Toma la entrada de la pantalla a través de ⍞ y divide el nombre químico en símbolos y descarta cualquier número

e [s⍳c [1]]

Busca el primer nombre del elemento a partir de su símbolo. Del mismo modo para c [2]

(∊¯1×((+/¨⍳¨i)=+/¨(¯1×i)↑¨t⍳¨⊂n)/i←⍴¨t←'ic' 'on' 'ur' 'ine' 'ium' 'ogen' 'ygen' 'orus')↓n

Identifica cuál de las ocho posibles terminaciones tiene el no metal y lo suelta y luego lo reemplaza con ide a través de:

,'ide'

No hay captura de errores, por lo que solo funciona para compuestos válidos dictados a través del identificador de uno o cero en la lista de elementos proporcionados.

Graham
fuente
hace oxygen -> oxideo hydrogen -> hydridetrabaja?
beary605
@ beary605. No lo hicieron pero lo hacen ahora, gracias.
Graham
0

Mathematica 252 267 254

Código

ElementData[]contiene información sobre los elementos; Es nativo de Mathematica.

d=ElementData; a=Reverse@SortBy[d[#,"Abbreviation"]&/@d[],StringLength[#]&];
g[e_]:=Row[{e," \[RightArrow] ", p=Row[z=(d[#,"StandardName"] &/@StringCases[e,a]),
  " + " ] , " \[RightArrow] ",p[[1,1]]<> " "<>StringReplace[p[[1,2]],
  f__~~z:"on"|"ogen"|"ygen"|"ine"|"orus"|"ur"|"ic"|"ium":> f~~"ide"] }]

Ejemplos

g["NaCl"]
g["K2S"]
g["Yb2P3"]
g["PbTe2"]

compuestos


Explicación

El código elimina los dígitos del compuesto, luego separa los elementos por sus nombres abreviados. Luego convierte las abreviaturas a los nombres estándar de los elementos. Finalmente, reemplaza el no metal por el término con el sufijo correcto.

DavidC
fuente
No necesita los metales multivalentes en la salida para PbTe2, lead tellurideserá suficiente.
beary605