การวาดโครงสร้างลูอิสของอัลเคน


17

ฉันเพิ่งมีบทเรียนในโรงเรียนเกี่ยวกับอัลเคนและคิดว่ามันอาจจะเป็นความท้าทายที่ยิ่งใหญ่สำหรับกอล์ฟ! ไม่ต้องกังวลมันไม่ซับซ้อนอย่างที่เห็น!

Rehash ด่วน

(โปรดทราบ: เพื่อให้ข้อมูลสั้น ๆ นี้ไม่ใช่ข้อมูลทั้งหมดที่ถูกต้อง 100%)

อัลคาเนสเป็นคาร์บอนและไฮโดรเจน อะตอมคาร์บอนทุกอันมีพันธะ 4 พันธะและพันธะไฮโดรเจนทุกอัน 1 อะตอมคาร์บอนทั้งหมดของอัลเคนก่อตัวเป็นสตริงซึ่ง C-atom แต่ละอันเชื่อมต่อกับ C-atoms อีก 2 ตัว (ซ้ายและขวาในโครงสร้าง Lewis) และ 2 H-Atoms (ขึ้นและลง) ยกเว้นปลายของสตริง ที่ C-atom เชื่อมต่อกับ C อื่นเพียง 1 แต่ 3 Hs นี่เป็นตัวอย่างพื้นฐานสำหรับ pentane (อัลเคนที่มี 5 C-atoms และ 12 H-atoms):

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

Alkanes ยังสามารถมีสาขา แต่ไม่ต้องกังวลแอลเคนทั้งหมดในความท้าทายนี้สามารถแสดงออกได้ด้วยการแตกแขนงเพียง 1 ระดับ ตัวอย่าง:

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

สำหรับการทำสิ่งท้าทายนี้ให้สำเร็จคุณต้องเข้าใจแผนการตั้งชื่อของ IUPAC สำหรับ alkanes แยก อย่างแรกคือมีรากอัลเคน ในตัวอย่างก่อนหน้าของเรานี่จะเป็นส่วน "CCCCC" ขึ้นอยู่กับความยาวของสายโซ่นี้มันมีชื่อแตกต่างกัน 1 C เรียกว่ามีเธน, อีเธน 2 C, โพรเพน 3 C, บิวเทน, เพนเทน, เฮกเซน, เฮปเทน, ออกเทน, โนเทนและดีเทน (10 C) จากนั้นสำหรับแต่ละสาขาจะมีคำนำหน้าบางประการ: ประการแรกมีดัชนี (ออฟเซ็ต) ของ C-atom ที่สาขาผนวกเข้ากับ (นับจากซ้าย) ในตัวอย่างนี้จะเป็น 4 (หรือที่เรียกว่า C-atom ลำดับที่ 4 จากด้านซ้าย) จากนั้นจะมีเครื่องหมายยัติภังค์ (สัญลักษณ์นี้: "-") และหลังจากนั้นอีกชื่อหนึ่งระบุขนาดของสาขา การตั้งชื่อขนาดของกิ่งไม้นั้นเกือบจะเหมือนกันกับการตั้งชื่อของขนาดของรูต เพียงแค่แทนที่จะ "ane" คุณผนวก "yl" ด้วยที่ชื่อเต็มของตัวอย่างจะเป็น

4-methylpentane

หากคุณมีสาขาหลายสาขาพวกเขาจะได้รับการเติมด้วยเช่นกันคั่นด้วยยัติภังค์อื่น ตัวอย่าง:

2-butyl-5-methylhexane

สิ่งสุดท้าย: ถ้าคุณมีสาขาที่มีขนาดเท่ากันหลายสาขาพวกเขาจะถูกจัดกลุ่ม offsets ของพวกเขาจะถูกคั่นด้วยเครื่องหมายจุลภาคและพวกเขาใช้ชื่อขนาดเดียวกันซึ่งได้รับการเสริมด้วยพยางค์พิเศษขึ้นอยู่กับจำนวนสาขาที่จัดกลุ่ม: "di" สำหรับ 2 สาขา "tri" สำหรับ 3, "tetra" สำหรับ 4 (คุณ ไม่ต้องการอะไรเพิ่มเติมสำหรับความท้าทายนี้) ตัวอย่าง:

2-ethyl-2,4,6-trimethyldecane

FYI สิ่งนี้อาจมีลักษณะเช่นนี้: (ละเว้น H-atoms)

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

สูตรคำศัพท์

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

กฎระเบียบ

เขียนโปรแกรมที่อ่านในชื่อ IUPAC จาก STDIN ข้อโต้แย้งของโปรแกรมหรือสิ่งที่เทียบเท่าและดึงมันเป็นโครงสร้าง lewis ASCII-art ไปยัง STDOUT (หรือเทียบเท่า)

  • เพื่อความเรียบง่ายคุณไม่จำเป็นต้องวาด H-atoms (มิฉะนั้นคุณจะพบปัญหาระยะห่าง)
  • คุณไม่ได้รับอนุญาตให้พิมพ์เส้นนำหน้าหรือเปล่าในแนวนอน
  • โซ่ที่คุณต้องแยกวิเคราะห์จะไม่เกิน 10 และสูงสุดของสาขาใน "กลุ่ม" ถูก จำกัด ไว้ที่ 4
  • "ออฟเซ็ต" สูงสุดของสาขาคือ 9 (หมายความว่าคุณไม่ต้องแยกวิเคราะห์มากกว่า 1 หลัก)
  • สาขาของคุณจะต้องสลับกันระหว่างการขึ้นและลงหลังจากสาขาใหม่ทุกสาขา ในกรณีที่พื้นที่นี้ถูกยึดโดยสาขาอื่นที่ออฟเซ็ตเดียวกันคุณต้องวาดมันที่อีกด้านหนึ่งของรูท (ขึ้น -> ลงล่าง -> ขึ้น)
  • ในอินพุทที่เสียหายไม่ถูกต้องจัดรูปแบบหรือไม่สามารถดึงได้โปรแกรมของคุณอาจทำงานโดยไม่ระบุรายละเอียด

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดเป็นไบต์ชนะ!

มีความสุขในการเล่นกอล์ฟ! :)


ควรจะ4-methylpropaneพูด4-methylpentaneอย่างไร 4-<anything>propaneดูเหมือนจะเป็นไปไม่ได้เว้นแต่ฉันจะเข้าใจผิดบางอย่าง
ปีเตอร์เทย์เลอร์

ใช่คุณพูดถูก. แก้ไขมัน!
โทมัส Oltmann

4
โมเลกุลสุดท้ายที่คุณมีคือ3-3-5-7-methyldodecaneเพราะโซ่คาร์บอนต่อเนื่องที่ยาวที่สุดคือ 12 ยาว นอกจากนี้คุณบอกว่าไม่ใช่ข้อมูลทั้งหมดในคำถามนั้นถูกต้อง แต่ฉันคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่าโมเลกุลที่สอง2-methylpentaneไม่ใช่4-methylpentaneเพราะคุณเริ่มที่คาร์บอนด้วยการแตกแขนงที่ใกล้เคียงที่สุด
Arcturus

ฉันรู้ แต่นั่นเป็นความไม่ถูกต้องที่ฉันอ้างสิทธิ์ นั่นเป็นเพียงการแลกเปลี่ยนเพื่อให้สั้นพอสำหรับความท้าทายกอล์ฟรหัส! :)
Thomas Oltmann

1
1. Your branches have to alternate between going up and down after every new branch.ตัวอย่างของคุณละเมิดกฎนี้ 2. ความยาวโซ่สูงสุดที่เราต้องสนับสนุนคืออะไร (การแยกคำนำหน้าจะเป็นส่วนหนึ่งของความท้าทาย) คุณควรเชื่อมโยง (หรือคัดลอก) รายการของระบบการตั้งชื่อ
เลเวลริเวอร์เซนต์

คำตอบ:


3

Python 2, 620 ไบต์

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)

คำอธิบาย

การป้อนข้อมูล: '2-ethyl-2,4,6-trimethyldecane'

แยกวิเคราะห์สตริงแรกด้วย regex (กลุ่มสุดท้ายคือรูท):

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

แต่ละสาขาจะเขียนด้วยความยาวlen(root)(จัดการสลับขึ้น / ลงที่นี่):

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

'Left' และ 'Right' ( L,R) และ 'root' ( C) กิ่งก้านของสตริงถูกเริ่มต้น

จากนั้นแต่ละสาขาจะถูกเพิ่มไปยังสาขา 'สตริง' ที่เกี่ยวข้อง (ลูปใหญ่)

พิมพ์สองด้านและกึ่งกลางที่ส่วนท้าย:

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