疯狂的化学家和聪明的程序员


12

背景故事

您在化学实验室醒来时头昏眼花,并且意识到自己被一位老疯子化学家绑架了。由于他的年龄使他看不清视线,因此他希望您为他工作,只有这样,您才可以逃脱实验室。

任务

您的任务是返回分子的结构式,其化学式将作为输入给出。请注意,只有碳(C),氧(O)和氢(H)原子将用作输入。与化学公式不同,a 0是有效的量词,1不能省略a(例如C1H4O0,有效输入,但CH4不是)。

为了避免歧义,我们假设分子中不存在双键和三键。所有碳原子需要4个单键,所有氧原子需要2个,氢原子需要一个。我们还假设O-O债券也不存在。该分子不必存在也不是稳定的。

输入中的3碳原子绝不能超过以确保输出显示中的亮度。

您只应显示碳原子排列成直线而不中断的分子。嗯,没有C-O-C债券。

您必须返回之前规则未排除的所有可能分子。您不需要处理无效的输入。

以下示例显示了该分子必须处理的所有解决方案。

在分子式之一的页面平面上旋转180度被认为是多余的,不需要显示。

在下面的示例中,我将显示一个分子的所有可能的分子式,然后指出不需要显示的分子式。

输入: C2H6O2

首先,这里是此输入的所有可能公式(谢谢@Jonathan Allan)

01        H
          |
          O   H
          |   |
  H - O - C - C - H
          |   |
          H   H

02            H
              |
          H   O
          |   |
  H - O - C - C - H
          |   |
          H   H

03        H   H
          |   |
  H - O - C - C - O - H
          |   |
          H   H

04        H   H
          |   |
  H - O - C - C - H
          |   |
          H   O
              |
              H

05        H   H
          |   |
  H - O - C - C - H
          |   |
          O   H
          |
          H

12        H   H
          |   |
          O   O
          |   |
      H - C - C - H
          |   |
          H   H

13        H
          |
          O   H
          |   |
      H - C - C - O - H
          |   |
          H   H

14        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H


15        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H

23            H
              |
          H   O
          |   |
      H - C - C - O - H
          |   |
          H   H

24            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H

25            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H

34        H   H
          |   |
      H - C - C - O - H
          |   |
          H   O
              |
              H

35        H   H
          |   |
      H - C - C - O - H
          |   |
          O   H
          |
          H

45        H   H
          |   |
      H - C - C - H
          |   |
          O   O
          |   |
          H   H

如果我们在页面平面中旋转了180°,则下面的公式应该在输出中:

01        H
          |
          O   H
          |   |
  H - O - C - C - H
          |   |
          H   H



03        H   H
          |   |
  H - O - C - C - O - H
          |   |
          H   H


12        H   H
          |   |
          O   O
          |   |
      H - C - C - H
          |   |
          H   H

13        H
          |
          O   H
          |   |
      H - C - C - O - H
          |   |
          H   H

14        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H


 15      H
         |
         O   H      
         |   |
     H - C - C - H
         |   |
         O   H
         |
         H 

23            H
              |
          H   O
          |   |
      H - C - C - O - H
          |   |
          H   H



25            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H



35        H   H
          |   |
      H - C - C - O - H
          |   |
          O   H
          |
          H

您无需输出公式的标签,并且当存在两个旋转时可以输出其中一个旋转。例如,您可以输出02或35。

以下是一些有效的输入来测试您的代码:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

化学家为您提供的用于完成任务的PC机已经很旧了,因此您没有足够的内存来保存代码,因此这是并且字节数最短!


我们需要处理环状分子吗?
路加福音

@Luke我提供的输入不能是循环的,因此您不需要进行处理。但是,如果您想处理包含4 C或更高温度的分子,则可以做到这一点并获得奖励积分:)谢谢您的编辑!英语不是我的母语^^

1
您建议的输出缺少许多潜在分子:那里有两个副本propan-1,2-diol,但至少缺少propan-1,1-diol,propan-1,3-diol,propan -2,2-二醇,大量的醇醚以及两个氧原子相互连接的各种化合物。另外,如何指定输出格式?我可以想象分子中的某些键需要拉长一些才能适合所有情况(例如,二甲基丙烷,这显然是一种化学物质)。

2
1.同一碳原子上可能有2个OH基团吗?您似乎已从示例中排除了它,但我在规范中没有看到任何内容表明我们不必考虑(我知道实际上这些化合物与醛处于平衡状态)。2.为什么HOCH2CH2OH与两个OH组都指出示例中缺少唐纳德吗?这不是必需的输出吗?
Level River St

1
3.碳链的输出垂直而不是水平是否可以接受?
水平河圣

Answers:


3

红宝石(275)

->s{(k=4<<2*c=s[1].to_i).times{|i|z=" "*8
t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).chars.map{|j|z+j+z}
(c*2).times{|j|t[4+j&-2][j%2*10,7]="    H - O - H    "[[i>>j/2-1&4,-7-(i>>c*2-j/2-1&4)][j%2],7]}
i*(k+1)>>c+1&k-1<i||("%b"%i).sum%16!=s[5].to_i||i%7>c*3||puts(t)}}

左右侧链和消除变量的组合公式 h

红宝石279

->s{(k=1<<h=2+2*c=s[1].to_i).times{|i|t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).chars.map{|j|(z=" "*8)+j+z}
c.times{|j|t[4+j*2][0,7]="    H - O -"[i>>j-1&4,7]
t[4+j*2][10,7]="- O - H    "[i>>h-j-3&4^4,7]}
i*(k+1)>>h/2&k-1<i||("%b"%i).sum%16!=s[5].to_i||i%7>c*3||puts(t)}}

取消测试程序

f=->s{
  (k=1<<h=2+2*c=s[1].to_i).times{|i|                       #c=number of C atoms. h=number of H (calculated)
                                                           #iterate i from 0 to (k=1<<h)-1

  t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).       #compose a backbone string H-C...C-H. Insert O at the top where bit 0 of i set, and O at the bottom where bit c+1 of i set
  chars.map{|j|(z=" "*8)+j+z}                              #convert string to an array of characters, pad each character left and right with 8 spaces

  c.times{|j|t[4+j*2][0,7]="    H - O -"[i>>j-1&4,7]       #overwrite spaces on left with H or HO according to bits 1 up to c
             t[4+j*2][10,7]="- O - H    "[i>>h-j-3&4^4,7]} #overwrite spaces on right with H or OH according to bits h-1 down to c+1

  i*(k+1)>>h/2&k-1<i||                                     #rotate the bits of i by h/2. if this is less than i, do not output the structure (eliminates rotations by 180deg by outputtng the lexically highest)
  ("%b"%i).sum%16!=s[5].to_i||                             #if the number of 1's in i differs from the number of O's indicated in the input, do not output
  i%7>c*3||                                                #if i%7>c*3, do not output (empirical solution to avoid 90deg rotations for C=1)
  puts(t)                                                  #if the above are all false, output the current structure.
  }
}

f[gets]

输出量

间距按问题输出。每个评论允许的主干垂直而不是水平。整个显示器旋转90度或180度被认为是等效的。

C2H6O2
        H
        |
        O
        |
H - O - C - H
        |
    H - C - H
        |
        H



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





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



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



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



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



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





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





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

很好,当我回到计算机时,我将运行它:)
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.