Đặt tên chuỗi carbon không tuần hoàn


30

(Tôi không phải là nhà hóa học! Tôi có thể sai ở một số thứ, tôi đang viết những gì tôi đã học ở trường trung học)

Các nguyên tử carbon có một thuộc tính đặc biệt: Chúng có thể liên kết với 4 nguyên tử khác (không phải là đặc biệt) và chúng ổn định ngay cả trong chuỗi dài, rất độc đáo. Bởi vì chúng có thể được xâu chuỗi và kết hợp theo nhiều cách khác nhau, chúng tôi cần một số loại quy ước đặt tên để đặt tên cho chúng.

Đây là phân tử nhỏ nhất chúng ta có thể tạo ra:

CH4

Nó được gọi là metan. Nó chỉ bao gồm một nguyên tử carbon và 4 nguyên tử hydro. Tiếp theo là:

CH3 - CH3

Điều này được gọi là ethane. Nó được tạo thành từ 2 nguyên tử carbon và 6 hydro.

2 cái tiếp theo là:

CH3 - CH2 - CH3
CH3 - CH2 - CH2 - CH3

Chúng là propan và butan. Các vấn đề bắt đầu với các chuỗi có 4 nguyên tử carbon, vì nó có thể được chế tạo theo 2 cách khác nhau. Một cái được hiển thị ở trên và cái còn lại là:

CH3 - CH - CH3
       |
      CH3

Điều này rõ ràng là không giống như khác. Số lượng nguyên tử và các liên kết là khác nhau. Tất nhiên chỉ cần gập các liên kết và xoay phân tử sẽ không làm cho nó trở nên khác biệt! Vậy đây:

CH3 - CH2 - CH2 - CH3

Và cái này:

CH3 - CH2
       |
CH3 - CH2

Giống nhau (Nếu bạn tham gia vào lý thuyết đồ thị, bạn có thể nói rằng nếu có sự đẳng cấu giữa 2 phân tử; chúng giống nhau). Từ giờ tôi sẽ không viết ra các nguyên tử hydro vì chúng không cần thiết cho thử thách này.

Khi bạn ghét hóa học hữu cơ và bạn có rất nhiều nguyên tử carbon khác nhau để đặt tên, bạn quyết định viết một chương trình thực hiện điều này cho bạn. Bạn không có quá nhiều dung lượng trên ổ cứng, vì vậy chương trình phải càng nhỏ càng tốt.

Các thách thức

Viết chương trình lấy một văn bản nhiều dòng làm đầu vào (chuỗi carbon) và xuất ra tên của chuỗi carbon. Đầu vào sẽ chỉ chứa khoảng trắng, chữ hoa 'c' và '|' và '-' đại diện cho một ràng buộc. Chuỗi đầu vào sẽ không bao giờ chứa chu kỳ! Thí dụ:

Đầu vào:

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

Đầu ra:

4-etyl-2-metylhexan

Bất kỳ đầu ra nào cũng được chấp nhận miễn là nó có thể đọc được và về cơ bản là giống nhau (vì vậy bạn có thể sử dụng các dấu tách khác nhau chẳng hạn nếu bạn muốn).

Quy ước đặt tên:

(Xem: quy tắc IUPAC )

  1. Xác định chuỗi carbon dài nhất. Chuỗi này được gọi là chuỗi mẹ.

  2. Xác định tất cả các nhóm thế (các nhóm nối từ chuỗi mẹ).

  3. Đánh số các nguyên tử cacbon của chuỗi gốc từ đầu cung cấp cho các nhóm thế số lượng thấp nhất. Khi so sánh một dãy số, dãy số "thấp nhất" là dãy số chứa số thấp nhất vào dịp chênh lệch đầu tiên. Nếu hai hoặc nhiều chuỗi bên ở vị trí tương đương, gán số thấp nhất cho chuỗi sẽ đứng đầu trong tên.

  4. Nếu cùng một nhóm thế xảy ra nhiều hơn một lần, vị trí của từng điểm mà nhóm thế xảy ra được đưa ra. Ngoài ra, số lần nhóm thế xảy ra được biểu thị bằng một tiền tố (di, tri, tetra, v.v.).

  5. Nếu có hai hoặc nhiều nhóm thế khác nhau, chúng được liệt kê theo thứ tự bảng chữ cái bằng cách sử dụng tên cơ sở (bỏ qua các tiền tố). Tiền tố duy nhất được sử dụng khi đặt các nhóm thế theo thứ tự bảng chữ cái là iso như trong isopropyl hoặc isobutyl. Các tiền tố sec- và tert- không được sử dụng để xác định thứ tự chữ cái trừ khi so sánh với nhau.

  6. Nếu các chuỗi có độ dài bằng nhau đang cạnh tranh để lựa chọn là chuỗi mẹ, thì lựa chọn sẽ đi theo chuỗi:

    • chuỗi có số lượng lớn nhất của chuỗi bên.
    • chuỗi có nhóm thế có số lượng thấp nhất.
    • chuỗi có số lượng nguyên tử carbon lớn nhất trong chuỗi bên nhỏ nhất.
    • chuỗi có chuỗi bên ít phân nhánh nhất (biểu đồ có số lượng lá ít nhất).

Đối với chuỗi cha, cách đặt tên là:

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

Không có chuỗi sẽ dài hơn 12, vì vậy điều này là đủ. Đối với các chuỗi con, nó giống nhau nhưng thay vì 'ane' ở cuối, chúng ta có 'yl'.

Bạn có thể giả sử rằng các Cs nằm trong các cột lẻ và các liên kết ( |-ký tự) dài 1 giữa các nguyên tử carbon.

Các trường hợp thử nghiệm:

Đầu vào:

C-C-C-C

Đầu ra:

butan

Đầu vào:

C-C-C
  |
  C

Đầu ra:

2-metylpropan

Đầu vào:

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

Đầu ra:

3-metylhexan

Đầu vào:

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

Đầu ra:

3-metylhexan

Đầu vào:

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

Đầu ra:

3,4-dimethyl-5-ethylheptan

Chỉnh sửa: Xin lỗi vì các ví dụ sai. Tôi không phải là một học sinh giỏi :(. Họ nên được sửa chữa ngay bây giờ.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

2
Theo quy tắc này, 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.).ví dụ cuối cùng có nên được gọi là 3,4- di methyl-5-ethylheptane không? (chúng ta chỉ mới bắt đầu hóa học hữu cơ, tôi có thể sai: P)
NieDzejkob

@NieDzejkob Tôi đồng ý, vì có hai chuỗi methyl.
Jonathan Frech

@NieDzejkob Thật vậy, đã sửa.
Peter Lenkefi

Câu trả lời:


18

Python 2 , 1876 1871 1870 1859 1846 1830 1826 1900 1932 1913 1847 1833 1635 1613 1596 byte

s=input().split('\n')
W=enumerate
J=len
Y=sorted
l=J(s[0])
s=''.join(s)
S=set
M=max
A=min
p=map
f=lambda k:[(x/l,x%l)for x,V in W(s)if V==k]
g=lambda x,i,h=lambda x,i,j:x[:i]+(x[i]+j,)+x[i+1:]:[(h(q,i,-1),h(q,i,1))for q in x]
v=f('C');e=g(f('-'),1)+g(f('|'),0)
E=[V for V in v if sum(e,()).count(V)==1]
o=lambda v:[E[~E.index(v)]for E in e if v in E]
T=lambda a:lambda b:z((a,b))
Z=lambda a:p(T(a[0]),a[1])
n=lambda R:'mepbphhondudetrueeeco nothotnxptn ddh p t t'[R-1::12].strip()+(R>9)*'ec'
G=lambda K:[H[i]for i,V in W(K)if V==A(K)]
q=lambda x:[`k[0]`for k in H if k[1]==x]
B='-'.join
def z(n,c=[]):k=[x for x in S(o(n[0]))-S(c)];p=[z((j,n[1]),c+k)for j in k];return 1-~-(n[0]==n[1])*(p and A(p)or J(v))
C=[(a,b)for a in E for b in E]
a=p(z,C)
s=[(k,[E for E in v if~-z((k[0],E))+z((k[1],E))==z((k[0],k[1]))])for k in[C[x]for x,V in W(a)if V==M(a)]]
H=[]
R=0
for k,_ in s:R=M(J(_),R);_.sort(key=T(k[0]));a=sum([list(S(o(k))-S(_))for k in _],[]);H+=zip(p(lambda a:Z((a,_)).index(2),a),p(Z,[(O,[x for x in S(v)-S(_)if z((x,O),_)<J(v)])for O in a])),
X=n(R)
U=any(H)
if U:H=G([[h[0]for h in Q]for Q in H if J(Q)==M(p(J,H))]);K=[[J(Q[1])for Q in j]for j in H];H=[H[i]for i,V in W(K)if A(V)==A(sum(K,[]))];K=[J([Q[1]for Q in j if J(S(Q[1]))-J(Q[1])])for j in H];H=[[p[0]+1,n(M(p[1]))+[['isopropyl','butyl-tert','butyl-sec','isobutyl'][J(p[1])+p[1].count(3)-3],'yl'][Y(p[1])==range(1,1+M(p[1]))]]for p in G(K)[0]]
print(U and B([','.join(q(x))+'-'+'dttphhondireeeecoe itnxptnc  rtataaa  aa a '[J(q(x))-2::9].strip()+B(x.split('-')[::-1])for x in Y(list(S(zip(*H)[1])))])+X or[X,'meth']['t'==X])+'ane'

Hãy thử trực tuyến!

Vâng, bạn đi. Chắc chắn không phải là gôn nhất nhưng nó hoạt động (tôi hy vọng): D

Mất khoảng 10 giờ, có lẽ vậy? Có lẽ là sân golf dài nhất của tôi cả về kích thước và thời gian, và điều đó nói lên điều gì đó khi tôi sử dụng Java D:

Logic:

  1. Chuyển đổi từ biểu diễn ASCII sang biểu diễn đồ thị với mỗi nguyên tử carbon dưới dạng nút và mỗi liên kết dưới dạng cạnh được biểu thị dưới dạng kề.
  2. Tìm tất cả các lá; đó là, các nút chỉ có một liên kết. Chuỗi dài nhất được đảm bảo là từ một trong những chuỗi này.
  3. Tìm sản phẩm thuốc nhuộm của lá; đó là tất cả các cặp nút cạnh. Sau đó, lấy chiều dài của tất cả các chuỗi.
  4. Đối với mỗi chuỗi, tìm subchains của nó.
  5. Làm công cụ để chọn đúng chuỗi. Nếu có quan hệ, thì nó không thực sự quan trọng. Sự thật thú vị: Sẽ luôn có một sự ràng buộc bởi vì mỗi chuỗi được tính hai lần, một lần ngược lại.
  6. In đúng cách.

EDIT : Đã sửa lỗi trong đó nó được sử dụng để gây ra lỗi nếu không có chuỗi bên.

EDIT : Cảm ơn MD XF vì đã nhận thấy một vài khoảng trắng thừa (thụt vào vòng lặp for).

EDIT : Tôi hoàn toàn quên mất tiền tố vì có cùng nhóm thế.

LƯU Ý : Mỗi dòng cần có cùng chiều rộng để làm việc này. Đó là, không gian dấu được yêu cầu.

Sự thật thú vị: hầu hết các hydrocacbon tuần hoàn sẽ được xác định là "metan"

Sự thật thú vị: Nếu bạn làm C-C-...-C-Cvới 13 C, nó sẽ cho ethane, sau đó thanecho 14, ropanecho 15, v.v.

-79 byte nhờ Jonathan Frech
-119 byte nhờ NieDzejkob
-17 byte nhờ vào ovs

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.