Menggambar Struktur Lewis dari Alkana

17

Saya baru saja mendapat pelajaran di sekolah tentang alkana dan mengira itu mungkin akan menjadi tantangan kode golf yang hebat! Jangan khawatir, ini tidak serumit kelihatannya!

Rehash Cepat

(Harap Dicatat: Untuk membuat singkat ini, tidak semua informasi 100% akurat.)

Alkana adalah rangkaian karbon dan hidrogen. Setiap atom karbon memiliki 4 ikatan, dan setiap atom hidrogen 1 ikatan. Semua atom karbon dari alkana membentuk string di mana setiap atom C terhubung ke 2 atom C lainnya (kiri dan kanan dalam struktur Lewis) dan 2 atom H (atas dan ke bawah), kecuali untuk ujung-ujung string , di mana atom-C terhubung hanya 1 C lain tetapi 3 Hs. Berikut adalah contoh dasar untuk pentana (alkana dengan 5 atom-C dan 12 atom-H):

  H H H H H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Alkana juga dapat memiliki cabang. Tapi jangan khawatir, semua alkana dalam tantangan ini dapat diekspresikan dengan hanya 1 level percabangan. Contoh:

        H
        |
      H-C-H
  H H H | H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

Untuk menyelesaikan tantangan ini, Anda juga harus memahami konvensi penamaan IUPAC untuk alkana bercabang. Pertama ada root alkane. Dalam contoh kita sebelumnya, ini akan menjadi bagian "CCCCC". Bergantung pada berapa lama rantai ini, ia memiliki nama yang berbeda. 1 C disebut metana, 2 C etana, 3 C propana, kemudian butana, pentana, heksana, heptana, oktan, nonan dan decana (10 C). Kemudian, untuk setiap cabang, ada awalan tertentu untuk itu: Pertama, ada indeks (offset) dari atom-C cabang ditambahkan ke (dihitung dari kiri). Dalam contoh, ini akan menjadi 4 (alias itu adalah atom C ke-4 dari kiri). Lalu ada tanda hubung (simbol ini: "-") dan setelah itu nama lain yang menunjukkan ukuran cabang. Penamaan ukuran cabang hampir sama seperti penamaan ukuran akar, Hanya saja alih-alih "ane" Anda menambahkan "yl". Dengan itu nama lengkap dari contoh itu akan menjadi

4-methylpentane

Jika Anda memiliki banyak cabang, maka cabang-cabang tersebut juga ditambahkan sebelumnya, dipisahkan oleh tanda hubung lainnya. Contoh:

2-butyl-5-methylhexane

Satu hal terakhir: jika Anda memiliki banyak cabang dengan ukuran yang sama, mereka dikelompokkan; offset mereka dipisahkan dengan koma dan mereka berbagi nama ukuran yang sama, yang akan ditukar dengan suku kata tambahan tergantung pada berapa banyak cabang yang dikelompokkan: "di" untuk 2 cabang, "tri" untuk 3 cabang, "tri" untuk 3, "tetra" untuk 4 (Anda tidak perlu lebih banyak untuk tantangan ini). Contoh:

2-ethyl-2,4,6-trimethyldecane

FYI, ini bisa terlihat seperti ini: (H-atom dihilangkan)

   |
  -C-
   |       |
  -C-     -C-
 | | | | | | | | | |
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | |
  -C- -C-
   |   |

Lembar Informasi Tata Nama

Prefixes indicating numbers:
| Num  | Prefix |
|------|--------|
| 1    | meth   |
| 2    | eth    |
| 3    | prop   |
| 4    | but    |
| 5    | pent   |
| 6    | hex    |
| 7    | hept   |
| 8    | oct    |
| 9    | non    |
| 10   | dec    |
Suffix root:   ane
Suffix branch: yl
Prefixes grouping: di, tri, tetra

Aturan

Tulis sebuah program yang bertuliskan nama IUPAC dari STDIN, argumen atau ekuivalen program dan gambarkan sebagai struktur ASCII-art lewis menjadi STDOUT (atau setara).

  • Untuk kesederhanaan, Anda TIDAK perlu menggambar atom-H (Jika tidak, Anda akan mengalami masalah spasi)
  • Anda TIDAK diperbolehkan mencetak garis horizontal awal atau belakang kosong
  • Rantai yang Anda harus parsing tidak akan lebih dari 10, dan maksimum cabang dalam "grup" dibatasi hingga 4.
  • "Offset" maksimum cabang adalah 9 (artinya Anda tidak perlu menguraikan lebih dari 1 digit)
  • Cabang Anda harus bergantian antara naik dan turun setelah setiap cabang baru. Jika ruang ini sudah diambil oleh cabang lain pada offset yang sama, Anda harus menggambarnya di sisi lain dari root. (atas-> bawah, bawah-> atas)
  • Pada input yang korup, tidak diformat dengan benar, atau tidak dapat ditarik, program Anda mungkin berperilaku tidak spesifik.

Ini adalah kode golf, kode terpendek dalam byte menang!

Selamat bermain golf! :)

Thomas Oltmann
sumber
Haruskah 4-methylpropanekatakan 4-methylpentane? 4-<anything>propanesepertinya tidak mungkin, kecuali saya benar-benar salah memahami sesuatu.
Peter Taylor
Ya kau benar. Diedit itu!
Thomas Oltmann
4
Molekul terakhir yang Anda miliki adalah 3-3-5-7-methyldodecanekarena rantai karbon kontinu terpanjang adalah 12 panjang. Juga, Anda mengatakan tidak semua info dalam pertanyaan itu akurat, tetapi saya pikir ada baiknya menunjukkan bahwa molekul kedua adalah 2-methylpentane, bukan 4-methylpentanekarena Anda mulai pada karbon dengan percabangan terdekat.
Arcturus
Saya tahu, tapi itu persis ketidaktepatan yang saya sanggah. Itu hanya trade off untuk menjaganya tetap cukup pendek untuk tantangan kode golf! :)
Thomas Oltmann
1
1. Your branches have to alternate between going up and down after every new branch.contoh Anda melanggar aturan ini 2. Berapa panjang rantai maksimum yang harus kami dukung (menguraikan awalan akan menjadi bagian dari tantangan.) Anda harus menautkan (atau lebih disukai menyalin) daftar nomenklatur.
Level River St

Jawaban:

3

Python 2, 620 byte

import re
i=input()
s='m|e|pr|b|p|hex|h|o|n|de';d=dict(zip(s.split('|'),range(1,11)))
z=[[eval('['+a+']'),d[b]]for a,b in re.findall('(?:(\d[,\d]*).*?[\-ia]|l)('+s+')',i[:-3])]
v=z[-1][1]
l=[[0,0]for _ in range(v)]
c=0
for a,b in sorted([(i,b)for a,b in z[:-1]for i in a]):l[a-1][c]=b;c=~c
m=[max(x) for x in zip(*l)]
L,R=[[[' 'for _ in '_'*2*i]for _ in '_'*(2*v+1)]for i in m]
c=[' |'*v+' ']
C=c+['-C'*v+'-']+c
for i in range(len(l)):
 X=L;q=2*i+1
 for a in l[i]:
  if a>0:
   for j in range(0,2*a,2):
    X[q][j]='C'
    X[q-1][j]=X[q+1][j]='-'
    X[q][j+1]='|'
  X=R
for l in zip(*L)[::-1]+C+zip(*R):print ''.join(l)

Penjelasan

Memasukkan: '2-ethyl-2,4,6-trimethyldecane'

Parsing pertama ke string dengan regex (grup terakhir adalah root):

[[[2], 2], [[2, 4, 6], 1], [[], 10]]

Setiap cabang ditulis dalam array panjang len(root)(Bolak-balik ditangani di sini):

[[0, 0], [1, 2], [0, 0], [1, 0], [0, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0]]

Cabang string 'Kiri' dan 'Kanan' ( L,R) dan 'root' ( C) diinisialisasi.

Setiap cabang kemudian ditambahkan ke cabang 'string' yang sesuai (lingkaran besar).

Dua sisi dan tengah dicetak di bagian akhir:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
TFeld
sumber