Il chimico pazzo e il programmatore intelligente


12

backstory

Ti svegli vertigini in un laboratorio di chimica e ti rendi conto di essere stato rapito da un vecchio chimico pazzo. Dal momento che non riesce a vedere molto bene a causa della sua età, vuole che tu lavori per lui e solo allora puoi fuggire dal laboratorio.

Compito

È tuo compito restituire le formule strutturali delle molecole la cui formula chimica verrà data come input. Si noti che solo gli atomi di carbonio ( C), ossigeno ( O) e idrogeno ( H) verranno utilizzati come input. A differenza delle formule chimiche, a 0è un quantificatore valido e a 1non può essere omesso (ad es. C1H4O0È un input valido, ma CH4non lo è).

Per prevenire l'ambiguità, supponiamo che nelle molecole non compaiano doppi e tripli legami. Tutti gli atomi di carbonio hanno bisogno di 4 legami singoli, tutti gli atomi di ossigeno ne hanno bisogno 2 e gli atomi di idrogeno ne hanno bisogno. Supponiamo anche che O-Onon esistano obbligazioni. La molecola non deve esistere né essere stabile.

L'ingresso non conterrà mai più di 3atomi di carbonio per garantire leggerezza nel display dell'uscita.

Dovresti solo visualizzare le molecole i cui atomi di carbonio sono disposti in linea retta senza interruzioni. Ergo, nessun C-O-Clegame.

È necessario restituire tutte le possibili molecole non escluse dalle regole precedenti. Non è necessario gestire input non validi.

L'esempio seguente mostra tutte le soluzioni che devi gestire per quella molecola.

Una rotazione di 180 gradi nel piano della pagina di una formula della molecola è considerata una ridondanza e non deve essere visualizzata.

Nell'esempio seguente mostrerò tutte le possibili formule per una molecola, quindi indicherò quelle che non devono essere visualizzate.

Esempio

Ingresso: C2H6O2

Innanzitutto, ecco tutte le possibili formule per questo input (Grazie a @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

E qui ci sono le formule che dovrebbero essere nell'output se eliminiamo le rotazioni di 180 ° nel piano della pagina:

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

Non è necessario emettere le etichette delle formule ed è possibile produrre una delle rotazioni quando ne esistono due. Ad esempio, è possibile emettere 02 o 35.

Ecco alcuni input validi per testare il tuo codice:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

Il PC che il chimico ti ha dato per completare il tuo compito è piuttosto vecchio, quindi non hai molta memoria per salvare il tuo codice, quindi questo è e vince il minor numero di byte!


Dobbiamo gestire le molecole cicliche?
Luca,

@Luke Gli input che ho fornito non possono essere ciclici, quindi non è necessario gestirli. Ma se vuoi gestire molecole che contengono 4 C o più, puoi farlo e guadagnare un punteggio bonus :) Grazie per la modifica a proposito! l'inglese non è la mia lingua madre ^^

1
L'output che hai suggerito manca di molte potenziali molecole: ci sono due copie di propan-1,2-diolo, ma manca almeno propan-1,1-diolo, propan-1,3-diolo, propan -2,2-diolo, un gran numero di eteri alcolici e vari composti in cui i due atomi di ossigeno si collegano tra loro. Inoltre, quanto è specificato il formato di output? Posso immaginare molecole in cui alcuni dei legami devono essere disegnati più a lungo di altri per adattarsi a tutto (ad esempio dimetilpropano, che apparentemente è un vero prodotto chimico ).

2
1. È possibile avere 2 gruppi OH sullo stesso carbonio? Sembra che tu l'abbia escluso dagli esempi, ma non vedo da nessuna parte nelle specifiche che non dobbiamo considerarlo (so in realtà che questi composti esistono in equilibrio con le aldeidi) 2. Perché l'HOCH2CH2OH è entrambi i gruppi OH puntano verso il basso mancanti nell'esempio? Non è un output richiesto?
Level River St

1
3. È accettabile che le uscite con la catena del carbonio siano verticali anziché orizzontali?
Level River St

Risposte:


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

Formule combinate per sidechain sinistro e destro e variabile eliminata 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)}}

Non registrato nel programma di test

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]

Produzione

La spaziatura è come da output della domanda. Backbone verticale anziché orizzontale consentito per commenti. Rotazioni dell'intero display di 90 o 180 gradi considerate equivalenti.

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

Bello lo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.