Безумный химик и умный программист

12

Предыстория

У тебя пробуждается головокружение в химической лаборатории, и ты понимаешь, что тебя похитил старый безумный химик. Поскольку он не может хорошо видеть из-за своего возраста, он хочет, чтобы вы работали на него, и только тогда вы можете сбежать из лаборатории.

задача

Ваша задача - вернуть структурные формулы молекул, химическая формула которых будет указана в качестве входных данных. Обратите внимание, что в качестве входных данных будут использоваться только атомы углерода ( C), кислорода ( O) и водорода ( H). В отличие от химических формул, а 0является допустимым квантификатором и 1не может быть опущено (например, C1H4O0является допустимым вводом, но CH4не является).

Чтобы предотвратить двусмысленность, мы предполагаем, что двойные и тройные связи не появляются в молекулах. Все атомы углерода нуждаются в 4 одинарных связях, все атомы кислорода - в 2, а атомы водорода - в одной. Мы также предполагаем, что O-Oоблигации также не существуют. Молекула не должна ни существовать, ни быть стабильной.

На входе никогда не будет больше 3атомов углерода, чтобы обеспечить легкость на дисплее.

Вы только должны отобразить молекулы, атомы углерода которых расположены по прямой линии без перерыва. Ergo, без 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

ПК, который дал вам химик, чтобы выполнить задание, довольно старый, поэтому у вас недостаточно памяти для сохранения кода, поэтому это и самое короткое количество байтов!


источник
Нужно ли нам обращаться с циклическими молекулами?
Лука
@Luke Входные данные, которые я дал, не могут быть циклическими, поэтому вам не нужно обрабатывать это. Но если вы хотите работать с молекулами, которые содержат 4 С или более, вы можете сделать это и заработать бонусную оценку :) Спасибо за редактирование, кстати! английский не мой родной язык ^^
1
В выводе, который вы предложили, пропущено много потенциальных молекул: у вас есть две копии пропан-1,2-диола, но отсутствует по крайней мере пропан-1,1-диол, пропан-1,3-диол, пропан -2,2-диол, большое количество спиртовых эфиров и различные соединения, в которых два атома кислорода соединяются друг с другом. Кроме того, как указан формат вывода? Я могу представить молекулы, в которых некоторые связи должны быть вытянуты дольше, чем другие, чтобы вместить все (например, диметилпропан, который, по- видимому, является настоящим химическим веществом ).
2
1. Возможно ли иметь 2 ОН группы на одном и том же углероде? Вы, кажется, исключили это из примеров, но я не вижу нигде в спецификации, которая говорит, что мы не должны это учитывать (я знаю, что в действительности эти соединения существуют в равновесии с альдегидами) 2. Почему HOCH2CH2OH с обе группы ОН, указывающие вниз, отсутствуют в примере? Разве это не обязательный вывод?
Уровень Река St
1
3. Допустимо ли иметь выходы с углеродной цепочкой вертикальной, а не горизонтальной?
Уровень Река St

Ответы:

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
Уровень реки St
источник
Хорошо, я