イオン性化合物の命名


8

イオン性化合物は次のように命名されます(metal name) (non-metal suffixed with -ide)。これは、置き換える必要のあるすべてのサフィックスのリストです-ide

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

化合物の各元素の原子数は、イオン性化合物の命名には使用されません。多価金属の命名規則は無視してください。

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

イオン性化合物を含む文字列(NaClK2SYb2P3)入力として与えられます。多原子イオンは与えられません。プログラムは、この化合物の名前を出力する必要があります。

誰もが、周期表のデータ自体をコンパイルしようとしないので、ここでは名前、シンボル、それは各要素の金属であるかどうかを持っているペーストは、この順序で、次のとおりです(name) (symbol) (is metal?)。これを外部ファイルに保存するか(ファイルの長さはカウントされません)、またはプログラム内にデータを保存できます(そこからその文字列の長さを割り引くだけです)。提供されたすべての情報が必要になるとは限りません。すべての要素は改行で区切られます。

コードゴルフの課題ではいつものように、最短のコードが勝ちます。


1
「多価金属の命名規則を無視する」とは、「塩化銅(II)」の「(II)」を省略してもよいということですか?
PleaseStand

2
仕様と例は矛盾しています。スペックに続いて、名前は次のようになりsodium chloridepotassium sulideytterbium phosphoridelead telluriide
Peter Taylor、

また、入力形式が指定されていません。
Peter Taylor、

1
これらは、イオン性化合物の命名に関する正しい規則でさえありません!私の化学の先生は決して承認しないでしょう。
PhiNotPi

1
さて、あなたの質問は2つの原子を含むイオン性化合物に限定されているようですが、それを指定していません。イオン化合物は、化合物を中性にする比率で、2つのユニークなタイプのイオンでできています。これらのイオンは、それぞれ1つの原子を持つことも、多原子イオンである場合もあります(多くの場合、そうです)。アンモニウムイオン(NH4 +)を硫酸イオン(SO4 2-)と混合すると、硫酸アンモニウム((NH4)2SO4)が得られます。私の主なポイントは、多価金属の名前を除外した場合でも、イオン化合物のクラス全体を忘れているということです。
PhiNotPi

回答:


1

ルビー、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

スコアでカウントしていない要素テキストの貼り付けを使用します。私は金属タグを削除し(化合物は常に金属とともに最初に与えられると想定しているため、実際には必要ありません)、それを使用して辞書を作成します。文字列の末尾でで始まる3文字i、で終わる4文字gen、または最後の2文字だけをチェックして、「ide」に置き換える部分を特定します。


それは例えば塩素とリンから何を作るのですか?
Graham

NaCl =>塩化ナトリウム(仕様を満たす)。Yb2P3 =>イッテルビウムリン(現在の仕様を満たしていません)。また、窒素を窒化物ではなくニトロギドとしてレンダリングします。仕様の「音節」の部分がなくなったので、ハードコードされたリストを盗む必要があるでしょう。
ヒストクラート

さて、再び仕様を満たす必要があります。
ヒストクラート

1

Python、134文字。

#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

要素名とシンボルをAPLワークスペース内のネストされた配列のペアに格納することが許可されている場合、次のコードでそれを実行する必要があります。

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

おおよそ次のように機能します。

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

fromを介して画面から入力を受け取り、化学名を記号に分割し、すべての数字を破棄します

e [s⍳c[1]]

シンボルから最初の要素名を検索します。同様にc [2]

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

non-metalが持つ8つの可能な終了のうちのどれかを識別し、それを削除してから、それをide viaで置き換えます。

,'ide'

エラートラップがないため、提供された要素のリストにある1または0の識別子を介して指定された有効な化合物に対してのみ機能します。


ないoxygen -> oxidehydrogen -> hydride動作しますか?
beary605 2012

@ beary605。彼らはしなかったが、今はそうしている-ありがとう。
Graham、

0

Mathematica 252 267 254

コード

ElementData[]要素に関する情報が含まれています。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"] }]

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

化合物


説明

このコードは複合語から数字を削除し、省略名で要素を区切ります。次に、省略形を要素の標準名に変換します。最後に、非金属を正しい接尾辞を持つ用語に置き換えます。


あなたは、のために出力中の多価金属を必要としないPbTe2lead telluride十分でしょう。
beary605
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.