Nomeando compostos iônicos

8

Um composto iônico é chamado assim: (metal name) (non-metal suffixed with -ide). Aqui está uma lista de todos os sufixos que precisam ser substituídos por -ide:

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

O número de átomos de cada elemento no composto não é usado para nomear compostos iônicos. Ignore as regras de nomes de metal multivalentes.

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

Uma cadeia de caracteres contendo um composto iónico ( NaCl, K2S, Yb2P3) vai ser dado como entrada. Nenhum íon poliatômico será fornecido. O programa deve exibir o nome desse composto.

Como ninguém quer compilar os dados da tabela periódica-se, aqui é uma pasta que tem o nome, símbolos e se é ou não é um metal de cada elemento, nesta ordem: (name) (symbol) (is metal?). Você pode salvar isso em um arquivo externo (o tamanho do arquivo não será contado) ou pode armazenar os dados em seu programa (basta descontar o comprimento dessa string a partir daí). Talvez você não precise de todas as informações fornecidas. Cada elemento é separado por uma nova linha.

Como sempre, com os desafios do código de golfe, o menor código vence.

beary605
fonte
1
"Ignorar as regras de nomenclatura para metais multivalentes" significa que não há problema em omitir o "(II)" no "cloreto de cobre (II)"?
PleaseStand
2
A especificação e os exemplos contradizem. Após a especificação, os nomes seriam sodium chloride, potassium sulide, ytterbium phosphoridee lead telluriide.
Peter Taylor
Além disso, você não especificou o formato de entrada.
Peter Taylor
1
Essas nem são as regras corretas para nomear compostos iônicos! Meu professor de química nunca aprovaria.
PhiNotPi
1
Bem, sua pergunta parece estar limitada a compostos iônicos que contêm dois átomos, mas você não especificou isso. Os compostos iônicos são feitos de dois tipos exclusivos de íons, numa proporção que torna o composto neutro. Esses íons podem ter um átomo cada, ou podem ser (e geralmente são) íons poliatômicos. Se você misturar o íon amônio (NH4 +) com o íon sulfato (SO4 2-), obtém sulfato de amônio ((NH4) 2SO4). Acho que meu ponto principal é que você está esquecendo toda uma classe de compostos iônicos, mesmo ao excluir nomes de metais multivalentes.
PhiNotPi

Respostas:

1

Ruby, 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

Usa uma colagem do texto do elemento que não contei na pontuação. Eu removo a etiqueta de metal (já que estou assumindo que os compostos são sempre fornecidos com o metal primeiro, então não preciso dele) e construo um dicionário com ele. Eu identifico a parte a ser substituída por "ide", verificando o final da string em busca de três letras começando com i, quatro letras terminando com gen, ou apenas os dois últimos caracteres.

histocrata
fonte
O que ele faz com cloro e fósforo, por exemplo?
Graham
NaCl => cloreto de sódio (atende às especificações). Yb2P3 => Fosforeto de itérbio (não atende às especificações atuais). Também processa nitrogênio como nitrogênio, em vez de nitreto. Agora que a parte "sílaba" da especificação se foi, provavelmente terei que roubar sua lista codificada.
histocrat
Ok, deve atender as especificações novamente.
histocrat
1

Python, 134 caracteres.

#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"""
Realeza Nolen
fonte
0

APL 142 150

Se eu tiver permissão para armazenar os nomes e símbolos dos elementos em um par de matrizes aninhadas no espaço de trabalho da APL, o seguinte código deverá fazê-lo:

(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 da seguinte maneira:

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

Pega a entrada da tela via ⍞ e divide o nome do produto químico em símbolos e descarta qualquer número

e [s⍳c [1]]

Procura o primeiro nome do elemento a partir do seu símbolo. Da mesma forma para c [2]

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

Identifica qual das oito terminações possíveis o não-metal possui e descarta e depois o substitui por ide via:

,'ide'

Não há interceptação de erro, portanto, funciona apenas para compostos válidos ditados pelo identificador de um ou zero na lista de elementos fornecidos.

Graham
fonte
faz oxygen -> oxideou hydrogen -> hydridetrabalha?
beary605
@ beary605. Eles não fizeram, mas o fazem agora - obrigado.
Graham
0

Mathematica 252 267 254

Código

ElementData[]contém informações sobre os elementos; é nativo do 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"] }]

Exemplos

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

compostos


Explicação

O código remove os dígitos do composto e separa os elementos por seus nomes abreviados. Em seguida, converte as abreviações nos nomes padrão dos elementos. Por fim, substitui o não-metal pelo termo pelo sufixo correto.

DavidC
fonte
Você não precisa dos metais multivalentes na saída para PbTe2, lead tellurideserá suficiente.
precisa