Tantangan
Tulis sebuah program yang dapat memecah formula input kimia (lihat di bawah), dan output masing-masing atom dalam bentuk element: atom-count
.
Memasukkan
Input sampel:
H2O
Input Anda akan selalu mengandung setidaknya satu elemen, tetapi tidak lebih dari sepuluh. Program Anda harus menerima input yang mengandung tanda kurung, yang dapat disarangkan.
Elemen dalam string akan selalu cocok [A-Z][a-z]*
, artinya mereka akan selalu mulai dengan huruf besar. Angka akan selalu satu digit.
Keluaran
Output sampel (untuk input di atas):
H: 2
O: 1
Output Anda secara opsional dapat diikuti oleh baris baru.
Memecah Molekul
Angka di sebelah kanan satu set kurung didistribusikan ke setiap elemen di dalamnya:
Mg(OH)2
Haruskah output:
Mg: 1
O: 2
H: 2
Prinsip yang sama berlaku untuk masing-masing atom:
O2
Haruskah output:
O: 2
Dan juga chaining:
Ba(NO2)2
Haruskah output:
Ba: 1
N: 2
O: 4
Contohnya
> Ba(PO3)2
Ba: 1
P: 2
O: 6
> C13H18O2
C: 13
H: 18
O: 2
> K4(ON(SO3)2)2
K: 4
O: 14
N: 2
S: 4
> (CH3)3COOC(CH3)3
C: 8
H: 18
O: 2
> (C2H5)2NH
C: 4
H: 11
N: 1
> Co3(Fe(CN)6)2
Co: 3
Fe: 2
C: 12
N: 12
Input dilambangkan dengan tanda panah (lebih dari tanda; >
).
Papan angka
Agar skor Anda muncul di papan tulis, itu harus dalam format ini:
# Language, Score
Atau jika Anda mendapat bonus:
# Language, Score (Bytes - Bonus%)
Sunting: Kurung kotak tidak lagi menjadi bagian dari pertanyaan. Jawaban apa pun yang diposting sebelum pukul 3AM UTC, 23 September, aman dan tidak akan terpengaruh oleh perubahan ini.
[HCl] = 0.01 mol L^-1
.>
.Jawaban:
CJam,
5957 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Pyth,
6665 bytePort jawaban Python saya. Hanya mendukung input menggunakan tanda kurung biasa.
sumber
Python3,
157154 byteHanya mendukung input menggunakan tanda kurung biasa.
Sebelum membuat solusi golf menggunakan di
eval
atas, saya membuat solusi referensi ini, yang menurut saya sangat elegan:sumber
JavaScript ES6, 366 byte
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Saya cukup yakin ini bisa dipersingkat, tetapi saya harus kembali bekerja. ;-)
sumber
return
pernyataan tersirat . Itu sudah cukup untuk saat ini.replace
banyak sehingga Anda dapat menyimpan beberapa byte dengan menggunakanxyz[R='replace'](...)
waktu pertama danabc[R] (...)
setiap waktu berikutnya.SageMath ,
156148 byteCobalah online di sini (semoga tautannya berfungsi, mungkin memerlukan akun online)
Catatan: Jika mencoba online, Anda harus mengganti
input()
dengan string (mis."(CH3)3COOC(CH3)3"
)Penjelasan
Sage memungkinkan Anda untuk menyederhanakan ekspresi aljabar, asalkan mereka berada dalam format yang tepat (lihat 'manipulasi simbolik' dari tautan ini ). Regex di dalam eval () pada dasarnya berfungsi untuk mendapatkan string input ke dalam format yang tepat, misalnya sesuatu seperti:
eval()
kemudian akan menyederhanakan ini ke:,8*C + 18*H + 2*O
dan kemudian hanya masalah memformat output dengan substitusi regex lain.sumber
Python 3, 414 byte
Saya harap urutan hasilnya tidak masuk hitungan.
sumber
Javascript (ES6),
286284Tidak jauh lebih pendek dari ES6 yang lain tapi saya berikan yang terbaik. Catatan: ini akan error jika Anda memberikan string kosong atau input yang paling tidak valid. Juga mengharapkan semua grup memiliki hitungan lebih dari 1 (yaitu, tidak
CO[OH]
). Jika ini melanggar aturan tantangan, beri tahu saya.Menggunakan pendekatan berbasis tumpukan. Pertama, ia memproses string untuk ditambahkan
1
ke elemen apa pun tanpa angka, yaituCo3(Fe(CN)6)2
menjadiCo3(Fe1(C1N1)6)2
. Kemudian loop melalui urutan terbalik dan mengakumulasikan jumlah elemen.Biola
sumber
Perl,
177172 byteKode 171 byte + 1 byte parameter baris perintah
Ok, jadi saya mungkin sedikit terhanyut dengan regex yang satu ini ...
Contoh penggunaan:
sumber
Mathematica, 152 byte
Di atas mendefinisikan fungsi
f
yang mengambil string sebagai input. Fungsi mengambil string dan membungkus setiap nama elemen menjadi tanda kutip dan menambahkan operator eksponensial infiks sebelum setiap angka, kemudian menafsirkan string sebagai ekspresi:Kemudian ia mengambil logaritma itu dan memperluasnya (Mathematica tidak peduli, apa yang harus diambil logaritma :)):
dan kemudian ia menemukan semua kemunculan perkalian dari
Log
dengan angka dan mem-parsingnya ke dalam bentuk{log-argument, number}
dan menampilkannya dalam tabel. Beberapa contoh:sumber
Java, 827 byte
Git repositori dengan sumber yang tidak disunat (tidak paritas yang sempurna, ungolfed mendukung angka multi-karakter).
Sudah lama, saya pikir saya akan memberikan Jawa beberapa representasi. Pasti tidak akan memenangkan penghargaan apa pun :).
sumber
ES6, 198 byte
Di mana
\n
karakter baris baru literal.Tidak Disatukan:
sumber
Pip ,
8577 + 1 = 78 byteJawaban tidak bersaing karena menggunakan fitur bahasa yang lebih baru daripada tantangan. Mengambil rumus sebagai argumen baris perintah, dan menggunakan
-n
bendera untuk pemformatan output yang tepat.Cobalah online!
Trik utamanya adalah mengubah rumus melalui penggantian regex menjadi ekspresi Pip. Ini, ketika dievaluasi, akan melakukan pengulangan dan menyelesaikan tanda kurung untuk kita. Kami kemudian memposting sedikit proses untuk mendapatkan jumlah atom dan memformat semuanya dengan benar.
Tidak disatukan, dengan komentar:
Berikut cara input
Co3(Fe(CN)6)2
ditransformasikan:Kemudian:
sumber