気違いの化学者と賢いプログラマー


12

バックストーリー

あなたは化学実験室でめまいを起こし、古い気違いの化学者に誘されたことに気づきます。彼は彼の年齢のために非常によく見えないので、彼はあなたに彼のために働きたいと望み、その時だけ、あなたは実験室から逃げることができる。

仕事

入力として化学式が与えられる分子の構造式を返すのはあなたの仕事です。炭素()、酸素()および水素()原子のみが入力として使用されることに注意してください。化学式とは異なり、a は有効な量指定子であり、a は省略できません(たとえば、有効な入力ですが、そうではありません)。COH01C1H4O0CH4

あいまいさを防ぐために、二重結合と三重結合が分子に現れないと仮定します。すべての炭素原子には4つの単結合、すべての酸素原子には2、水素原子には1つの単結合が必要です。また、O-O債券も存在しないと想定しています。分子は存在する必要も安定している必要もありません。

3出力の表示の明るさを確保するために、入力に炭素原子以上が含まれることはありません。

中断することなく、炭素原子が直線に配置されている分子のみを表示する必要があります。エルゴ、C-O-C絆なし。

前のルールで除外されていない可能性のあるすべての分子を返す必要があります。無効な入力を処理する必要はありません。

次の例は、その分子に対して処理する必要があるすべてのソリューションを表示します。

分子の式の1つのページの平面での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

数式のラベルを出力する必要はありません。2つの回転が存在する場合は、いずれかの回転を出力できます。たとえば、02または35を出力できます。

コードをテストするための有効な入力を次に示します。

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

あなたのコードを保存することに多くのメモリを必要はありませんので、化学者は、あなたのタスクを完了するためにあなたを与えたPCはかなり古いです、のでこれはやバイトの勝利の最短量!


環状分子を扱う必要がありますか?
ルーク

@Luke私が与えた入力は循環的ではないので、それを処理する必要はありません。ただし、4 C以上を含む分子を処理する場合は、それを実行してボーナススコアを獲得できます:)ところで編集してくれてありがとう!英語は私の母国語ではありません^^

1
提案した出力には、多くの潜在的な分子が欠落しています。プロパン-1,2-ジオールのコピーが2つありますが、少なくともプロパン-1,1-ジオール、プロパン-1,3-ジオール、プロパンが欠落しています-2,2-ジオール、多数のアルコールエーテル、および2つの酸素原子が互いに結合しているさまざまな化合物。また、出力形式はどのように指定されていますか?すべてのものに適合するために、いくつかの結合が他の結合よりも長く引き出される必要がある分子を想像できます(たとえば、本当の化学物質であるジメチルプロパン)。

2
1.同じ炭素上に2つのOH基を持つことは可能ですか?あなたはそれを例から除外しているように見えますが、私たちはそれを考慮する必要がないと言う仕様にはどこにも見当たりません(実際、これらの化合物はアルデヒドと平衡状態で存在します)。両方のOHグループは、例から欠落している下を指していますか?必須の出力ではありませんか?
レベルリバーセント

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

テストプログラムでゴルフをしていない

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.