Le chimiste fou et le programmeur intelligent

12

Passé

Vous vous réveillez étourdi dans un laboratoire de chimie et vous vous rendez compte que vous avez été kidnappé par un vieux chimiste fou. Comme il ne voit pas très bien à cause de son âge, il veut que vous travailliez pour lui et alors seulement, vous pourrez vous échapper du laboratoire.

Tâche

Il vous appartient de restituer les formules structurales des molécules dont la formule chimique sera donnée en entrée. Notez que seuls les atomes de carbone ( C), d'oxygène ( O) et d'hydrogène ( H) seront utilisés en entrée. Contrairement aux formules chimiques, a 0est un quantificateur valide et a 1ne peut pas être omis (par exemple, C1H4O0est une entrée valide, mais CH4ne l'est pas).

Pour éviter toute ambiguïté, nous supposons que les liaisons doubles et triples n'apparaissent pas dans les molécules. Tous les atomes de carbone ont besoin de 4 liaisons simples, tous les atomes d'oxygène en ont besoin de 2 et les atomes d'hydrogène en ont besoin. Nous supposons également que les O-Oobligations n'existent pas également. La molécule n'a pas besoin d'exister ni d'être stable.

L'entrée ne contiendra jamais plus que 3des atomes de carbone pour assurer la légèreté de l'affichage de la sortie.

Vous ne devez afficher les molécules dont les atomes de carbone sont disposés en ligne droite sans interruption. Ergo, pas de C-O-Cliens.

Vous devez renvoyer toutes les molécules possibles non exclues par les règles précédentes. Vous n'avez pas besoin de gérer des entrées non valides.

L'exemple suivant affiche toutes les solutions que vous devez gérer pour cette molécule.

Une rotation de 180 degrés dans le plan de la page de l'une des formules de la molécule est considérée comme une redondance et n'a pas besoin d'être affichée.

Dans l'exemple ci-dessous, je vais montrer toutes les formules possibles pour une molécule, puis souligner celles qui n'ont pas besoin d'être affichées.

Exemple

Contribution: C2H6O2

Tout d'abord, voici toutes les formules possibles pour cette entrée (Merci à @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

Et voici les formules qui devraient être en sortie si l'on supprime les rotations de 180 ° dans le plan de la page:

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

Vous n'avez pas besoin de sortir les étiquettes des formules et vous pouvez sortir l'une ou l'autre des rotations lorsque deux existent. Par exemple, vous pouvez sortir 02 ou 35.

Voici quelques entrées valides pour tester votre code:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

Le PC que le chimiste vous a donné pour terminer votre tâche est assez ancien, vous n'avez donc pas beaucoup de mémoire pour enregistrer votre code, c'est donc le et le plus court nombre d'octets gagne!


la source
Avons-nous besoin de manipuler des molécules cycliques?
Luke
@Luke Les entrées que j'ai données ne peuvent pas être cycliques, vous n'avez donc pas besoin de gérer cela. Mais si vous voulez manipuler des molécules qui contiennent 4 C ou plus, vous pouvez le faire et gagner un score bonus :) Merci pour l'édition en passant! l'anglais n'est pas ma langue maternelle ^^
1
La sortie que vous avez suggérée manque beaucoup de molécules potentielles: vous avez deux copies de propan-1,2-diol, mais il manque au moins propan-1,1-diol, propan-1,3-diol, propan -2,2-diol, un grand nombre d'éthers d'alcools et divers composés où les deux atomes d'oxygène se connectent l'un à l'autre. De plus, dans quelle mesure le format de sortie est-il spécifié? Je peux imaginer des molécules dans lesquelles certaines des liaisons doivent être étirées plus longtemps que d'autres pour s'adapter à tout (par exemple le diméthylpropane, qui est apparemment un véritable produit chimique ).
2
1. Est-il possible d'avoir 2 groupes OH sur le même carbone? Vous semblez l'avoir exclu des exemples, mais je ne vois nulle part dans la spécification qui dit que nous n'avons pas à le considérer (je sais qu'en réalité ces composés existent en équilibre avec des aldéhydes) 2. Pourquoi le HOCH2CH2OH avec les deux groupes OH pointant vers le bas manquants de l'exemple? N'est-ce pas une sortie requise?
Level River St
1
3. Est-il acceptable d'avoir les sorties avec la chaîne de carbone verticale au lieu d'horizontale?
Level River St

Réponses:

3

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

Formules combinées pour les sidechains gauche et droit et variable éliminée h

Rubis, 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 testé dans le programme de 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]

Production

L'espacement est conforme à la sortie de la question. Épine dorsale verticale au lieu d’horizontale autorisée par les commentaires. Les rotations de l'ensemble de l'affichage sur 90 ou 180 degrés sont considérées comme équivalentes.

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
la source
Bien, je l'exécuterai quand je reviendrai à mon ordinateur :)