뒷이야기
화학 실험실에서 현기증을 일으켜 옛 미친 화학자에게 납치되었다는 것을 알게됩니다. 그는 나이 때문에 잘 보지 못하기 때문에, 당신이 그를 위해 일하기를 원하고 그때만 실험실에서 벗어날 수 있습니다.
직무
화학식 이 입력으로 주어질 분자의 구조식 을 반환하는 것이 당신의 임무 입니다. 탄소 ( ), 산소 ( ) 및 수소 ( ) 원자 만 입력으로 사용됩니다. 화학식과 달리 a 는 유효한 수량 자이며 a 는 생략 할 수 없습니다 (예 : 유효한 입력이지만 그렇지 않습니다).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
화학자가 당신에게 과제를 완수하기 위해 준 PC는 상당히 오래되어서 코드를 저장할 메모리가 많지 않기 때문에 이것은 코드 골프 이며 가장 짧은 바이트 수입니다!
답변
루비, 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