(Saya bukan ahli kimia! Saya mungkin salah dalam beberapa hal, saya menulis apa yang saya pelajari di sekolah menengah)
Atom karbon memiliki atribut khusus: Mereka dapat berikatan dengan 4 atom lainnya (yang tidak istimewa) dan mereka tetap stabil bahkan dalam rantai panjang, yang sangat unik. Karena mereka dapat dirantai dan digabungkan dalam banyak cara yang berbeda, kita perlu semacam konvensi penamaan untuk memberi nama mereka.
Ini adalah molekul terkecil yang bisa kita buat:
CH4
Itu disebut metana. Ini terdiri dari hanya satu karbon dan 4 atom hidrogen. Yang berikutnya adalah:
CH3 - CH3
Ini disebut etana. Itu terdiri dari 2 karbon dan 6 atom hidrogen.
2 selanjutnya adalah:
CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3
Mereka adalah propana dan butana. Permasalahan dimulai dengan rantai dengan 4 atom karbon, karena dapat dibangun dengan 2 cara berbeda. Satu ditunjukkan di atas dan yang lainnya adalah:
CH3 - CH - CH3
|
CH3
Ini jelas tidak sama dengan yang lain. Jumlah atom dan ikatannya berbeda. Tentu saja hanya melipat binding dan memutar molekul tidak akan membuatnya berbeda! Jadi ini:
CH3 - CH2 - CH2 - CH3
Dan ini:
CH3 - CH2
|
CH3 - CH2
Apakah sama (Jika Anda tertarik pada teori grafik, Anda dapat mengatakan bahwa jika ada isomorfisme antara 2 molekul; keduanya sama). Mulai sekarang saya tidak akan menulis atom hidrogen karena mereka tidak penting untuk tantangan ini.
Ketika Anda membenci kimia organik dan Anda memiliki banyak atom karbon yang berbeda, Anda memutuskan untuk menulis sebuah program yang melakukan ini untuk Anda. Anda tidak memiliki terlalu banyak ruang pada hard drive Anda, jadi programnya harus sekecil mungkin.
Tantangan
Tulis program yang menggunakan teks multi-baris sebagai input (rantai karbon) dan output nama rantai karbon. Input hanya akan berisi spasi, huruf besar 'c' dan '|' dan '-' yang mewakili ikatan. Rantai input tidak akan pernah mengandung siklus! Contoh:
Memasukkan:
C-C-C-C-C-C
| |
C C-C
Keluaran:
4-etil-2-metilheksana
Output apa pun dapat diterima asalkan dapat dibaca oleh manusia dan pada dasarnya sama (sehingga Anda dapat menggunakan pemisah yang berbeda misalnya jika Anda mau).
Konvensi penamaan:
(Lihat: aturan IUPAC )
Identifikasi rantai karbon terpanjang. Rantai ini disebut rantai induk.
Identifikasi semua substituen (grup yang ditambahkan dari rantai induk).
Beri nomor karbon pada rantai induk dari ujung yang memberikan substituen angka terendah. Ketika membandingkan serangkaian angka, seri yang merupakan "terendah" adalah yang berisi angka terendah pada kesempatan perbedaan pertama. Jika dua atau lebih rantai samping berada pada posisi yang setara, tetapkan angka terendah ke rantai yang akan didahulukan dalam nama.
Jika substituen yang sama terjadi lebih dari sekali, lokasi setiap titik di mana substituen terjadi diberikan. Selain itu, berapa kali kelompok substituen terjadi ditunjukkan oleh awalan (di, tri, tetra, dll.).
Jika ada dua atau lebih substituen yang berbeda, mereka terdaftar dalam urutan abjad menggunakan nama dasar (abaikan awalan). Satu-satunya awalan yang digunakan saat meletakkan substituen dalam urutan abjad adalah iso seperti pada isopropil atau isobutyl. Awalan kedua dan ters- tidak digunakan dalam menentukan urutan alfabet kecuali jika dibandingkan satu sama lain.
Jika rantai dengan panjang yang sama bersaing untuk seleksi sebagai rantai induk, maka pilihannya akan seri untuk:
- rantai yang memiliki jumlah rantai samping terbanyak.
- rantai yang substituennya memiliki angka terendah.
- rantai memiliki jumlah atom karbon terbesar di rantai samping terkecil.
- rantai memiliki rantai samping bercabang paling sedikit (grafik memiliki jumlah daun paling sedikit).
Untuk rantai induk, penamaannya adalah:
Number of carbons Name
1 methane
2 ethane
3 propane
4 butane
5 pentane
6 hexane
7 heptane
8 octane
9 nonane
10 decane
11 undecane
12 dodecane
Tidak ada rantai yang lebih panjang dari 12, jadi ini sudah cukup. Untuk sub-rantai itu sama tetapi bukannya 'ane' pada akhirnya kita memiliki 'yl'.
Anda dapat mengasumsikan bahwa C
s berada di kolom ganjil dan binding ( |
dan -
karakter) adalah 1 panjang antara atom karbon.
Kasus uji:
Memasukkan:
C-C-C-C
Keluaran:
butana
Memasukkan:
C-C-C
|
C
Keluaran:
2-metilpropana
Memasukkan:
C-C-C-C
|
C
|
C-C
Keluaran:
3-metilheksana
Memasukkan:
C-C-C-C-C
|
C
|
C
Keluaran:
3-metilheksana
Memasukkan:
C
|
C
|
C-C-C-C
|
C-C-C
|
C-C
Keluaran:
3,4-dimethyl-5-ethylheptane
Sunting: Maaf untuk contoh yang salah. Saya bukan murid yang baik :(. Mereka harus diperbaiki sekarang.
If the same substituent occurs more than once, the location of each point on which the substituent occurs is given. In addition, the number of times the substituent group occurs is indicated by a prefix (di, tri, tetra, etc.).
bukankah seharusnya contoh terakhir disebut 3,4- di metil-5-etilheptana? (kami baru memulai kimia organik, saya mungkin salah: P)Jawaban:
Python 2 ,
187618711870185918461830182619001932191318471833163516131596 byteCobalah online!
Nah begitulah. Tentu saja bukan golfiest tetapi berfungsi (saya harap): D
Butuh waktu sekitar 10 jam, mungkin? Mungkin golf terlama saya dalam ukuran dan waktu, dan itu mengatakan sesuatu mengingat saya dulu menggunakan Java D:
Logika:
EDIT : Fixed bug di mana ia digunakan untuk menyebabkan kesalahan jika tidak ada rantai samping.
EDIT : Terima kasih kepada MD XF karena memperhatikan beberapa ruang ekstra (lekukan untuk loop).
EDIT : Saya benar-benar lupa tentang awalan untuk memiliki substituen yang sama.
CATATAN : Setiap baris harus memiliki lebar yang sama agar dapat berfungsi. Artinya, ruang trailing diperlukan.
Fakta menyenangkan: sebagian besar hidrokarbon siklik akan ditentukan sebagai "metana"
Fakta menyenangkan: Jika Anda melakukannya
C-C-...-C-C
dengan 13 C, itu akan memberiethane
, makathane
untuk 14,ropane
untuk 15, dll.-79 byte terima kasih kepada Jonathan Frech
-119 byte terima kasih kepada NieDzejkob
-17 byte terima kasih untuk ovs
sumber