Божевільний хімік і розумний програміст


12

Попередня історія

У вас прокидається запаморочення в хімічній лабораторії, і ви розумієте, що вас викрав старий божевільний хімік. Оскільки він не може добре бачити через свій вік, він хоче, щоб ти працював на нього, і тільки тоді ти можеш уникнути лабораторії.

Завдання

Ваше завдання повернути структурні формули молекул, хімічна формула яких буде подана як вхідна. Зауважте, що в якості вхідних даних будуть використовуватися лише атоми вуглецю ( C), кисню ( O) та водню ( H). На відміну від хімічних формул, a 0є дійсним кількісним показником, 1його неможливо опустити (наприклад 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

Комп'ютер, який хімік дав вам виконати завдання, досить старий, тому у вас немає багато пам'яті, щоб зберегти свій код, таким чином, це і найменший виграш байту!


Чи потрібно обробляти циклічні молекули?
Лука

@Luke Введені мною дані не можуть бути циклічними, тому вам не потрібно це робити. Але якщо ви хочете обробляти молекули, що містять 4 С і більше, ви можете це зробити і заробити бонусний бал :) Дякую за редагування, до речі! англійська мова не моя рідна мова ^^

1
Вихід, який ви запропонували, бракує багато потенційних молекул: у вас є дві копії пропан-1,2-діола там, але не вистачає принаймні пропан-1,1-діол, пропан-1,3-діол, пропан -2,2-діол, велика кількість ефірів спирту та різні сполуки, де два атоми кисню з'єднуються між собою. Крім того, як визначений вихідний формат? Я можу уявити молекули, в яких деякі зв'язки потрібно втягувати довше, ніж інші, щоб усе вмістилося (наприклад, диметилпропан, який, мабуть, справжній хімічний продукт ).

2
1. Чи можливо мати 2 ОН групи на одному вуглеці? Здається, ви виключили це з прикладів, але я не бачу ніде в специфікації, яка говорить про те, що ми не повинні це враховувати (я знаю, що насправді ці сполуки існують в рівновазі з альдегідами) 2. Чому HOCH2CH2OH з обидві групи ОН вказують на відсутність прикладів недоліків? Це не обов’язковий вихід?
Рівень р. Св.

1
3. Чи прийнятно мати виходи з вертикальним вуглецевим ланцюгом замість горизонтального?
Рівень річки Св.

Відповіді:


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

Ungolfed в тестовій програмі

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

Приємно, що я запускаю його, коли повернусь до свого комп’ютера :)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.