Der verrückte Chemiker und der kluge Programmierer

12

Hintergrundgeschichte

Sie wachen in einem Chemielabor schwindelig auf und stellen fest, dass Sie von einem alten verrückten Chemiker entführt wurden. Da er aufgrund seines Alters nicht gut sehen kann, möchte er, dass Sie für ihn arbeiten und nur dann können Sie dem Labor entkommen.

Aufgabe

Es ist Ihre Aufgabe, die Strukturformeln der Moleküle zurückzugeben, deren chemische Formel als Eingabe angegeben wird. Beachten Sie, dass nur die Atome Kohlenstoff ( C), Sauerstoff ( O) und Wasserstoff ( H) als Eingabe verwendet werden. Anders als in chemischen Formeln ist a 0ein gültiger Quantifizierer und a 1kann nicht weggelassen werden (z. B. C1H4O0ist eine gültige Eingabe, ist es aber CH4nicht).

Um Mehrdeutigkeiten zu vermeiden, nehmen wir an, dass Doppel- und Dreifachbindungen nicht in den Molekülen auftreten. Alle Kohlenstoffatome benötigen 4 Einfachbindungen, alle Sauerstoffatome 2 und Wasserstoffatome eine. Wir gehen auch davon aus, dass O-Oes auch keine Anleihen gibt. Das Molekül muss weder existieren noch stabil sein.

Der Eingang enthält niemals mehr als 3Kohlenstoffatome, um die Helligkeit des Displays des Ausgangs zu gewährleisten.

Sie sollten nur die Moleküle anzeigen, deren Kohlenstoffatome ohne Unterbrechung in einer geraden Linie angeordnet sind. Ergo keine C-O-CAnleihen.

Sie müssen alle möglichen Moleküle zurückgeben, die von den vorherigen Regeln nicht ausgeschlossen wurden. Sie müssen keine ungültigen Eingaben verarbeiten.

Das folgende Beispiel zeigt alle Lösungen, die Sie für dieses Molekül verarbeiten müssen.

Eine Drehung um 180 Grad in der Ebene der Seite einer der Molekülformeln wird als Redundanz betrachtet und muss nicht angezeigt werden.

Im folgenden Beispiel zeige ich alle möglichen Formeln für ein Molekül und zeige dann diejenigen auf, die nicht angezeigt werden müssen.

Beispiel

Eingang: C2H6O2

Hier sind zunächst alle möglichen Formeln für diese Eingabe (Vielen Dank an @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

Und hier sind die Formeln, die in der Ausgabe enthalten sein sollten, wenn wir die Umdrehungen von 180 ° in der Ebene der Seite herausnehmen:

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

Sie müssen die Beschriftungen der Formeln nicht ausgeben und können eine der Rotationen ausgeben, wenn zwei vorhanden sind. Zum Beispiel können Sie entweder 02 oder 35 ausgeben.

Hier sind einige gültige Eingaben zum Testen Ihres Codes:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

Der PC, den der Chemiker Ihnen zur Erfüllung Ihrer Aufgabe zur Verfügung gestellt hat, ist ziemlich alt, sodass Sie nicht viel Speicher haben, um Ihren Code zu speichern. Dies ist also und die kürzeste Anzahl von Byte-Gewinnen!


quelle
Müssen wir mit zyklischen Molekülen umgehen?
Luke
@Luke Die Eingaben, die ich gegeben habe, können nicht zyklisch sein, daher müssen Sie damit nicht umgehen. Aber wenn du mit Molekülen umgehen willst, die 4 C oder mehr enthalten, kannst du es tun und Bonuspunkte verdienen :) Danke übrigens für die Bearbeitung! Englisch ist nicht meine Muttersprache ^^
1
In der von Ihnen vorgeschlagenen Ausgabe fehlen viele potenzielle Moleküle: Sie haben dort zwei Kopien von Propan-1,2-diol, aber mindestens Propan-1,1-diol, Propan-1,3-diol, Propan -2,2-Diol, eine große Anzahl von Alkoholethern und verschiedene Verbindungen, bei denen die beiden Sauerstoffatome miteinander verbunden sind. Wie angegeben ist außerdem das Ausgabeformat? Ich kann mir Moleküle vorstellen, in die einige der Bindungen länger gezogen werden müssen als andere, um alles hinein zu passen (z. B. Dimethylpropan, das anscheinend eine echte Chemikalie ist ).
2
1. Ist es möglich, 2 OH-Gruppen am selben Kohlenstoff zu haben? Sie scheinen es aus den Beispielen ausgeschlossen zu haben, aber ich sehe nirgendwo in der Spezifikation, dass wir es nicht berücksichtigen müssen (ich weiß in Wirklichkeit, dass diese Verbindungen im Gleichgewicht mit Aldehyden existieren). 2. Warum ist HOCH2CH2OH mit beide OH-Gruppen zeigen nach unten, fehlen im Beispiel? Ist es nicht eine erforderliche Ausgabe?
Level River St
1
3. Ist es akzeptabel, die Ausgänge mit vertikaler statt horizontaler Kohlenstoffkette zu haben?
Level River St

Antworten:

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

Kombinierte Formeln für linke und rechte Seitenketten und eliminierte Variable 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)}}

Ungolfed im Testprogramm

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]

Ausgabe

Der Abstand entspricht der Ausgabe der Frage. Backbone vertikal statt horizontal pro Kommentar erlaubt. Drehungen der gesamten Anzeige um 90 oder 180 Grad werden als gleichwertig angesehen.

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.
quelle
Schön, dass ich es ausführen werde, wenn ich wieder an meinem Computer bin :)