Bernd adalah siswa sekolah menengah yang memiliki beberapa masalah dalam kimia. Di kelas ia harus merancang persamaan kimia untuk beberapa percobaan yang mereka lakukan, seperti pembakaran heptana:
C 7 H 16 + 11O 2 → 7CO 2 + 8H 2 O
Karena matematika bukanlah subjek terkuat Bernd, ia sering kesulitan menemukan rasio yang tepat antara pro dan educts dari reaksi. Karena Anda adalah tutor Bernd, tugas Anda adalah membantunya! Tulis program, yang menghitung jumlah masing-masing zat yang dibutuhkan untuk mendapatkan persamaan kimia yang valid.
Memasukkan
Input adalah persamaan kimia tanpa jumlah. Untuk memungkinkan hal ini dalam ASCII murni, kami menulis langganan apa pun sebagai angka biasa. Nama elemen selalu dimulai dengan huruf kapital dan dapat diikuti oleh sebuah sangat kecil. Molekul dipisahkan dengan +
tanda - tanda, panah ASCII-art ->
dimasukkan di antara kedua sisi persamaan:
Al+Fe2O4->Fe+Al2O3
Input diakhiri dengan baris baru dan tidak akan berisi spasi apa pun. Jika input tidak valid, program Anda dapat melakukan apa pun yang Anda suka.
Anda dapat berasumsi, bahwa input tidak pernah lebih dari 1024 karakter. Program Anda dapat membaca input dari input standar, dari argumen pertama atau dalam implementasi yang ditentukan saat runtime jika tidak ada yang mungkin.
Keluaran
Output dari program Anda adalah persamaan input yang ditambah dengan angka tambahan. Jumlah atom untuk setiap elemen harus sama di kedua sisi panah. Untuk contoh di atas, output yang valid adalah:
2Al+Fe2O3->2Fe+Al2O3
Jika nomor untuk molekul adalah 1, jatuhkan. Angka harus selalu berupa bilangan bulat positif. Program Anda harus menghasilkan angka sedemikian sehingga jumlah mereka minimal. Misalnya, berikut ini ilegal:
40Al+20Fe2O3->40Fe+20Al2O3
Jika tidak ada solusi, cetak
Nope!
sebagai gantinya. Input sampel yang tidak memiliki solusi adalah
Pb->Au
Aturan
- Ini adalah kode-golf. Kode terpendek menang.
- Program Anda harus diakhiri dalam waktu yang wajar untuk semua input yang masuk akal.
Uji Kasus
Setiap test case memiliki dua jalur: Input dan output yang benar.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
fungsieval(
Jawaban:
C, 442
505karakterJalankan sebagai:
Hasil:
sumber
Mathematica 507
Saya menggunakan pendekatan matriks komposisi kimia tambahan yang dijelaskan dalam
LRThorne, Suatu pendekatan inovatif untuk menyeimbangkan persamaan reaksi kimia: teknik pembalikan matriks yang disederhanakan untuk menentukan ruang nol matriks. Chem. Pendidik , 2010, 15, 304 - 308.
Satu perubahan kecil ditambahkan: Saya membagi transpos vektor ruang-nol dengan pembagi umum terbesar dari elemen untuk memastikan nilai integer dalam solusi apa pun. Implementasi saya belum menangani kasus di mana ada lebih dari satu solusi untuk menyeimbangkan persamaan.
Tes
Analisis
Ia bekerja dengan mengatur tabel komposisi kimia berikut, yang terdiri dari spesies kimia oleh unsur-unsur, yang ditambahkan vektor nullity (menjadi tabel komposisi kimia yang ditambah:
Sel-sel dalam dihapus sebagai matriks dan terbalik, menghasilkan.
Kolom paling kanan diekstraksi, menghasilkan:
Setiap elemen dalam vektor dibagi oleh gcd elemen (1/8), memberikan:
di mana nilai negatif akan ditempatkan di sisi kiri panah. Nilai absolut dari ini adalah angka yang diperlukan untuk menyeimbangkan persamaan asli:
sumber
Python, 880 karakter
Tes:
Keluaran:
Bisa jadi kurang dari 880, tapi mataku sudah membunuhku ...
sumber
Python 2, 635 byte
jumlah byte sebelumnya: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 654, 653, 653, 651, 638, 637, 636 byte.
Level indentasi kedua hanya tab, yang ketiga adalah tab lalu spasi.
Sejujurnya, ini adalah jawaban jadkik94, tetapi begitu banyak byte yang dicukur, saya harus melakukannya. Katakan padaku jika aku bisa memotong byte apa pun!
sumber
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
berfungsi untuk 12 byte yang disimpan.JavaScript, 682 byte
Ini adalah jawaban karakter Kuilin yang jauh lebih golf (dekade karakter!). Mungkin tidak bersaing karena fitur JS tertentu menunda tantangan.
sumber
Javascript, 705 byte
(non-bersaing, beberapa fitur mengungguli tantangan)
Solusi lain semuanya memiliki elemen brute-forcing. Saya mencoba pendekatan yang lebih deterministik dengan merepresentasikan persamaan kimia sebagai seperangkat persamaan linear, dan kemudian menyelesaikannya dengan menggunakan algoritma Gauss-Jordan untuk mengambil bentuk eselon baris tereduksi dari matriks itu. Untuk mengisolasi kasus sepele di mana semuanya nol, saya berasumsi bahwa salah satu elemen adalah angka konstan - dan angka itu ditentukan oleh semua angka yang dikalikan bersama, agar tidak memiliki pecahan. Kemudian sebagai langkah terakhir kita akan membagi masing-masing dengan gcd untuk memenuhi kondisi terakhir.
Tidak Disatukan:
Golf
sumber