绘制烷烃的Lewis结构


17

我刚刚在学校上了一堂关于烷烃的课,并且发现这可能会给高尔夫挑战赛带来很大的挑战!不用担心,它并不像看起来那样复杂!

快速重提

(请注意:为简短起见,并非所有信息都是100%准确的。)

烷烃是碳和氢的串。每个碳原子具有4个键,每个氢原子具有1个键。烷烃的所有碳原子形成一个串,其中每个C原子与另外2个C原子(路易斯结构中的左侧和右侧)和2个H原子(上下)连接,但串的末端除外,其中C原子仅连接1个其他C,但连接3 Hs。这是戊烷(具有5个C原子和12个H原子的烷烃)的基本示例:

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

烷烃也可以具有分支。但请放心,此挑战中的所有烷烃都只能用1级支链表示。例:

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

为了完成此挑战,您还必须了解IUPAC支链烷烃的命名约定。首先是根烷烃。在我们之前的示例中,这将是“ CCCCC”部分。根据该链的长度,它有不同的名称。1 C被称为甲烷,2 C乙烷,3 C丙烷,然后是丁烷,戊烷,己烷,庚烷,辛烷,壬烷和癸烷(10 C)。然后,对于每个分支,都有一个特定的前缀:首先,是分支附加到的C原子的索引(偏移)(从左侧开始计数)。在该示例中,该值为4(又是从左数第4个C原子)。然后有一个连字符(此符号:“-”),其后还有另一个名称,指示分支的大小。分支大小的命名几乎与根的大小命名相同,只是您要附加“ yl”而不是“ ane”。这样,示例的全名将是

4-methylpentane

如果您有多个分支,那么它们也将被另一个连字符分隔开。例:

2-butyl-5-methylhexane

最后一件事:如果您有多个相同大小的分支,则将它们分组。它们的偏移量用逗号分隔,并且它们具有相同的大小名称,根据分组的分支数,它们以一个额外的音节作为前缀:“ di”代表2个分支,“ tri”代表3个分支,“ tetra”代表4个(您不需要更多的挑战)。例:

2-ethyl-2,4,6-trimethyldecane

仅供参考,这看起来可能像这样:(省略的H原子)

   |
  -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

规则

编写一个程序,该程序从STDIN,程序参数或等效项中读取此类IUPAC名称,并将其作为ASCII艺术的刘易斯结构绘制到STDOUT(或等效项)中。

  • 为简单起见,您不必绘制H原子(否则您将遇到间距问题)
  • 您不得打印任何空白的前导或尾随水平线
  • 您必须解析的链条的长度不能超过10,并且“组”中分支的最大数量限制为4。
  • 分支的最大“偏移”为9(这意味着您不必解析多于1位数字)
  • 每个新分支之后,分支必须在上升和下降之间交替。如果该空间已经被另一个分支以相同的偏移量占用,则必须在根的另一侧绘制它。(上->下,下->上)
  • 在损坏,格式不正确或其他无法绘制的输入上,您的程序可能行为未指定。

这是代码高尔夫球,最短的代码以字节为单位获胜!

打高尔夫球快乐!:)


应该4-methylpropane4-methylpentane什么?4-<anything>propane似乎不太可能,除非我完全误解了一些东西。
彼得·泰勒

你是对的。编辑了!
Thomas Oltmann

4
您拥有的最后一个分子是3-3-5-7-methyldodecane因为最长的连续碳链为12长。另外,您说问题中的信息并非全部准确,但我认为值得指出的是第二个分子是2-methylpentane,不是4-methylpentane因为您从具有最接近分支的碳开始。
Arcturus

我知道,但这就是我所否认的不准确之处。这只是为了使它足够短以应对代码高尔夫球挑战的权衡!:)
Thomas Oltmann 2015年

1
1. Your branches have to alternate between going up and down after every new branch.您的示例违反了此规则。2.我们必须支持的最大链长是多少(解析前缀将成为挑战的一部分。)您应链接(或最好复制)命名表。
水平河圣

Answers:


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'

首先用正则表达式解析为字符串(最后一组是根):

[[[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]]

初始化“左”和“右”(L,R)和“根”(C)字符串分支。

然后将每个分支添加到相应的“字符串”分支(大循环)。

两侧和中间都印在末尾:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.