Alkanların Lewis Yapılarını Çizim


17

Ben sadece alkanlar hakkında okulda bir ders vardı ve muhtemelen büyük bir kod golf meydan okuma yapacak düşündüm! Endişelenme, göründüğü kadar karmaşık değil!

Hızlı Rehash

(Lütfen Dikkat: Bu özeti saklamak için tüm bilgiler% 100 doğru değildir.)

Alkanlar karbon ve hidrojen telleridir. Her karbon atomunun 4 bağı ve her hidrojen atomu 1 bağı vardır. Alkanın tüm karbon atomları, ipin uçları hariç, her bir C atomunun diğer 2 C atomuna (Lewis yapısında sol ve sağ) ve 2 H atomuna (yukarı ve aşağı) bağlandığı bir dize oluşturur. buradaki C-atomu, sadece 1 diğer C'ye, ancak 3H'ye bağlanır. İşte pentan için temel bir örnek (5 C-atomlu ve 12H-atomlu bir alkan):

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

Alkanların da şubeleri olabilir. Ancak endişelenmeyin, bu meydan okumadaki tüm alkanlar sadece 1 dallanma seviyesi ile ifade edilebilir. Misal:

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

Bu zorluğu tamamlamak için, dallanmış alkanlar için IUPAC adlandırma kuralını da anlamalısınız. İlk önce kök alkan var. Önceki örneğimizde bu, "CCCCC" kısmı olacaktır. Bu zincirin uzunluğuna bağlı olarak, farklı bir adı vardır. 1C, metan, 2C etan, 3C propan, sonra bütan, pentan, heksan, heptan, oktan, nonan ve dekan (10 ° C) olarak adlandırılır. Ardından, her dal için belirli bir önek vardır: Birincisi, dalın eklendiği C-atomunun indeksi (ofseti) vardır (soldan sayın). Örnekte bu 4 olur (yani soldan 4. C atomudur). Sonra bir kısa çizgi (bu sembol: "-") ve bundan sonra dalın boyutunu gösteren başka bir ad var. Dalın boyutunun adlandırılması, kökün boyutunun adlandırılması ile hemen hemen aynıdır, sadece "ane" yerine "yl" ifadesini eklersiniz. Bununla örneğin tam adı

4-methylpentane

Birden fazla dalınız varsa, bunlar da başka bir tire ile ayrılmış olarak eklenir. Misal:

2-butyl-5-methylhexane

Son bir şey: aynı boyutta birden fazla dalınız varsa, gruplandırılırlar; ofsetleri virgülle ayrılır ve aynı boyut adını paylaşırlar, bu da kaç dalın gruplandığına bağlı olarak ekstra hece ile eklenir: 2 dal için "di", 3 için "tri", 4 için "tetra" (siz bu meydan okuma için daha fazlasına gerek yok). Misal:

2-ethyl-2,4,6-trimethyldecane

Bilginize, bu olabilir görünebilir: (Atlanmış H atomları)

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

İsimlendirme Hileleri

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

Kurallar

STDIN, program argümanları veya eşdeğerinden böyle bir IUPAC adını okuyan ve ASCII-art lewis yapısı olarak STDOUT'a (veya eşdeğerine) çizen bir program yazın.

  • Basitlik için, H atomlarını çizmeniz GEREKMEZ (Başka türlü boşluk sorunlarıyla karşılaşırsınız)
  • Boş ön veya arka yatay çizgiler basmanıza izin VERİLMEZ
  • Ayrıştırmanız gereken zincirler 10'dan daha uzun olmayacak ve bir "grup" daki dalların maksimum sayısı 4 ile sınırlandırılacaktır.
  • Bir dalın maksimum "ofseti" 9'dur (yani 1 basamaktan fazla ayrıştırmanız gerekmez)
  • Şubeleriniz her yeni branştan sonra yukarı ve aşağı gitmek arasında değişmelidir. Bu alanın aynı ofsetteki başka bir dal tarafından zaten alınmış olması durumunda, kökün diğer tarafına çizmeniz gerekir. (yukarı-> aşağı, aşağı-> yukarı)
  • Bozuk, doğru biçimlendirilmemiş veya başka bir şekilde çizilemeyen girdilerde, programınız belirtilmemiş davranabilir.

Bu kod golf, bayt kazanır en kısa kod kazanır!

Mutlu golf! :)


Meli 4-methylpropanedemek 4-methylpentane? 4-<anything>propanebir şeyi tamamen yanlış anlamadığım sürece olası görünmüyor.
Peter Taylor

Evet haklısın. Düzenledi!
Thomas Oltmann

4
Sahip olduğunuz son molekül 3-3-5-7-methyldodecane, en uzun sürekli karbon zincirinin 12 uzun olmasıdır. Ayrıca, sorudaki tüm bilgilerin doğru olmadığını söylediniz, ancak bence ikinci molekülün karbona en yakın dallanma ile başladığınız için 2-methylpentanedeğil 4-methylpentane.
Arcturus

Biliyorum, ama tam olarak reddediğim yanlışlık buydu. Bu sadece bir kod golf meydan okuma için yeterince kısa tutmak için takas! :)
Thomas Oltmann

1
1. Your branches have to alternate between going up and down after every new branch.örneğiniz bu kuralı ihlal ediyor 2. Desteklememiz gereken maksimum zincir uzunluğu nedir (öneklerin ayrıştırılması zorluğun bir parçası olacaktır.) Bir isimlendirme listesini bağlamalısınız (veya tercihen kopyalamalısınız).
Level River St

Yanıtlar:


3

Python 2,620 bayt

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)

açıklama

Giriş: '2-ethyl-2,4,6-trimethyldecane'

Normal ifade ile dizeye ilk ayrıştırmalar (son grup köktür):

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

Her dal bir uzunluk dizisiyle yazılır len(root)(Burada yukarı / aşağı işlenir):

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

'Sol' ve 'Sağ' ( L,R) ve 'kök' ( C) dize dalları başlatılır.

Daha sonra her dal karşılık gelen 'dize' dalına (büyük döngü) eklenir.

İki taraf ve orta sonunda yazdırılır:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.