Tugas
Tulis program yang menggunakan senyawa yang hanya terdiri dari unsur-unsur dengan nomor atom kurang dari atau sama dengan 92 (Uranium), dan mengeluarkan massa molar dari senyawa tersebut grams/mole
.
Aturan dan Batasan
- Anda tidak boleh menggunakan fungsi yang secara langsung menghitung massa molar untuk Anda.
- Program Anda harus dapat dijalankan pada mesin offline.
- Anda DAPAT menggunakan file data terpisah. Isi dari file ini harus disediakan.
- Skor Anda adalah panjang program Anda dalam byte, ditambah panjang file data Anda dalam byte, jika Anda memilih untuk menggunakannya.
- Ini kode-golf , oleh karena itu, skor terendah menang.
Memasukkan
String yang berisi senyawa. String ini dapat dibaca STDIN
, diteruskan sebagai argumen, atau disetel ke variabel (harap tentukan yang mana). Berikut ini adalah semua input yang valid:
CH2
(satu Karbon, dua Hidrogen)(CH2)8
(8 Karbon, 16 Hidrogen)U
(1 Uranium)
Program Anda tidak perlu berfungsi untuk tanda kurung yang disematkan (yaitu ((CH3)2N4)4
), atau untuk senyawa apa pun yang mengandung unsur dengan nomor atom lebih besar dari 92. Jika program Anda tidak berfungsi untuk salah satu dari dua kasus di atas, ia harus menampilkan Invalid formula
untuk kasus tersebut - tidak ada perilaku yang tidak terdefinisi.
Keluaran
Anda harus menampilkan, ke STDOUT
atau ke variabel, massa molar senyawa di grams/mole
. Daftar massa atom unsur tersedia di sini (Wikipedia) . Jawaban Anda harus akurat untuk tempat desimal untuk senyawa yang mengandung kurang dari 100 atom (bulat).
Jika input tidak valid, Invalid formula
harus dikeluarkan.
Informasi tentang cara menghitung massa molar suatu senyawa dalam grams/mole
(Wikipedia).
Contohnya
Input Output
H2O 18.015
O 15.999 (16 acceptable)
C6H2(NO2)3CH3 227.132
FOOF 69.995
C6H12Op3 Invalid formula
Np 237 (or Invalid formula)
((C)3)4 144.132 (or Invalid formula)
CodeGolf Invalid formula
U1000000
lebih sulit untuk ditentukan ke titik desimal daripada massaU2
13
jika massa atomnya12.999
?Jawaban:
Pesta,
978 708 675 673 650 636 632 631 598594211 byte untuk program dan 382 byte untuk data.
Input pada STDIN, output pada STDOUT. PERINGATAN: membuat file yang dipanggil
g
dana
, jika ada, mereka akan ditimpa!File data
Ini membutuhkan file bernama
y
, yang merupakan bentuk terkompresi- zopfli dari data ini (tidak ada trailing baris baru). zopfli adalah algoritma kompresi yang kompatibel dengan gzip dan dapat didekompresi dengan alat gzip standar. Dijalankan dengan 1024 iterasi (ini mungkin terlalu banyak). 8 byte terakhir kemudian dihapus.Base64 of
y
is (digunakanbase64 -d
untuk mereproduksi file asli):MD5sum adalah
d392b0f5516033f2ae0985745f299efd
.Penjelasan
Angka-angka dalam file adalah peningkatan massa atom relatif (sehingga massa atom relatif lithium adalah
1.008 + 0 + 2.995 + 2.937
).Script ini bekerja dengan mengubah rumus kimia menjadi ekspresi aritmatika dengan
+
dan*
, mengganti setiap simbol dengan massa atom relatifnya, kemudian memberi makan ekspresibc
. Jika rumus berisi simbol yang tidak valid,bc
akan memberikan kesalahan sintaks dan tidak menghasilkan apa-apa untuk STDOUT; dalam hal ini, outputnya adalahInvalid formula
.Jika STDIN kosong, hasilnya adalah
0
. Kurung bersarang didukung.Contoh
sumber
Perl - 924
Ia menggunakan serangkaian operasi substitusi regex pada formula yang dimasukkan untuk memperluas elemen dan grup yang disubkripkan, menggantikan elemen dengan bobot atom, dan mengubahnya menjadi urutan penambahan yang kemudian dievaluasi.
sumber
Mathematica 9 -
247227Ini jelas curang karena saya menggunakan fungsi yang secara langsung menghitung massa atomatik (tetapi bukan massa molar!):
Penggunaan: Memanggil fungsi
f
dengan string yang berisi rumus, output akan menjadi massa.Uji:
Mathematica 10 tidak menghasilkan angka mentah, tetapi angka dengan unit, sehingga mungkin tidak dapat diterima.
sumber
Javascript, 1002
Input dalam
q
dan output dia
. Saya tidak yakin apa aturan untuk pembulatan itu, jadi saya memotong ke 3 tempat setelah desimal (atau lebih sedikit, jika angka tidak tersedia dari Wikipedia).sumber
q
, meskipun semuanya tampak baik-baik saja. +1Javascript (E6) 1231
Sebagai fungsi dengan input sebagai argumen dan mengembalikan output. Presisi: 3 angka desimal
Gunakan regexp untuk mengubah rumus kimia dalam ekspresi aritmatika sederhana, dengan jumlah dan produk, menggantikan:
(
dengan+(
Kemudian ekspresi dievaluasi dan nilai dikembalikan. Jika terjadi kesalahan atau jika nilainya NaN (atau nol) maka fungsi mengembalikan 'Formula tidak valid'
Sekarang saya melihat bahwa semua jawaban lain menggunakan metode yang sama ... oh baik di sini adalah versi javascript
sumber
PHP - 793 (583 + 210)
Sebagian besar tidak didukung oleh jawaban professorfish , yang menggunakan metode serupa, tapi hei ... Simbol dan massa dikompresi dengan gzip dalam file yang
a
diperoleh dengan kode berikut:Rumus harus disimpan dalam
$f
variabel:Ini adalah versi yang tidak diklik dan dikomentari:
sumber
Scala, 1077
Saya melihat semua solusi Anda dalam bahasa yang diketik secara dinamis dengan cop-out seperti
eval
atau fungsi massa atom bawaan dan memberikan Anda solusi bahasa yang diketik secara statis:Saya harus mempertimbangkan beberapa kompresi untuk data, tetapi untuk sekarang mari kita memiliki massa atom di basis 94, tidak terkompresi.
sumber
molarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}