Ahli kimia gila dan programmer pintar

12

Backstory

Anda terbangun pusing di laboratorium kimia, dan Anda sadar telah diculik oleh seorang ahli kimia tua yang gila. Karena dia tidak bisa melihat dengan baik karena usianya, dia ingin kamu bekerja untuknya dan hanya dengan begitu, kamu bisa lolos dari laboratorium.

Tugas

Adalah tugas Anda untuk mengembalikan formula struktural molekul yang rumus kimianya akan diberikan sebagai input. Perhatikan bahwa hanya atom karbon ( C), oksigen ( O), dan hidrogen ( H) yang akan digunakan sebagai input. Tidak seperti dalam rumus kimia, a 0adalah quantifier yang valid dan a 1tidak dapat dihilangkan (mis. C1H4O0Input yang valid, tetapi CH4tidak).

Untuk mencegah ambiguitas, kami mengasumsikan ikatan rangkap dan rangkap tiga tidak muncul dalam molekul. Semua atom karbon membutuhkan 4 ikatan tunggal, semua atom oksigen membutuhkan 2, dan atom hidrogen membutuhkan satu. Kami juga berasumsi bahwa O-Oobligasi juga tidak ada. Molekul tidak harus ada atau stabil.

Input tidak akan mengandung lebih dari 3atom karbon untuk memastikan cahaya pada tampilan output.

Anda hanya harus menampilkan molekul yang atom karbonnya tersusun dalam garis lurus tanpa henti. Ergo, tidak ada C-O-Cikatan.

Anda harus mengembalikan semua molekul yang mungkin tidak dikecualikan oleh aturan sebelumnya. Anda tidak perlu menangani input yang tidak valid.

Contoh berikut menampilkan semua solusi yang harus Anda tangani untuk molekul itu.

Rotasi 180 derajat pada bidang halaman salah satu rumus molekul dianggap redundansi dan tidak perlu ditampilkan.

Pada contoh di bawah ini saya akan menunjukkan semua formula yang mungkin untuk sebuah molekul, kemudian tunjukkan yang tidak perlu ditampilkan.

Contoh

Memasukkan: C2H6O2

Pertama, inilah semua formula yang mungkin untuk input ini (Terima kasih kepada @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

Dan berikut ini rumus-rumus yang harus ada dalam output jika kita mengeluarkan rotasi 180 ° pada bidang halaman:

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

Anda tidak perlu menampilkan label rumus dan Anda dapat menampilkan salah satu rotasi ketika ada dua. Misalnya Anda dapat menampilkan 02 atau 35.

Berikut adalah beberapa input yang valid untuk menguji kode Anda:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

PC yang diberikan ahli kimia untuk menyelesaikan tugas Anda sudah cukup lama sehingga Anda tidak memiliki banyak memori untuk menyimpan kode Anda, jadi ini adalah dan jumlah byte terkecil yang menang!


sumber
Apakah kita perlu menangani molekul siklik?
Luke
@ Lukas Input yang saya berikan tidak bisa siklik sehingga Anda tidak perlu mengatasinya. Tetapi jika Anda ingin menangani molekul yang mengandung 4 C atau lebih, Anda dapat melakukannya dan mendapatkan skor bonus :) Terima kasih sudah menyuntingnya! bahasa inggris bukan bahasa ibu saya ^^
1
Output yang Anda sarankan hilang banyak molekul potensial: Anda memiliki dua salinan propan-1,2-diol di sana, tetapi setidaknya ada setidaknya propan-1,1-diol, propan-1,3-diol, propan -2,2-diol, sejumlah besar eter alkohol, dan berbagai senyawa tempat kedua atom oksigen saling terhubung. Selain itu, seberapa ditentukan format output? Saya bisa membayangkan molekul-molekul di mana beberapa ikatan perlu ditarik lebih panjang daripada yang lain agar cocok dengan semua yang ada di dalamnya (misalnya dimethylpropane, yang tampaknya merupakan bahan kimia nyata ).
2
1. Apakah mungkin untuk memiliki 2 gugus OH pada karbon yang sama? Anda tampaknya telah mengecualikannya dari contoh, tetapi saya tidak melihat di mana pun dalam spesifikasi yang mengatakan kita tidak perlu mempertimbangkannya (saya tahu pada kenyataannya senyawa ini ada dalam kesetimbangan dengan aldehida) 2. Mengapa HOCH2CH2OH dengan kedua kelompok OH menunjukkan kelemahan yang hilang dari contoh? Bukankah itu output yang dibutuhkan?
Level River St
1
3. Apakah dapat diterima untuk memiliki output dengan rantai karbon vertikal dan bukan horizontal?
Level River St

Jawaban:

3

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

Rumus gabungan untuk sidechains kiri dan kanan dan variabel dihilangkan h

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

Tidak digabungkan dalam program uji

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]

Keluaran

Spasi sesuai dengan output pertanyaan. Tulang punggung vertikal alih-alih horizontal diizinkan per komentar. Rotasi seluruh tampilan melalui 90 atau 180 derajat dianggap setara.

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
Level River St
sumber
Bagus saya akan menjalankannya ketika saya kembali ke komputer saya :)