Vẽ cấu trúc Lewis của ankan


17

Tôi vừa có một bài học ở trường về ankan và hình dung nó có thể sẽ tạo nên một thử thách golf mã tuyệt vời! Đừng lo lắng, nó không phức tạp như vẻ ngoài của nó!

Làm lại nhanh

(Xin lưu ý: Để giữ bản tóm tắt này, không phải tất cả thông tin đều chính xác 100%.)

Ankan là chuỗi của carbon và hydro. Mỗi nguyên tử carbon có 4 liên kết, và mỗi nguyên tử hydro 1 liên kết. Tất cả các nguyên tử carbon của ankan tạo thành một chuỗi trong đó mỗi nguyên tử C được kết nối với 2 nguyên tử C khác (trái và phải trong cấu trúc Lewis) và 2 nguyên tử H (lên và xuống), ngoại trừ hai đầu của chuỗi , trong đó nguyên tử C được kết nối với chỉ 1 C khác nhưng 3 Hs. Đây là một ví dụ cơ bản cho pentane (một ankan có 5 nguyên tử C và 12 nguyên tử H):

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

Ankan cũng có thể có nhánh. Nhưng đừng lo lắng, tất cả các ankan trong thử thách này có thể được thể hiện chỉ với 1 cấp độ phân nhánh. Thí dụ:

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

Để hoàn thành thử thách này, bạn cũng phải hiểu quy ước đặt tên IUPAC cho các ankan phân nhánh. Đầu tiên là gốc ankan. Trong ví dụ trước của chúng tôi, đây sẽ là phần "CCCCC". Tùy thuộc vào chuỗi này dài bao nhiêu, nó có một tên khác nhau. 1 C được gọi là metan, 2 C ethane, 3 C propane, sau đó là butan, pentane, hexane, heptane, octan, nonane và decane (10 C). Sau đó, đối với mỗi nhánh, có một tiền tố nhất định cho điều đó: Đầu tiên, có chỉ số (phần bù) của nguyên tử C, nhánh được gắn vào (đếm từ bên trái). Trong ví dụ này, đây sẽ là 4 (hay còn gọi là nguyên tử C thứ 4 từ bên trái). Sau đó, có một dấu gạch nối (ký hiệu này: "-") và sau đó một tên khác cho biết kích thước của nhánh. Việc đặt tên kích thước của nhánh gần giống như cách đặt tên kích thước của gốc, chỉ là thay vì "ane", bạn viết thêm "yl". Với tên đầy đủ của ví dụ sẽ là

4-methylpentane

Nếu bạn có nhiều nhánh, thì chúng cũng được thêm vào trước, phân tách bằng dấu gạch nối khác. Thí dụ:

2-butyl-5-methylhexane

Một điều cuối cùng: nếu bạn có nhiều nhánh có cùng kích thước, chúng sẽ được nhóm lại; phần bù của chúng được phân tách bằng dấu phẩy và chúng có chung tên kích thước, được thêm vào một âm tiết phụ thuộc vào số lượng nhánh được nhóm: "di" cho 2 nhánh, "tri" cho 3, "tetra" cho 4 (bạn không cần nhiều hơn cho thử thách này). Thí dụ:

2-ethyl-2,4,6-trimethyldecane

FYI, cái này có thể trông giống như thế này: (Bỏ qua các nguyên tử H)

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

Danh pháp áo

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

Những quy định

Viết chương trình đọc tên IUPAC như vậy từ STDIN, đối số chương trình hoặc tương đương và vẽ nó dưới dạng cấu trúc lewis nghệ thuật ASCII thành STDOUT (hoặc tương đương).

  • Để đơn giản, bạn KHÔNG phải vẽ các nguyên tử H (Khác bạn sẽ gặp phải các vấn đề về khoảng cách)
  • Bạn KHÔNG được phép in bất kỳ dòng ngang hàng đầu hoặc dấu trống nào
  • Chuỗi bạn phải phân tích sẽ không dài hơn 10 và tối đa các nhánh trong một "nhóm" được giới hạn là 4.
  • "Độ lệch" tối đa của một nhánh là 9 (có nghĩa là bạn không phải phân tích cú pháp nhiều hơn 1 chữ số)
  • Các chi nhánh của bạn phải xen kẽ giữa đi lên và xuống sau mỗi nhánh mới. Trong trường hợp không gian này đã được lấy bởi một nhánh khác ở cùng độ lệch, bạn phải vẽ nó ở phía bên kia của gốc. (lên-> xuống, xuống-> lên)
  • Trên đầu vào bị hỏng, không được định dạng chính xác hoặc không thể rút ra được, chương trình của bạn có thể hoạt động không xác định.

Đây là mã golf, mã ngắn nhất tính bằng byte thắng!

Chúc bạn chơi golf vui vẻ! :)


Nên 4-methylpropanenói 4-methylpentanegì? 4-<anything>propanedường như không thể, trừ khi tôi hoàn toàn hiểu sai điều gì đó.
Peter Taylor

Vâng bạn đã đúng. Đã chỉnh sửa rồi!
Thomas Oltmann

4
Phân tử cuối cùng bạn có là 3-3-5-7-methyldodecanebởi vì chuỗi carbon liên tục dài nhất là 12 dài. Ngoài ra, bạn nói rằng không phải tất cả thông tin trong câu hỏi đều chính xác, nhưng tôi nghĩ rằng đáng để chỉ ra rằng phân tử thứ hai là 2-methylpentane, không phải 4-methylpentanevì bạn bắt đầu từ carbon với sự phân nhánh gần nhất.
Arcturus

Tôi biết, nhưng đó chính xác là sự thiếu chính xác mà tôi đã từ chối. Đó chỉ là sự đánh đổi để giữ cho nó đủ ngắn cho một thử thách golf mã! :)
Thomas Oltmann

1
1. Your branches have to alternate between going up and down after every new branch.ví dụ của bạn vi phạm quy tắc này 2. Độ dài chuỗi tối đa chúng tôi phải hỗ trợ là bao nhiêu (phân tích các tiền tố sẽ là một phần của thách thức.) Bạn nên liên kết (hoặc tốt nhất là sao chép) một danh sách danh pháp.
Cấp sông St

Câu trả lời:


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)

Giải trình

Đầu vào: '2-ethyl-2,4,6-trimethyldecane'

Phân tích cú pháp đầu tiên thành chuỗi với regex (nhóm cuối cùng là root):

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

Mỗi nhánh được viết trong một mảng có chiều dài len(root)(Thay thế lên / xuống được xử lý ở đây):

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

Các nhánh chuỗi 'Trái' và 'Phải' ( L,R) và 'gốc' ( C) được khởi tạo.

Mỗi nhánh sau đó được thêm vào nhánh 'chuỗi' tương ứng (vòng lặp lớn).

Hai bên và trung tâm được in ở cuối:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.