Tantangan
Mengingat formula suatu bahan kimia, hasilkan M r dari senyawa tersebut.
Persamaan
Setiap elemen dalam senyawa diikuti oleh angka yang menunjukkan jumlah atom tersebut dalam senyawa. Jika tidak ada nomor, hanya ada satu atom di dalam senyawa.
Beberapa contoh adalah:
- Etanol (C 2 H 6 O) akan berada di
C2H6O
tempat terdapat dua atom karbon, 6 atom hidrogen, dan 1 atom oksigen - Magnesium Hidroksida (MgO 2 H 2 ) akan berada di
MgO2H2
tempat terdapat satu atom magnesium, dua atom oksigen, dan dua atom hidrogen.
Perhatikan bahwa Anda tidak akan pernah harus menangani tanda kurung dan setiap elemen dimasukkan hanya sekali dalam rumus.
Sementara kebanyakan orang mungkin akan tetap pada urutan yang mereka rasa paling nyaman, tidak ada sistem pemesanan yang ketat. Sebagai contoh, air dapat diberikan sebagai salah satu H2O
atau OH2
.
M r
Catatan: Di sini, anggap massa rumus sama dengan massa molekul
M r senyawa, massa molekul, adalah jumlah dari berat atom dari atom-atom dalam molekul.
Satu-satunya unsur dan bobot atomnya ke 1 desimal yang harus Anda dukung (hidrogen menjadi kalsium, tidak termasuk gas mulia) adalah sebagai berikut. Mereka juga dapat ditemukan di sini
H - 1.0 Li - 6.9 Be - 9.0
B - 10.8 C - 12.0 N - 14.0
O - 16.0 F - 19.0 Na - 23.0
Mg - 24.3 Al - 27.0 Si - 28.1
P - 31.0 S - 32.1 Cl - 35.5
K - 39.1 Ca - 40.1
Anda harus selalu memberikan output ke satu tempat desimal.
Sebagai contoh, etanol ( C2H6O
) memiliki M r dari 46.0
karena merupakan jumlah dari berat atom dari unsur-unsur di dalamnya:
12.0 + 12.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 16.0
(2*C + 6*H + 1*O)
Memasukkan
Satu string dalam format di atas. Anda bisa menjamin bahwa elemen yang dimasukkan dalam persamaan akan menjadi simbol elemen yang sebenarnya.
Senyawa yang diberikan tidak dijamin ada dalam kenyataan.
Keluaran
Total M r dari senyawa, ke 1 tempat desimal.
Aturan
Dibangun di mana elemen akses atau data kimia tidak diizinkan (maaf Mathematica)
Contohnya
Input > Output
CaCO3 > 100.1
H2SO4 > 98.1
SF6 > 146.1
C100H202O53 > 2250.0
Kemenangan
Kode terpendek dalam byte menang.
Posting ini diadopsi dengan izin dari caird coinheringaahing . (Posting sekarang dihapus)
sumber
2H2O
?NumberForm[#&@@#~ChemicalData~"MolecularMass",{9,1}]&
Jawaban:
Jelly , 63 byte
Tautan monadik yang menerima daftar karakter dan mengembalikan nomor.
Cobalah online!
Bagaimana?
sumber
Python 3 ,
189 182168 byte-14 byte dengan menggunakan hash dari jawaban Justin Mariner's JavaScript (ES6) .
Cobalah online!
Di bawah ini adalah versi 182 byte, saya akan meninggalkan penjelasan untuk yang ini - yang di atas hanya mengubah urutan bobot, menggunakan
int
untuk mengkonversi nama elemen dari basis29
, dan menggunakan dividen yang berbeda untuk mengompresi kisaran bilangan bulat ke bawah - lihat Justin Jawaban Mariner .Fungsi yang tidak disebutkan namanya menerima string
s
,, dan mengembalikan nomor.Cobalah online!
Bagaimana?
Menggunakan regex untuk membagi input,,
s
ke dalam elemen dan jumlah mereka menggunakan:re.findall("(\D[a-z]?)(\d*)",s)
\D
cocok dengan tepat satu non-digit dan[a-z]?
cocok dengan 0 atau 1 huruf kecil, bersama-sama dengan elemen yang cocok.\d*
cocok dengan 0 atau lebih digit. Tanda kurung membuat ini menjadi dua kelompok, dan dengan demikianfindall("...",s)
mengembalikan daftar tupel string[(element, number),...]
,.Jumlah ini sederhana untuk ekstrak, satu-satunya untuk menangani adalah bahwa sarana string kosong 1, ini dicapai dengan logis
or
karena Python string adalah falsey:int(n or 1)
.String elemen diberi nomor unik dengan mengambil produk dari ordinals karakter pertama dan terakhirnya (biasanya ini sama misalnya S atau C, tetapi kita perlu membedakan antara Cl, C, Ca, dan Na sehingga kita tidak bisa hanya menggunakan satu karakter).
Angka-angka ini kemudian dipotong untuk mencakup kisaran yang jauh lebih kecil [0,18], ditemukan oleh pencarian ruang modulo yang menghasilkan
%1135%98%19
. Misalnya"Cl"
memiliki ordinals67
dan108
, yang berkembang biak untuk memberi7736
, yang, modulo1135
adalah426
, yang modulo98
adalah34
, yang mana modulo19
adalah15
; angka ini digunakan untuk mengindeks ke dalam daftar bilangan bulat - nilai ke-15 (terindeks-0) dalam daftar:[16,31,40.1,32.1,0,24.3,12,39.1,28.1,19,0,9,10.8,23,27,35.5,6.9,14,1]
adalah
35.5
, berat atom Cl, yang kemudian dikalikan dengan jumlah elemen tersebut (seperti yang ditemukan di atas).Produk-produk ini kemudian ditambahkan bersama menggunakan
sum(...)
.sumber
PHP , 235 byte
Cobalah online!
Alih-alih
array_combine([H,Li,Be,B,C,N,O,F,Na,Mg,Al,Si,P,S,Cl,K,Ca],[1,6.9,9,10.8,12,14,16,19,23,24.3,27,28.1,31,32.1,35.5,39.1,40.1])
Anda dapat menggunakan[H=>1,Li=>6.9,Be=>9,B=>10.8,C=>12,N=>14,O=>16,F=>19,Na=>23,Mg=>24.3,Al=>27,Si=>28.1,P=>31,S=>32.1,Cl=>35.5,K=>39.1,Ca=>40.1]
dengan jumlah Byte yang samasumber
JavaScript (ES6), 150 byte
Terinspirasi oleh jawaban Python Jonathan Allan , di mana ia menjelaskan memberikan setiap elemen angka unik dan hashing angka-angka itu berada dalam kisaran yang lebih kecil.
Elemen-elemen dibuat menjadi angka unik dengan menafsirkannya sebagai basis-29 (0-9 dan AS). Saya kemudian menemukan bahwa
%633%35%18
mempersempit nilai ke kisaran[0, 17]
sambil mempertahankan keunikan.Cuplikan Tes
sumber
Clojure,
198194 bytePembaruan: lebih baik
for
daripadareduce
.Asli:
Saya ingin tahu apakah ada cara yang lebih ringkas untuk menyandikan tabel pencarian.
sumber
Python 3 , 253 byte
Cobalah online!
sumber
Mathematica,
390338329 BytesDisimpan 9 byte karena benar-benar terjaga sekarang dan benar-benar menggunakan pemendekan yang saya maksudkan.
Versi 2.1:
Penjelasan: Temukan posisi semua karakter huruf besar. Letakkan satu titik di depan masing-masing. Pisahkan string di setiap titik. Untuk daftar substring ini, lakukan pembagian berikut berdasarkan huruf dan bagi berdasarkan angka. Untuk yang dibagi dengan huruf, konversi string ke angka. Untuk yang dibagi dengan digit, ganti setiap bahan kimia dengan berat molekulnya. Untuk siapa pun dengan berat molekul dan jumlah atom, gantilah dengan produk mereka. Mereka menemukan totalnya.
Versi 1:
Saya yakin ini bisa banyak golf (atau hanya ditulis ulang sepenuhnya). Saya hanya ingin mencari tahu bagaimana melakukannya. (Akan merenungkannya di pagi hari.)
Penjelasan: Pertama-tama pisahkan string menjadi karakter. Kemudian lipat array yang bergabung dengan huruf kecil dan angka kembali ke modal mereka. Selanjutnya tambahkan 1 ke bahan kimia apa pun tanpa nomor di ujungnya. Kemudian lakukan dua pemisahan istilah dalam array - satu pemisahan di semua angka dan satu pemisahan di semua huruf. Untuk yang pertama ganti huruf dengan massa molar mereka kemudian cari produk titik dari dua daftar ini.
sumber
Python 3 - 408 byte
Ini terutama solusi @ovs, karena ia menurunkannya lebih dari 120 byte ... Lihat solusi awal di bawah ini.
Cobalah online!
Python 3 -
550 548535 byte (kehilangan hitungan dengan lekukan)Disimpan 10 byte berkat @cairdcoinheringaahing dan 3 disimpan berkat ovs
Saya memiliki tujuan pribadi untuk tidak menggunakan regex apa pun, dan melakukannya dengan cara lama yang menyenangkan ... Ternyata lebih lama 350 byte daripada solusi regex, tetapi hanya menggunakan perpustakaan standar Python ...
Cobalah online!
Jika ada yang mau menurunkannya (dengan perbaikan lekukan dan trik lainnya ...), itu akan 100% diterima dengan baik, merasa seperti ada cara yang lebih baik untuk melakukan ini ...
sumber
for y in g: if str(y[0])==h[i][:h[i].index('-')]:x+=y[1]
denganfor y in g:x+=y[1]*(str(y[0])==h[i][:h[i].index('-')])
if/for/while
di baris berikutnya. Karena ini adalah kasus pada setiap baris indentasi, Anda tidak dapat menyimpan byte dengan ini.