Dalam tantangan ini, tugas Anda adalah mengambil anion dan kation, dan mengeluarkan formula kimiawi senyawa tersebut. Masukan mengikuti aturan ini:
- Mengambil dalam 2 string (dalam urutan apapun) mewakili anion dan kation, misalnya
F
,NH_4
atauAl
. - Untuk mengambil muatan dari masing-masing ion, Anda dapat memilikinya sebagai bagian dari string yang dipisahkan oleh tanda sisipan (misalnya
F^-1
) atau mengambil argumen numerik tambahan.- Catatan: Selama jenis input numerik Anda ditandatangani, maka biaya anion akan diteruskan sebagai angka negatif.
- Simbol akan selalu nyata, dan biaya akurat.
Outputnya harus mengikuti aturan berikut:
- Gunakan
_
untuk subskrip: Fe 2 O 3 akanFe_2O_3
. - Kation pertama: NaCl, bukan ClNa.
- Molekul netral: Li 2 O, bukan LiO atau LiO - .
- Koefisien serendah mungkin: Fe 2 O 3 , bukan Fe 4 O 6 .
- Tidak ada yang subskrip: NaCl, bukan Na 1 Cl 1 .
- Tidak bergeser: NH 4 OH, bukan NH 5 O.
- Tanda kurung bersyarat:
- Jangan gunakan tanda kurung pada ion atom tunggal: MgCl 2 , bukan Mg (Cl) 2 .
- Jangan gunakan tanda kurung jika hanya ada satu ion per molekul: KClO 3 , bukan K (ClO 3 ).
- LAKUKAN menggunakan tanda kurung jika ada dua atau lebih ion poliatomik: Be 3 (PO 4 ) 2 , bukan Be 3 PO 4 2 atau Be 3 P 2 O 8 .
Berikut adalah beberapa input dan output sampel tambahan:
Input Output
Fe^+3, O^-2 Fe_2O_3
Fe^+2, O^-2 FeO
H^+1, SO_4^-2 H_2SO_4
Al^+3, SO_4^-2 Al_2(SO_4)_3
NH_4^+1, SO_4^-2 (NH_4)_2SO_4
Hg_2^+2, PO_4^-3 (Hg_2)_3(PO_4)_2
NH_4^+1, OH^-1 NH_4OH
Hg_2^+2, O_2^-2 Hg_2O_2
Karena ini adalah kode-golf , jawaban tersingkat dalam byte menang.
Fe^+2, OH^-1: Fe(OH)_2
untuk ion poliatomik dengan 1 dari setiap elemen (OH^-1
).NO_3^-1
. Juga test case lain harus yang pertama dipasangkan dengan^-2
, jadi itu akan membuatnya(C(NH_2)_3)_2...
. Atau kasus di mana ion yang dibutuhkan lebih dari sekali dimulai dengan braket.Fe_4(Fe(CN)_6)_3
untuk warna biru Prusia.Jawaban:
APL (Dyalog) ,
605961 byte+2 karena biaya harus diberikan ditandatangani.
Fungsi infiks anonim. Mengambil daftar ion (anion, kation) sebagai argumen kiri dan daftar tuduhan terkait sebagai argumen benar.
Cobalah online!
{
...}∘|
berfungsi di mana⍺
argumen kiri dan⍵
besarnya argumen benar:∧/⍵
LCM dari tuduhan⍵÷⍨
bagilah biaya dengan itus←
simpan dis
(untuk s ubscripts)'_',∘⍕¨
format (stringify) dan tambahkan underbar ke masing-masing(
...)/
meniru setiap huruf dari masing-masing dengan nilai yang sesuai dari:s≠1
Apakahs
berbeda dari1
? (memberi 1 atau 0)m←
simpan dim
(untuk m ultiple)(
...),¨
tambahkan masing-masing berikut ini ke yang berikut:⍺{
...}¨m
untuk masing-masing, panggil fungsi ini dengan ion danm
sebagai argumen:⎕D,⎕A
D igits diikuti oleh huruf besar A lphabet⍺∩
persimpangan ion dan itu≢
menghitung jumlah karakter di dalamnya1<
Apakah yang kurang dari itu? (Yaitu apakah kita memiliki ion multi-elemen?)⍵∧
dan apakah kita perlu kelipatan ion itu?:
jika demikian, maka:')(',⍺
tambahkan string ke ion1⌽
putar secara siklis satu langkah ke kiri (menempatkan)
di kanan)⋄
lain⍺
mengembalikan ion yang tidak dimodifikasi∊
ϵ daftar (ratakan)sumber
C,
208205175169 byteargv[1]
: cationargv[2]
: anionBiaya ion diambil pada stdin.
sumber
Retina ,
8680 byteTerima kasih kepada Neil untuk menghemat 6 byte.
Cobalah online!
Input dipisahkan dengan linefeed (test suite menggunakan pemisahan koma untuk kenyamanan)
Penjelasan
Kita mulai dengan menambahkan a
(
ke setiap molekul. The^
pertandingan pada baris awal karenam)
menjelang akhir program menetapkan modus multiline untuk semua tahap sebelumnya.Kami mengganti
^[-+]n
bagian dengan)_
, diikuti olehn
salinan1
(yaitu, kami mengubah tagihan menjadi unary, menjatuhkan tanda-tanda).Tahap ini melakukan tiga hal: itu membagi kedua biaya dengan GCD mereka, mengubahnya kembali ke desimal dan menukar mereka. GCD dapat ditemukan dengan cukup mudah di regex, dengan mencocokkan yang terpanjang
1+
yang memungkinkan kami mencocokkan kedua biaya hanya dengan menggunakan referensi belakang\1
. Untuk membaginya, kami menggunakan fitur "jumlah tangkapan" Retina, yang memberi tahu kami seberapa sering suatu kelompok telah digunakan. Jadi$#2
, muatan pertama dibagi dengan GCD dan$#3
muatan kedua dibagi dengan GCD (keduanya dalam desimal).Kami menghapus
_1
s dari ujung kedua bagian.Dan kita menjatuhkan tanda kurung dari garis yang berakhiran
)
(yaitu yang memiliki tanda kurung di_1
sana), serta garis yang hanya berisi satu atom.Akhirnya, kami menggabungkan kedua molekul dengan menjatuhkan linefeed.
sumber
Haskell ,
10197 byteCobalah online! Contoh penggunaan:
Fe^+3, O^-2
diambil sebagai("Fe"#"O")3 2
.sumber
Python 3 , 131 byte
Cobalah online!
Python 2 ,
196174170155149140136 byteCobalah online!
sumber
Python 3 , 129 byte
Cobalah online!
Jika kita perlu menangani muatan negatif anion, maka 153 byte:
Cobalah online!
sumber
RPL (HP48 S / SX), 294,5 byte
Ya, pengiriman luar biasa besar, tidak yakin seberapa kompetitifnya ...
3 rutin dikemas dengan rapi dalam suatu direktori.
M
adalah yang utama. Ia mengharapkan 2 string pada stack diformat sebagai ion dan mendorong string molekul ke stack.S
membagi ion menjadi muatan sebagai angka dan rumus elemen sebagai string. Sebagai contoh,"PO_4^-3"
akan diambil dari tumpukan dan-3
dan"PO_4"
didorong ke tumpukan.J
bergabung dengan jumlah ion dengan formula dan memutuskan apakah akan membungkus formula ke dalam kurung. Bit sebelumELSE
berurusan dengan 1 ion, meninggalkan string apa adanya. Misalnya, jika1
dan"PO_4"
ada di tumpukan, mereka digantikan oleh"PO_4"
.1
dan"H"
memberi"H"
.Selebihnya berkaitan dengan banyak ion; jika itu adalah atom tunggal, itu tidak ada dalam tanda kurung, jika tidak demikian. Untuk memutuskan apakah itu, saya memeriksa panjang string dan memeriksa apakah karakter terakhir adalah
>"Z"
. Ekspresi Boolean menghasilkan 1 untuk true dan 0 untuk false. Dengan mengurangi hasil perbandingan ini dari panjang string, saya mendapatkan 1 atau kurang ketika itu adalah atom tunggal, jika tidak lebih: panjang 1 adalah atom tunggal; panjang 2 akan memiliki huruf sebagai karakter terakhir; untuk satu atom, ini adalah huruf kecil, jadi>"Z"
, hasilkan 1, jika tidak 2; panjang 3 atau lebih berarti lebih dari 1 atom dan dengan 0 atau 1 dikurangi dari panjang hasilnya paling tidak 2. Misalnya,3
dan"PO_4"
memberi"(PO_4)_3"
.3
dan"Al"
memberi"Al_3"
.M
pertama memisahkan masing-masing ion menggunakanS
. Setelah baris pertama level 5 tumpukan (jadi objek yang terkubur paling dalam) mengandung muatan ion kedua, rumus ion level 4 detik, rumus ion level 3 pertama, nilai absolut level 2 dari muatan ion pertama dan nilai absolut level 1 dari muatan ion kedua lagi. Misalnya, jika diberi ion pada stack adalah"Al^+3"
,"SO_4^-2"
, kita mendapatkan-2
,"SO_4"
,"Al"
,3
,2
.Baris kedua menghitung gcd dari 2 tagihan (membiarkan tagihan tetap utuh).
Baris ketiga membagi masing-masing muatan dengan gcd (untuk menghitung kelipatannya) dan menggabungkannya dengan rumus ion menggunakan
J
. Jadi kami memiliki dua string masing-masing dengan satu ion yang diberikan dengan muatan dihapus (atau kelipatan dari itu) dan muatan yang kedua terkubur di belakangnya. Sebagai contoh,-2
,"Al_2"
,"(SO_4)_3"
(-2 adalah biaya dari SO_4).Baris keempat melepaskan muatan dan jika positif menukar dua string (sehingga kation datang terlebih dahulu) sebelum bergabung dengan mereka. Jadi, dalam contoh di atas, karena itu negatif, mereka bergabung dalam urutan seperti mereka:
"Al_2(SO_4)_3"
.sumber
JavaScript, 145 byte
Membawa argumen
c
adalah kation,a
anion,p
muatan positif,n
muatan negatif.sumber