ระดับของความไม่พอใจ


11

ระดับของความไม่พอใจ

นี่ไม่ใช่ปริศนาโค้ดยากโดยเฉพาะ - แต่ฉันสนใจที่จะเห็นวิธีแก้ปัญหาของคุณหลายวิธี

ระดับความไม่อิ่มตัวคือจำนวนพันธะเคมีสองชั้นระหว่างอะตอมและ / หรือจำนวนวงแหวนในสารประกอบทางเคมี

คุณจะได้รับสูตรโมเลกุลของสารประกอบทางเคมีในรูปแบบ XaYbZc (โดยที่ a, b และ c คือจำนวนอะตอมของ X, Y หรือ Z ในสารประกอบ) - สูตรอาจมีความยาวเท่าใดก็ได้และมีองค์ประกอบทางเคมีใด ๆ ในตารางธาตุ (แม้ว่าองค์ประกอบอื่นที่ไม่ใช่ C, H, N, F, Cl, Br, ฉันอาจถูกเพิกเฉยเนื่องจากไม่มีคุณสมบัติในสูตร) สารประกอบนี้จะประกอบด้วยคาร์บอนอย่างน้อยหนึ่งอะตอม คุณต้องคำนวณและแสดงระดับของความไม่พอใจ

ตัวอย่างเช่นสารประกอบเบนซีน (ในภาพด้านล่าง) มี DoU เป็น 4 เนื่องจากมีพันธะสองเท่า (แสดงโดยเส้นสองเส้นระหว่างอะตอม) และวงแหวนเดี่ยว (จำนวนอะตอมที่เชื่อมต่อในวง):

แหวนเบนซิน

ตามที่กำหนดโดยLibreTexts :

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

ที่ไหน:

  • C คือจำนวนอะตอมคาร์บอน
  • N คือจำนวนอะตอมไนโตรเจน
  • X คือจำนวนของอะตอมฮาโลเจน ( F, Cl, Br, I)
  • H คือจำนวนอะตอมไฮโดรเจน

กรณีทดสอบ:

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

สำหรับคำอธิบายของ CH ดูที่นี่

ในสาระสำคัญคุณต้องระบุว่ามีองค์ประกอบใด ๆ ข้างต้น (C, H, N, F, Cl, Br, I) ในสารประกอบและหากมีจำนวนเท่าใด จากนั้นให้คำนวณระดับความไม่พอใจโดยใช้สูตรด้านบน

เฉพาะ C, H, N, F, Cl, Br และ I เป็นอินพุตที่ถูกต้องสำหรับสูตร DoU สำหรับจุดประสงค์ของจิ๊กซอว์องค์ประกอบอื่น ๆ อาจถูกเพิกเฉยได้อย่างสมบูรณ์ (เช่นถ้าสารประกอบเป็น C6H6Mn ผลลัพธ์จะยังคงเป็น 4) ถ้าไม่มีสารประกอบใด ๆ ข้างต้นคำตอบก็จะเป็นศูนย์

คุณอาจสันนิษฐานได้ว่าสารประกอบทั้งหมดนั้นมีความเป็นไปได้ทางเคมีประกอบด้วยอะตอมของคาร์บอนอย่างน้อยหนึ่งอะตอม หากอินพุตไม่ถูกต้องโปรแกรมอาจแสดงผลลัพธ์เป็น 0 หรือ -1 หรือสร้างผลลัพธ์ไม่ได้

กฎระเบียบ

มาตรฐาน IO กฎและช่องโหว่ใช้ อินพุตต้องเป็นสตริงมาตรฐานและคุณสามารถสมมติว่าอินพุตไม่ว่างเปล่า นี่คือ codegolf - ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


เสนอกรณีทดสอบ: โซเดียมออกไซด์: Na2Oและ Methylidyne: และCH CCl4Heเหล่านี้คือบางกรณีมุมที่อาจแบ่งการแก้ไขปัญหาเล็กน้อย โดยวิธีการที่ไม่สำคัญสำหรับใครอื่นที่ไม่ใช่ Mathematica (อาจ) แต่เราสามารถสรุปได้ว่าสารประกอบ (สามารถ) มีอยู่จริงหรือไม่?
Stewie Griffin

C9H2O1 --> 0ฉันไม่เข้าใจ ไม่ควรจะเป็น 9 หรือ (2*9+2+0-0-2)/2
DLosc

ตามย่อหน้าสุดท้ายคุณหมายถึงรหัสจะต้องสามารถจัดการกับอินพุตที่ไม่ถูกต้องได้หรือไม่ โดยวิธีการนี้รับประกันได้หรือไม่ว่าทุกองค์ประกอบในสารประกอบมี "1" ต่อท้ายเหมือนใน C1H1
Keyu Gan

@KeyuGan ใช่และใช่
Archie Roques

คำตอบ:


2

JavaScript (ES6), 117 112 ไบต์

ส่งคืน0สำหรับอินพุตที่ไม่ถูกต้อง

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

กรณีทดสอบ

รุ่นสำรอง 103 ไบต์

หากข้อมูลเข้าได้รับการรับรองว่าถูกต้อง - เนื่องจากการแนะนำการท้าทายนั้นเป็นการแนะนำที่ทำให้เข้าใจผิด - เราสามารถทำได้:

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)

การสาธิต


2

Python 3 , 142 151 148 ไบต์

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)

ส่งคืน 0 เนื่องจากข้อผิดพลาด

ขอบคุณ @HyperNeutrino ทำให้จำนวนไบต์ลดลง

ลองออนไลน์!


oops - อัปเดตกรณีทดสอบแล้ว!
Archie Roques


@HyperNeutrino กรณีทดสอบไม่ชัดเจนสักนิด ตอนนี้ไม่มีเอาต์พุตสำหรับอินพุตที่ไม่ถูกต้อง
MooseOnTheRocks


ใช้ดีที่dictนั่น!
DLosc

0

Pip , 70 67 ไบต์

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

ใช้สูตรทางเคมีเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เอาต์พุต0สำหรับอินพุตที่ไม่ถูกต้อง ลองออนไลน์!

คำอธิบาย

ใช้ชุดของการเปลี่ยน regex เพื่อเปลี่ยนสูตรทางเคมีให้เป็นสูตรทางคณิตศาสตร์ evals และทำการปรับแต่งสองสามครั้งเพื่อให้ได้ค่าสุดท้าย

การแทนที่ (เวอร์ชั่นที่ไม่ได้รับเกียรติเล็กน้อย):

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)

เรา eval Vสตริงที่เกิดกับ 2C + N − X − Hนี้จะช่วยให้เรา เพื่อให้ได้ค่าที่ถูกต้องเราทำการปรับเปลี่ยนดังต่อไปนี้:

`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 ไบต์

อาจเป็นคำตอบที่ยาวที่สุด

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);}

ลองออนไลน์!

ส่งคืน 0 เนื่องจากข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.