Codeium Golfide

28

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_4atau Al.
  • 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 akan Fe_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 , jawaban tersingkat dalam byte menang.

Nissa
sumber
3
Kasing uji yang disarankan: Fe^+2, OH^-1: Fe(OH)_2untuk ion poliatomik dengan 1 dari setiap elemen ( OH^-1).
pizzapants184
1
@ Adam ion kedua dibebankan: 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.
Heimdall
1
@ Adám Fe_4(Fe(CN)_6)_3untuk warna biru Prusia.
Colera Su
3
Ini mungkin judul tantangan terlucu yang pernah saya lihat di situs web ini sejauh ini, dan itu mengatakan banyak hal untuk pertanyaan ppcg. Terima kasih untuk tawa yang baik
osuka_
1
@osuka_ Pernahkah Anda melihat "apa cara tercepat untuk membunuh keluarga saya" di Arqade? Atau tantangan PPCG saya yang lain, "konfirmasikan Illuminati"?
Nissa

Jawaban:

4

APL (Dyalog) , 60 59 61 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.

{∊(⍺{⍵∧1<≢⍺∩⎕D,⎕A:1')(',⍺⋄⍺}¨m),¨(ms1)/¨'_',∘⍕¨s←⍵÷⍨∧/⍵}∘|

Cobalah online!

{...}∘|  berfungsi di mana argumen kiri dan besarnya argumen benar:

∧/⍵ LCM dari tuduhan

⍵÷⍨ bagilah biaya dengan itu

s← simpan di s(untuk s ubscripts)

'_',∘⍕¨ format (stringify) dan tambahkan underbar ke masing-masing

(...)/  meniru setiap huruf dari masing-masing dengan nilai yang sesuai dari:

  s≠1 Apakah sberbeda dari1 ? (memberi 1 atau 0)

  m← simpan di m(untuk m ultiple)

(...),¨  tambahkan masing-masing berikut ini ke yang berikut:

  ⍺{... }¨m untuk masing-masing, panggil fungsi ini dengan ion dan msebagai argumen:

   ⎕D,⎕AD igits diikuti oleh huruf besar A lphabet

   ⍺∩ persimpangan ion dan itu

    menghitung jumlah karakter di dalamnya

   1< 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 ion

    1⌽ putar secara siklis satu langkah ke kiri (menempatkan ) di kanan)

    lain

     mengembalikan ion yang tidak dimodifikasi

ϵ daftar (ratakan)

Adm
sumber
6

C, 208 205 175 169 byte

argv[1]: cation
argv[2]: anion
Biaya ion diambil pada stdin.

#define z(b)for(i=*++v;*++i>95;);printf(b>1?*i?"(%s)_%d":"%s_%d":"%s",*v,b);
main(c,v,d,e,g,h,i)char**v,*i;{scanf("%d%d",&c,&d);for(e=c,h=-d;g=h;e=g)h=e%g;z(-d/e)z(c/e)}
Colera Su
sumber
OP menentukan ion dapat diberikan dalam urutan apa pun.
Heimdall
6

Retina , 86 80 byte

Terima kasih kepada Neil untuk menghemat 6 byte.

^
(
\^.+
)_$&$*
(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2
_1$

m)T`()``.+\)$|\(.[a-z]?\)
¶

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 karena m)menjelang akhir program menetapkan modus multiline untuk semua tahap sebelumnya.

\^.+
)_$&$*

Kami mengganti ^[-+]nbagian dengan )_, diikuti oleh nsalinan 1(yaitu, kami mengubah tagihan menjadi unary, menjatuhkan tanda-tanda).

(1+)(\1|¶.+)+_(\1)+$
$#3$2_$#2

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 $#3muatan kedua dibagi dengan GCD (keduanya dalam desimal).

_1$

Kami menghapus _1s dari ujung kedua bagian.

m)T`()``.+\)$|\(.[a-z]?\)

Dan kita menjatuhkan tanda kurung dari garis yang berakhiran )(yaitu yang memiliki tanda kurung di _1sana), serta garis yang hanya berisi satu atom.

Akhirnya, kami menggabungkan kedua molekul dengan menjatuhkan linefeed.

Martin Ender
sumber
3

Haskell , 101 97 byte

(s#t)n m|let x#i|j<-div(lcm n m)i=l$x:[l(x:['(':x++")"|l x<':'])++'_':show j|j>1]=s#n++t#m
l=last

Cobalah online! Contoh penggunaan: Fe^+3, O^-2diambil sebagai ("Fe"#"O")3 2.

Laikoni
sumber
2

Python 3 , 131 byte

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from math import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_%d'%n][n>1]

Cobalah online!

Python 2 , 196 174 170 155 149 140 136 byte

lambda c,a,C,A:g(c,A/gcd(C,A))+g(a,C/gcd(C,A))
from fractions import*
g=lambda s,n:[s,[s,'(%s)'%s][sum(c<'`'for c in s)>1]+'_'+`n`][n>1]

Cobalah online!

TFeld
sumber
Python 3 untuk 131 byte
pizzapants184
2

Python 3 , 129 byte

lambda E,e,I,i,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,i/gcd(i,I))+m(e,I/gcd(i,I))
from math import*

Cobalah online!


Jika kita perlu menangani muatan negatif anion, maka 153 byte:

lambda E,e,I,i,a=abs,m=lambda e,i:(len(e)>2<=i)*"("+e+(len(e)>2<=i)*")"+"_%d"%i*(i>1):m(E,a(i)/gcd(a(i),a(I)))+m(e,a(I)/gcd(a(i),a(I)))
from math import*

Cobalah online!

Tuan Xcoder
sumber
2

RPL (HP48 S / SX), 294,5 byte

Ya, pengiriman luar biasa besar, tidak yakin seberapa kompetitifnya ...

DIR
  M
    « S ROT S SWAP ABS 4 PICK ABS
      DUP2 WHILE DUP2 REPEAT MOD SWAP END DROP2
      SWAP OVER / 4 ROLL J 3 ROLLD / ROT J
      ROT 0 > IF THEN SWAP END + »
  S
    « DUP "^" POS DUP2 1 + OVER SIZE SUB OBJ🡢
      3 ROLLD 1 - 1 SWAP SUB »
  J
    IF OVER 1 ==
    THEN SWAP DROP
    ELSE DUP SIZE DUP2 DUP SUB "Z" > - 1 >
      IF
      THEN "(" SWAP + ")" +
      END
      "_" + SWAP +
    END
END

3 rutin dikemas dengan rapi dalam suatu direktori. Madalah yang utama. Ia mengharapkan 2 string pada stack diformat sebagai ion dan mendorong string molekul ke stack.

Smembagi ion menjadi muatan sebagai angka dan rumus elemen sebagai string. Sebagai contoh, "PO_4^-3"akan diambil dari tumpukan dan -3dan "PO_4"didorong ke tumpukan.

Jbergabung dengan jumlah ion dengan formula dan memutuskan apakah akan membungkus formula ke dalam kurung. Bit sebelum ELSEberurusan dengan 1 ion, meninggalkan string apa adanya. Misalnya, jika 1dan "PO_4"ada di tumpukan, mereka digantikan oleh "PO_4". 1dan "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, 3dan "PO_4"memberi "(PO_4)_3". 3dan "Al"memberi "Al_3".

Mpertama memisahkan masing-masing ion menggunakan S. 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".

Heimdall
sumber
1

JavaScript, 145 byte

(c,a,p,n,g=(a,b)=>b?g(b,a%b):a)=>`(${c})_${n/-g(p,-n)}(${a})_${p/g(p,-n)}`.replace(/\(((\w+)\)(?=_1)|([A-Z][a-z]*)\))/g,"$2$3").replace(/_1/g,"")

Membawa argumen cadalah kation, aanion, pmuatan positif, nmuatan negatif.

ericw31415
sumber