Ionische Verbindungen benennen


8

Eine ionische Verbindung heißt wie folgt : (metal name) (non-metal suffixed with -ide). Hier ist eine Liste aller Suffixe, die ersetzt werden müssen durch -ide:

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

Die Anzahl der Atome jedes Elements in der Verbindung wird bei der Benennung ionischer Verbindungen nicht verwendet. Ignorieren Sie die Regeln für die Benennung multivalenter Metalle.

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

Eine Zeichenkette , die eine ionische Verbindung enthält ( NaCl, K2S, Yb2P3) wird als Eingabe gegeben werden. Es werden keine mehratomigen Ionen angegeben. Das Programm muss den Namen dieser Verbindung ausgeben.

Da niemand die Periodensystemdaten selbst kompilieren möchte, finden Sie hier eine Paste mit den Namen, Symbolen und der Frage, ob es sich um ein Metall jedes Elements handelt, in dieser Reihenfolge : (name) (symbol) (is metal?). Sie können dies in einer externen Datei speichern (die Länge der Datei wird nicht gezählt) oder Sie können die Daten in Ihrem Programm speichern (reduzieren Sie einfach die Länge dieser Zeichenfolge von dort). Möglicherweise benötigen Sie nicht alle bereitgestellten Informationen. Jedes Element wird durch eine neue Zeile getrennt.

Wie immer bei Code-Golf-Herausforderungen gewinnt der kürzeste Code.


1
Bedeutet "Ignorieren der Benennungsregeln für mehrwertige Metalle", dass das "(II)" in "Kupfer (II) chlorid" weggelassen werden kann?
PleaseStand

2
Die Spezifikation und die Beispiele widersprechen sich. Im Anschluss an den spec würden die Namen sodium chloride, potassium sulide, ytterbium phosphorideund lead telluriide.
Peter Taylor

Außerdem haben Sie das Eingabeformat nicht angegeben.
Peter Taylor

1
Dies sind nicht einmal die richtigen Regeln für die Benennung ionischer Verbindungen! Mein Chemielehrer würde das niemals gutheißen.
PhiNotPi

1
Nun, Ihre Frage scheint auf ionische Verbindungen beschränkt zu sein, die zwei Atome enthalten, aber das haben Sie nicht spezifiziert. Ionische Verbindungen bestehen aus zwei einzigartigen Arten von Ionen in einem Verhältnis, das die Verbindung neutral macht. Diese Ionen können jeweils ein Atom haben oder sie können (und sind oft) mehratomige Ionen sein. Wenn Sie das Ammoniumion (NH4 +) mit dem Sulfation (SO4 2-) mischen, erhalten Sie Ammoniumsulfat ((NH4) 2SO4). Ich denke, mein Hauptpunkt ist, dass Sie eine ganze Klasse ionischer Verbindungen vergessen, selbst wenn Sie mehrwertige Metallnamen ausschließen.
PhiNotPi

Antworten:


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

Verwendet eine Einfügung des Elementtextes, den ich in der Partitur nicht gezählt habe. Ich entferne das Metalletikett (da ich davon ausgehe, dass die Verbindungen immer zuerst mit dem Metall angegeben werden, also brauche ich es eigentlich nicht) und erstelle damit ein Wörterbuch. Ich identifiziere den Teil, der durch "ide" ersetzt werden soll, indem ich das Ende der Zeichenfolge auf drei Buchstaben überprüfe, die mit beginnen i, vier Buchstaben, die mit enden gen, oder auf andere Weise nur die letzten beiden Zeichen.


Was macht es zum Beispiel aus Chlor und Phosphor?
Graham

NaCl => Natriumchlorid (entspricht Spezifikation). Yb2P3 => Ytterbiumphosphorid (entspricht nicht der aktuellen Spezifikation). Es macht Stickstoff auch eher als Nitrogid als als als Nitrid. Jetzt, da der "Silbenteil" der Spezifikation weg ist, muss ich wahrscheinlich Ihre fest codierte Liste stehlen.
Histokrat

Okay, sollte die Spezifikation wieder erfüllen.
Histokrat

1

Python, 134 Zeichen.

#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"""

0

APL 142 150

Wenn ich die Elementnamen und Symbole in einem Paar verschachtelter Arrays im APL-Arbeitsbereich speichern darf, sollte der folgende Code dies tun:

(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'

Es funktioniert ungefähr wie folgt:

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

Übernimmt die Eingabe vom Bildschirm über ⍞ und teilt den chemischen Namen in Symbole auf und verwirft alle Zahlen

e [s⍳c [1]]

Sucht den ersten Elementnamen anhand seines Symbols. Ähnliches gilt für c [2]

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

Identifiziert, welche der acht möglichen Enden das Nichtmetall hat, lässt es fallen und ersetzt es dann durch ide via:

,'ide'

Es gibt keine Fehlerbehebung, daher funktioniert dies nur für gültige Verbindungen, die über die Kennung Eins oder Null in der Liste der bereitgestellten Elemente diktiert werden.


funktioniert oxygen -> oxideoder hydrogen -> hydridefunktioniert?
Beary605

@ beary605. Sie haben es nicht getan, aber sie tun es jetzt - danke.
Graham

0

Mathematica 252 267 254

Code

ElementData[]enthält Informationen zu den Elementen; es ist in Mathematica beheimatet.

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"] }]

Beispiele

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

Verbindungen


Erläuterung

Der Code entfernt Ziffern aus der Verbindung und trennt die Elemente durch ihre abgekürzten Namen. Anschließend werden die Abkürzungen in die Standardnamen der Elemente konvertiert. Schließlich wird das Nichtmetall durch den Begriff durch das richtige Suffix ersetzt.


Sie brauchen die mehrwertigen Metalle in der Ausgabe nicht für PbTe2, lead telluridewird ausreichen.
Beary605
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.