Penamaan senyawa ionik

8

Senyawa ionik bernama seperti: (metal name) (non-metal suffixed with -ide). Berikut adalah daftar semua sufiks yang perlu diganti -ide:

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

Jumlah atom dari setiap elemen dalam senyawa tidak digunakan dalam penamaan senyawa ionik. Abaikan aturan penamaan logam multivalen.

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

String yang berisi senyawa ionik ( NaCl, K2S, Yb2P3) akan diberikan sebagai masukan. Tidak ada ion poliatomik yang akan diberikan. Program harus menampilkan nama senyawa ini.

Sejak tak seorang pun ingin mengkompilasi tabel periodik data diri, di sini adalah pasta yang memiliki nama, simbol, dan apakah atau tidak itu adalah logam dari setiap elemen, dalam urutan ini: (name) (symbol) (is metal?). Anda dapat menyimpan ini ke file eksternal (panjang file tidak akan dihitung), atau Anda dapat menyimpan data dalam program Anda (cukup diskon panjang string itu dari sana.) Anda mungkin tidak memerlukan semua informasi yang disediakan. Setiap elemen dipisahkan oleh baris baru.

Seperti biasa dengan tantangan kode golf, kode terpendek menang.

beary605
sumber
1
Apakah "Abaikan aturan penamaan untuk logam multivalen" berarti tidak masalah untuk menghilangkan "(II)" dalam "tembaga (II) klorida"?
PleaseStand
2
Spesifikasi dan contohnya bertentangan. Berikut spec, nama-nama akan sodium chloride, potassium sulide, ytterbium phosphoridedan lead telluriide.
Peter Taylor
Anda juga belum menentukan format input.
Peter Taylor
1
Ini bahkan bukan aturan yang benar untuk penamaan senyawa ionik! Guru kimia saya tidak akan pernah menyetujui.
PhiNotPi
1
Nah, pertanyaan Anda tampaknya terbatas pada senyawa ionik yang mengandung dua atom, tetapi Anda tidak menentukannya. Senyawa ionik terbuat dari dua jenis ion unik, dalam rasio yang membuat senyawa netral. Ion-ion ini masing-masing dapat memiliki satu atom, atau mereka dapat (dan seringkali) adalah ion poliatomik. Jika Anda mencampurkan ion ammonium (NH4 +) dengan ion sulfat (SO4 2-), Anda akan mendapatkan ammonium sulfat ((NH4) 2SO4). Saya kira poin utama saya adalah bahwa Anda lupa tentang seluruh kelas senyawa ionik, bahkan ketika tidak termasuk nama logam multivalen.
PhiNotPi

Jawaban:

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

Menggunakan tempel teks elemen yang belum saya hitung dalam skor. Saya menghapus tag logam (karena saya berasumsi senyawa selalu diberikan dengan logam terlebih dahulu, jadi saya tidak benar-benar membutuhkannya) dan membangun kamus dengan itu. Saya mengidentifikasi bagian yang akan diganti dengan "ide" dengan memeriksa ujung string untuk tiga huruf dimulai dengan i, empat huruf berakhir dengan gen, atau hanya dua karakter terakhir.

histokrat
sumber
Apa yang membuat klorin dan fosfor misalnya?
Graham
NaCl => Sodium Chloride (memenuhi spesifikasi). Yb2P3 => Ytterbium Phosphoride (tidak memenuhi spesifikasi saat ini). Ini juga menjadikan Nitrogen sebagai Nitrogide daripada Nitride. Sekarang bagian "suku kata" dari spec telah hilang, saya mungkin harus mencuri daftar hardcoded Anda.
histokrat
Oke, harus memenuhi spesifikasi lagi.
histokrat
1

Python, 134 Karakter.

#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"""
Royalti yang Dicuri
sumber
0

APL 142 150

Jika saya diizinkan untuk menyimpan nama elemen dan simbol dalam sepasang array bersarang di dalam ruang kerja APL maka kode berikut harus melakukannya:

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

Ini kira-kira berfungsi sebagai berikut:

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

Mengambil input dari layar melalui ⍞ dan membelah nama kimia menjadi simbol dan membuang angka apa pun

e [s⍳c [1]]

Mencari nama elemen pertama dari simbolnya. Demikian pula untuk c [2]

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

Identifikasi mana dari delapan kemungkinan ujung yang non-logam miliki dan jatuhkan dan ganti dengan ide melalui:

,'ide'

Tidak ada jebakan kesalahan sehingga hanya berfungsi untuk senyawa yang valid yang ditentukan melalui pengidentifikasi satu atau nol dalam daftar elemen yang disediakan.

Graham
sumber
apakah oxygen -> oxideatau hydrogen -> hydridebekerja?
beary605
@ beary605. Mereka tidak tetapi mereka lakukan sekarang - terima kasih.
Graham
0

Mathematica 252 267 254

Kode

ElementData[]berisi informasi tentang elemen; ini asli untuk 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"] }]

Contohnya

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

senyawa


Penjelasan

Kode menghilangkan digit dari kompon, lalu memisahkan elemen dengan nama singkatannya. Kemudian mengkonversi singkatan ke nama standar elemen. Akhirnya, itu menggantikan non-logam dengan istilah dengan akhiran yang benar.

DavidC
sumber
Anda tidak perlu logam multivalen dalam output untuk PbTe2, lead telluridesudah cukup.
beary605