Mức độ không bão hòa


11

Mức độ không bão hòa

Đây không phải là một câu đố mã đặc biệt khó khăn - nhưng tôi rất muốn thấy nhiều cách giải quyết của bạn.

Mức độ không bão hòa là số lượng liên kết hóa học kép giữa các nguyên tử và / hoặc số vòng trong một hợp chất hóa học.

Bạn sẽ được cung cấp công thức phân tử của một hợp chất hóa học ở dạng XaYbZc (trong đó a, b và c là số nguyên tử của X, Y hoặc Z trong hợp chất) - công thức có thể có độ dài bất kỳ và chứa bất kỳ nguyên tố hóa học nào trong bảng tuần hoàn (mặc dù các yếu tố khác ngoài C, H, N, F, Cl, Br, tôi có thể bị bỏ qua vì chúng không có trong công thức). Hợp chất sẽ chứa ít nhất một nguyên tử carbon. Bạn phải tính toán và hiển thị Mức độ không bão hòa của nó.

Ví dụ, hợp chất benzen (hình dưới) có DoU là 4 vì nó có ba liên kết đôi (được hiển thị bằng một đường đôi giữa các nguyên tử) và một vòng đơn (một số nguyên tử được kết nối trong một vòng lặp):

vòng benzen

Theo định nghĩa của LibreTexts :

DoU = (2C + 2 + N - X - H) / 2

Ở đâu:

  • C là số nguyên tử carbon
  • N là số nguyên tử nitơ
  • X là số nguyên tử halogen ( F, Cl, Br, I)
  • H là số nguyên tử hydro

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

C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety. 
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input

Để được giải thích về CH xem tại đây

Về bản chất, bạn phải xác định xem có bất kỳ yếu tố nào ở trên (C, H, N, F, Cl, Br, I) trong hợp chất không, và nếu có thì có bao nhiêu. Sau đó, tính toán Mức độ không bão hòa bằng công thức trên.

Chỉ C, H, N, F, Cl, Br và I là các đầu vào hợp lệ cho công thức DoU. Đối với mục đích của câu đố này, bất kỳ yếu tố nào khác có thể bị bỏ qua hoàn toàn (ví dụ: nếu hợp chất là C6H6Mn thì kết quả vẫn là 4). Nếu không có hợp chất nào ở trên, câu trả lời sẽ bằng không.

Bạn có thể cho rằng tất cả các hợp chất đầu vào đều có thể hóa học, chứa ít nhất một nguyên tử carbon và được biết là tồn tại. Nếu đầu vào không hợp lệ, chương trình có thể xuất 0 hoặc -1 hoặc không tạo ra kết quả.

Quy tắc

Quy tắc IO tiêu chuẩnsơ hở áp dụng. Đầu vào phải là một chuỗi tiêu chuẩn và bạn có thể cho rằng đầu vào sẽ không trống. Đây là codegolf - vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


Các trường hợp thử nghiệm được đề xuất: Natri oxit: Na2Ovà Methylidyne: CHCCl4He. Đây là một số trường hợp góc có thể phá vỡ một vài giải pháp. Nhân tiện, không phải nó quan trọng đối với bất kỳ ai khác ngoài Mathicala (có lẽ), nhưng chúng ta có thể cho rằng các hợp chất (có thể) tồn tại không?
Stewie Griffin

Tôi không hiểu C9H2O1 --> 0. Không phải là 9 sao? (2*9+2+0-0-2)/2
DLosc

theo đoạn cuối, bạn có nghĩa là mã phải có khả năng xử lý các đầu vào không hợp lệ? Nhân tiện, có đảm bảo rằng mọi yếu tố đơn lẻ trong hợp chất đều có dấu '1' như trong C1H1 không?
Keyu Gan

@KeyuGan có và có.
Archie Roques

Câu trả lời:


2

JavaScript (ES6), 117 112 byte

Trả về 0cho đầu vào không hợp lệ.

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,s|=n==2,n>2?3:n],1)*s

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

Phiên bản thay thế, 103 byte

Nếu đầu vào được đảm bảo là hợp lệ - vì phần giới thiệu thử thách bị gợi ý sai lệch - chúng ta có thể làm:

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,n>2?3:n],1)

Bản giới thiệu


2

Python 3 , 142 151 148 byte

import re
l=dict(re.findall("(\D+)(\d+)",input()))
m=lambda k:int(l.get(k,0))
print(m("C")and m("C")+1+(m("N")-sum(map(m,"F I H Cl Br".split())))/2)

Trả về 0 khi lỗi.

Cảm ơn @HyperNeutrino mang các byte xuống.

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


Rất tiếc - trường hợp thử nghiệm được cập nhật!
Archie Roques


@HyperNeutrino Các trường hợp thử nghiệm không rõ ràng một chút. Bây giờ không có đầu ra trên đầu vào không hợp lệ.
MooseOnTheRocks


Sử dụng tốt đẹp dictở đó!
DLosc

0

Pip , 70 67 byte

`C\d`Na&1+/2*VaR+XDs._R['C'NC`H|F|I|Cl|Br`].s["+2*"'+'-]RXU.XX"+0*"

Lấy công thức hóa học làm đối số dòng lệnh. Đầu ra 0cho đầu vào không hợp lệ. Hãy thử trực tuyến!

Giải trình

Sử dụng một loạt các thay thế regex để biến công thức hóa học thành công thức toán học, loại bỏ nó và thực hiện một vài điều chỉnh để có được giá trị cuối cùng.

Các thay thế (phiên bản hơi vô căn cứ):

aR+XDs._R"C ""+2*"R"N "'+R`(H|F|I|Cl|Br) `'-RXU.XX"+0*"

a                    Cmdline arg
 R+XD                 Replace runs of 1 or more digits (\d+)
     s._               with a callback function that prepends a space
                       (putting a space between each element and the following number)
 R"C "                Replace carbon symbol
      "+2*"            with +2* (add 2* the number of carbon atoms to the tally)
 R"N "                Replace nitrogen symbol
      '+               with + (add the number of nitrogen atoms to the tally)
 R`(H|F|I|Cl|Br) `    Replace hydrogen or halogen symbol
                  '-   with - (subtract the number of atoms from the tally)
 RXU.XX               Replace uppercase letter followed by another char ([A-Z].)
       "+0*"           with +0* (cancel out numbers of all other kinds of atoms)

Chúng tôi eval chuỗi kết quả với V. Điều này cho chúng ta 2C + N − X − H. Để có được giá trị chính xác, chúng tôi thực hiện các điều chỉnh sau:

`C\d`Na&1+/2*V...

             V...  Value of expression calculated above
          /2*      multiplied by 1/2
        1+         plus 1
`C\d`Na            Is carbon in the original formula? (i.e. C followed by a digit)
       &           Logical AND: if no carbon, return 0, otherwise return the formula value

0

C (gcc) , 195197 202 byte

Có lẽ là câu trả lời dài nhất.

d,c,b,e,n;f(char*a){for(c=d=0;b=*a;d+=e?e-1?b-66?b-67?0:e-2?0:-n:e-3?0:-n:b-67?b-78?b/70*73/b?-n:0:n:(c=2*n):0)e=*++a>57?*a-108?*a-114?0:3:2:1,a+=e>1,n=strtol(a,&a,10);printf("%.1f",c?d/2.+1:0);}

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

Trả về 0 khi lỗi.

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.