Codegolf - Безумный Химик И Умный Программист

  • Автор темы AffemeBig44
  • Обновлено
  • 21, Oct 2024
  • #1

Предыстория

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

Задача

Ваша задача вернуть структурные формулы молекул, чьи химическая формула будет дано в качестве входных данных. Обратите внимание, что только углерод (

 
 
 C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2
 
), oxygen ( 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 ) и водород ( 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 ) atoms will be used as input. Unlike in chemical formulas, a C2H6O2 является действительным квантором и C-O-C cannot be omitted (e.g. 3 допустимый ввод, но O-O isn't).

Во избежание неоднозначности будем считать, что в молекулах не возникают двойные и тройные связи. Всем атомам углерода нужны четыре одинарные связи, всем атомам кислорода — две, а атомам водорода — одна. Мы также предполагаем, что CH4 bonds do not exist as well. The molecule does not have to exist nor be stable.

Входные данные никогда не будут содержать более C1H4O0 carbon atoms to ensure lightness in the output's display.

Вам следует отображать только те молекулы, атомы углерода которых расположены в прямую линию без перерыва. Следовательно, нет 1 bonds.

Вы должны вернуться все возможные молекулы, не исключенные предыдущими правилами. Вам не нужно обрабатывать недопустимые входные данные.

В следующем примере показаны все растворы, которые вам нужно обработать для этой молекулы.

Поворот на 180 градусов в плоскости страницы одной из формул молекулы считается избыточностью и не требует отображения.

В примере ниже я покажу все возможные формулы молекулы, а затем укажу те, которые не нужно отображать.

Пример

Вход: 0

Во-первых, вот все возможные формулы для этого ввода (спасибо @Jonathan Allan)

H

А вот формулы, которые должны быть на выходе, если убрать повороты на 180° в плоскости страницы:

O

Вам не нужно выводить метки формул, и вы можете вывести любой из поворотов, если они существуют. Например, вы можете вывести либо 02, либо 35.

Вот несколько допустимых входных данных для проверки вашего кода:

C

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

#код-гольф #код-гольф #строка #ascii-art #химия

AffemeBig44


Рег
25 Oct, 2024

Тем
78

Постов
187

Баллов
597
  • 26, Oct 2024
  • #2

Руби, 275

 
 
 
 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
 

Комбинированные формулы для левой и правой боковых цепей и исключенная переменная 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!=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]

Руби, 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!=s[5].to_i||i%7>c*3||puts(t)}}

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

h

Выход

Интервал соответствует выводу вопроса. В комментариях допускается вертикальное расположение магистрали вместо горизонтального. Повороты всего дисплея на 90 или 180 градусов считаются эквивалентными.

->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!=s[5].to_i||i%7>c*3||puts(t)}}
 

S640


Рег
30 Oct, 2006

Тем
84

Постов
206

Баллов
666
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно