Tantangan
Mengingat massa molekul resolusi tinggi dari molekul organik, mengeluarkan rumus molekul molekul.
Penjelasan
Input akan berupa angka tunggal hingga tiga tempat desimal presisi, massa molekul relatif dari molekul tersebut.
Di sini, massa molekul didefinisikan sebagai jumlah massa atom dalam senyawa. Karena Anda hanya menemukan rumus molekul senyawa organik, massa atom yang perlu Anda ketahui adalah:
- C , Karbon: 12.011
- H , Hidrogen: 1,008
- O , Oksigen: 15,999
- N , Nitrogen: 14.007
Formula Anda seharusnya hanya mengandung karbon, hidrogen, oksigen atau nitrogen.
Saat menulis rumus, itu harus berbentuk:
CaHbOcNd
Di mana unsur-unsur harus dalam agar ( C -> H -> O -> N
, jadi C2O8N4H6
harus C2H6O8N4
) dan a
, b
, c
dan d
adalah angka dari elemen sebelumnya dalam molekul (yaitu C2
berarti bahwa ada dua atom karbon dalam molekul).
Jika a
, b
, c
atau d
yang nol, elemen yang tidak boleh dimasukkan dalam rumus (misalnya C2H6O2N0
harus C2H6O2
). Akhirnya, jika a
, b
, c
atau d
yang satu, Anda tidak harus menyertakan nomor dalam formula (misalnya C1H4
harus CH4
).
Input akan selalu valid (yaitu akan ada molekul dengan massa itu). Jika inputnya ambigu (beberapa molekul memiliki massa yang sama), Anda hanya harus mengeluarkan satu dari molekul tersebut. Bagaimana Anda memilih molekul ini, itu terserah Anda.
Contoh yang berhasil
Misalkan inputnya 180.156
, hanya ada satu kombinasi elemen yang dapat memiliki massa molekul ini:
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156
Jadi ada:
- 6 Karbon
- 12 Hidrogen
- 6 Oksigen
- 0 Nitrogen
Karena itu, output Anda harus:
C6H12O6
Lebih banyak contoh
Input -> Output
28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O
Kemenangan
Kode terpendek dalam byte menang.
28054
)12.011
adalah massa atom relatif dari karbon, yang merupakan rata-rata tertimbang dari massa isotop relatif dari isotop. Dalam spektrometer massa, di mana isotop yang berbeda dibedakan, Anda harus melihat dengan tepat12
. Mirip dengan atom lainnya.672.336
memiliki 24 solusi yang memungkinkan, termasuk nitrogen murni dan larutan hidrogen murni.Jawaban:
Mathematica, 108 byte
Fungsi murni mengharapkan input sebagai bilangan bulat (1000 kali massa molekul relatif); itu mencetak semua jawaban yang mungkin untuk STOUD (dan mengembalikan array
Null
s).Pengangkatan berat dilakukan oleh builtin
{12011,1008,15999,14007}~FrobeniusSolve~#
, yang menemukan semua kombinasi bilangan bulat tidak negatif dari bobot hardcoded yang sama dengan input.{Characters@"CHON",#}ᵀ
menempatkan setiap kombinasi tersebut dalam bentuk seperti{{"C", 0}, {"H", 1}, {"O", 2}, {"N", 3}}
. (ᵀ
sebenarnya adalah karakter matematika 3 byte U + F3C7.)Aturan transformasi
/.a_/;Last@a<2:>Table@@a
mengubah pasangan formulir{x, 0}
ke{}
dan pasangan formulir{x, 1}
ke{x}
(dan meludahkan kesalahan saat mencoba menerapkan ke seluruh ekspresi juga). KemudianPrint@@Join@@
cetak hasilnya dalam bentuk yang benar, hindari kebutuhan untuk melemparkan bilangan bulat sebagai string dan menyatu.sumber
ᵀ
tampaknya menjadi karakter yang salah. Seharusnya
.Python 2 , 242 byte
Cobalah online!
Fungsi rekursif, inputnya adalah bilangan bulat (1000 kali massa molekul relatif) terima kasih Stephen S untuk idenya
Mesin saya mengambil 40 Segs untuk gilirannya
672336
menjadiC33H115O3N8
dengan kode dimodifikasi ini . Ini berisi tabel pencarian untuk hit / gagal untuk mengurangi jumlah panggilan rekursif dan optimasi untuk menghitung elemen beberapa kali (jika massanya cukup tinggi)sumber
180156
batas waktu ketika semua kasus uji sangat cepat? (tanpa hit cache)18015
sebaliknya?18015
iniH2O
, tidakC6H12O6
JavaScript (ES6),
159158 byteTidak terlalu cepat ...
Demo
Tampilkan cuplikan kode
Versi lebih cepat,
174173 byteSemua uji kasus
Tampilkan cuplikan kode
sumber