미친 화학자와 영리한 프로그래머


12

뒷이야기

화학 실험실에서 현기증을 일으켜 옛 미친 화학자에게 납치되었다는 것을 알게됩니다. 그는 나이 때문에 잘 보지 못하기 때문에, 당신이 그를 위해 일하기를 원하고 그때만 실험실에서 벗어날 수 있습니다.

직무

화학식 이 입력으로 주어질 분자의 구조식 을 반환하는 것이 당신의 임무 입니다. 탄소 ( ), 산소 ( ) 및 수소 ( ) 원자 만 입력으로 사용됩니다. 화학식과 달리 a 는 유효한 수량 자이며 a 는 생략 할 수 없습니다 (예 : 유효한 입력이지만 그렇지 않습니다).COH01C1H4O0CH4

모호성을 방지하기 위해 분자 내에 이중 및 삼중 결합이 나타나지 않는다고 가정합니다. 모든 탄소 원자는 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는 상당히 오래되어서 코드를 저장할 메모리가 많지 않기 때문에 이것은 이며 가장 짧은 바이트 수입니다!


고리 분자를 처리해야합니까?
누가

@Luke 내가 준 입력은 주기적 일 수 없으므로 처리 할 필요가 없습니다. 그러나 4 C 이상을 포함하는 분자를 처리하려면 그것을 수행하고 보너스 점수를 얻을 수 있습니다. :) 편집 해 주셔서 감사합니다! 영어는 내 모국어 ^^ 아니다

1
당신이 제안한 결과에는 많은 잠재적 분자가 빠져 있습니다 : 거기에 2 개의 프로판 -1,2- 디올 사본이 있지만 적어도 프로판 -1,1- 디올, 프로판 -1,3- 디올, 프로판이 없습니다 -2,2- 디올, 다수의 알코올 에테르 및 2 개의 산소 원자가 서로 연결된 다양한 화합물. 또한 출력 형식은 어떻게 지정됩니까? 나는 모든 결합을 위해 일부 결합이 다른 것보다 더 길게 그려 질 필요가있는 분자를 상상할 수있다 (예 : 실제 화학 물질 인 디메틸 프로판 ).

2
1. 같은 탄소에 2 개의 OH 그룹을 가질 수 있습니까? 당신은 예제에서 그것을 배제한 것처럼 보이지만, 우리가 그것을 고려할 필요가 없다고 말하는 스펙의 어느 곳도 보지 못합니다 (실제로이 화합물은 알데히드와 평형으로 존재한다는 것을 알고 있습니다) 2. HOCH2CH2OH가 왜 예제에서 누락 된 다운 어드를 가리키는 두 OH 그룹? 필수 출력이 아닙니까?
Level River St

1
3. 탄소 사슬로 출력물을 수평 대신 수직으로 사용하는 것이 허용됩니까?
Level River 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

내 컴퓨터로 돌아 오면 실행하겠습니다 :)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.