Çılgın kimyager ve zeki programcı


12

backstory

Bir kimya laboratuvarında başım dönüyor ve eski bir deli kimyager tarafından kaçırıldığınızı anlıyorsunuz. Yaşından dolayı çok iyi göremediği için onun için çalışmanı istiyor ve ancak o zaman laboratuvardan kaçabilirsin.

Görev

Kimyasal formülü girdi olarak verilecek moleküllerin yapısal formüllerini iade etmek sizin görevinizdir . Giriş olarak yalnızca karbon ( ), oksijen ( ) ve hidrojen ( ) atomlarının kullanılacağını unutmayın. Kimyasal formüllerin aksine , a geçerli bir nicelik belirtecidir ve bir atlanamaz (örn . Geçerli girdi, ancak değil).COH01C1H4O0CH4

Belirsizliği önlemek için moleküllerde çift ve üçlü bağların görünmediğini varsayıyoruz. Tüm karbon atomları 4 tekli bağa, tüm oksijen atomları 2'ye ve hidrojen atomları bir taneye ihtiyaç duyar. Ayrıca O-Otahvillerin de olmadığını varsayıyoruz . Molekülün var olması veya stabil olması gerekmez.

Giriş 3, çıkış ekranında hafiflik sağlamak için asla karbon atomundan fazlasını içermeyecektir .

Sadece karbon atomları kesintisiz düz bir çizgide dizilmiş molekülleri görüntülemelisiniz. Ergo, C-O-Ctahvil yok .

Önceki kurallar tarafından hariç tutulmayan tüm olası molekülleri iade etmelisiniz . Geçersiz girişleri işlemenize gerek yoktur.

Aşağıdaki örnek, bu molekül için ele almanız gereken tüm çözümleri gösterir.

Molekülün formülünden birinin sayfasının düzleminde 180 derece döndürme fazlalık olarak kabul edilir ve görüntülenmesine gerek yoktur.

Aşağıdaki örnekte, bir molekül için olası tüm formülleri göstereceğim, sonra görüntülenmesi gerekmeyenlere dikkat çekeceğim.

Misal

Giriş: C2H6O2

İlk olarak, bu giriş için olası tüm formüller (@Jonathan Allan'a teşekkürler)

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

Ve sayfanın düzleminde 180 ° dönüşleri çıkarırsak, çıktıda olması gereken formüller şunlardır:

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

Formüllerin etiketlerinin çıktısını almanıza gerek yoktur ve ikisi mevcut olduğunda rotasyonlardan birini çıktı alabilirsiniz. Örneğin, 02 veya 35 çıktısını alabilirsiniz.

Kodunuzu test etmek için bazı geçerli girişler şunlardır:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

Kimyager görevinizi tamamlamak için size verilen PC oldukça eskidir, bu nedenle kodunuzu kaydetmek için çok fazla belleğiniz yoktur, bu nedenle bu ve en kısa bayt kazanır!


Siklik molekülleri işlememiz gerekir mi?
Luke

@Luke Verdiğim girdiler döngüsel olamaz, bu yüzden işlemeniz gerekmez. Ancak 4 C veya daha fazla içeren molekülleri işlemek istiyorsanız bunu yapabilir ve bonus puanı kazanabilirsiniz :) Bu arada düzenleme için teşekkürler! İngilizce benim ana dilim değil ^^

1
Önerdiğiniz çıktıda çok fazla potansiyel molekül eksik: orada iki propan-1,2-diol kopyası var, ancak en azından propan-1,1-diol, propan-1,3-diol, propan eksik -2,2-diol, çok sayıda alkol eteri ve iki oksijen atomunun birbirine bağlandığı çeşitli bileşikler. Ayrıca, çıktı biçimi nasıl belirlenir? Bazı bağların her şeye sığması için diğerlerinden daha uzun çekilmesi gereken molekülleri hayal edebilirim (örneğin, görünüşe göre gerçek bir kimyasal olan dimetilpropan ).

2
1. Aynı karbon üzerinde 2 OH grubuna sahip olmak mümkün müdür? Bunu örneklerden hariç tutmuş gibi görünüyorsunuz, ancak spesifikasyonda dikkate almamız gerekmediğini söyleyen bir şey görmüyorum (gerçekte bu bileşiklerin aldehitler ile dengede olduğunu biliyorum) 2. HOCH2CH2OH neden her iki OH grubu da örnekten eksik olana doğru bakıyor? Gerekli bir çıktı değil mi?
Level River St

1
3. Çıktıların yatay yerine karbon zinciri dikey olması kabul edilebilir mi?
Level River St

Yanıtlar:


3

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

Sol ve sağ yan zincirler ve elenen değişken için birleşik formüller h

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

Test programında yönlendirilmemiş

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]

Çıktı

Boşluk, soru çıktısına göredir. Yorum başına yatay yerine dikey omurga dikey. Tüm ekranın 90 veya 180 derece dönüşleri eşdeğer kabul edilir.

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

Nice Bilgisayarıma geri döndüğümde çalıştırırım :)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.