Herausforderung
Geben Sie angesichts der hochauflösenden Molekülmasse eines organischen Moleküls die Molekülformel des Moleküls aus.
Erläuterung
Die Eingabe ist eine einzelne Zahl mit drei Dezimalstellen Genauigkeit, der relativen Molekülmasse des Moleküls.
Hier ist die Molekülmasse als die Summe der Massen der Atome in der Verbindung definiert. Da Sie nur die Molekülformeln organischer Verbindungen finden, müssen Sie folgende Atommassen kennen:
- C , Kohlenstoff: 12,011
- H , Wasserstoff: 1,008
- O , Sauerstoff: 15,999
- N , Stickstoff: 14.007
Ihre Formel sollte immer nur Kohlenstoff, Wasserstoff, Sauerstoff oder Stickstoff enthalten.
Beim Schreiben der Formel sollte sie folgende Form annehmen:
CaHbOcNd
Wobei die Elemente in dieser Reihenfolge sein muss ( C -> H -> O -> N
so C2O8N4H6
sollte sein C2H6O8N4
) , und a
, b
, c
und d
Zahlen sind , des vorhergehenden Elements in dem Molekül ( das heißt C2
Mittel , dass es zwei Kohlenstoffatomen im Molekül).
Wenn a
, b
, c
oder d
Null ist , sollte das Element nicht in der Formel eingeschlossen werden (zB C2H6O2N0
soll C2H6O2
). Wenn schließlich a
, b
, c
oder d
eins sind, sollten Sie nicht die Nummer in der Formel enthalten (zB C1H4
sollte CH4
).
Die Eingabe ist immer gültig (dh es gibt ein Molekül mit dieser Masse). Wenn die Eingabe nicht eindeutig ist (mehrere Moleküle haben dieselbe Masse), müssen Sie nur eines der Moleküle ausgeben. Wie Sie dieses Molekül auswählen, liegt bei Ihnen.
Gearbeitetes Beispiel
Angenommen, die Eingabe ist 180.156
, dass es nur eine Kombination der Elemente gibt, die diese Molekülmasse haben können:
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156
Es gibt also:
- 6 Kohlenstoffe
- 12 Wasserstoffatome
- 6 Sauerstoff
- 0 Stickstoffatome
Daher sollte Ihre Ausgabe sein:
C6H12O6
Mehr Beispiele
Input -> Output
28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O
Gewinnen
Der kürzeste Code in Bytes gewinnt.
28054
)12.011
ist die relative Atommasse von Kohlenstoff, die ein gewichteter Durchschnitt der relativen Isotopenmassen der Isotope ist. In einem Massenspektrometer, in dem verschiedene Isotope unterschieden werden, sollten Sie genau sehen12
. Ähnliches gilt für andere Atome.672.336
24 mögliche Lösungen enthält, darunter eine reine Stickstoff- und eine reine Wasserstofflösung.Antworten:
Mathematica, 108 Bytes
Reine Funktion, die die Eingabe als Ganzzahl erwartet (1000-fache relative Molmasse); Es gibt alle möglichen Antworten auf STOUD aus (und gibt ein Array von
Null
s zurück).Das schwere Heben erfolgt durch das eingebaute Gerät
{12011,1008,15999,14007}~FrobeniusSolve~#
, das alle nichtnegativen Ganzzahlkombinationen der fest codierten Gewichte findet, die der Eingabe entsprechen.{Characters@"CHON",#}ᵀ
setzt jede solche Kombination in eine Form wie{{"C", 0}, {"H", 1}, {"O", 2}, {"N", 3}}
. (ᵀ
ist eigentlich das private 3-Byte-Mathematica-Zeichen U + F3C7.)Die Transformationsregel
/.a_/;Last@a<2:>Table@@a
ändert Paare des Formulars{x, 0}
in{}
und Paare des Formulars{x, 1}
in{x}
(und spuckt Fehler aus, wenn versucht wird, sie auch auf den gesamten Ausdruck anzuwenden). DannPrint@@Join@@
gibt das Ergebnis in der richtigen Form, die Notwendigkeit vermieden wird, die ganzen Zahlen als Strings und verketten zu werfen.quelle
ᵀ
scheint der falsche Charakter zu sein. Sollte sein
.Python 2 , 242 Bytes
Probieren Sie es online aus!
Rekursive Funktion, die Eingabe ist eine ganze Zahl (1000-fache der relativen Molekülmasse), danke Stephen S für die Idee
Mein Computer benötigte 40 Segmente, um
672336
sichC33H115O3N8
mit diesem geänderten Code zu verwandeln . Es enthält eine Nachschlagetabelle für Treffer / Fehler, um die Anzahl der rekursiven Aufrufe zu reduzieren, und eine Optimierung, um ein Element mehrmals zu zählen (wenn die Masse hoch genug ist).quelle
180156
Zeitüberschreitung auf, wenn alle Testfälle so schnell sind? (ohne den Cache-Treffer)18015
stattdessen sein?18015
istH2O
nichtC6H12O6
JavaScript (ES6),
159158 ByteNicht gerade schnell ...
Demo
Code-Snippet anzeigen
Schnellere Version,
174173 BytesAlle Testfälle
Code-Snippet anzeigen
quelle