Herausforderung
Geben Sie anhand der Formel einer Chemikalie das Mr der Verbindung aus.
Gleichung
Jedem Element in der Verbindung folgt eine Nummer, die die Nummer des Atoms in der Verbindung angibt. Wenn es keine Zahl gibt, gibt es nur eines dieser Atome in der Verbindung.
Einige Beispiele sind:
- Ethanol (C 2 H 6 O) wäre,
C2H6O
wenn es zwei Kohlenstoffatome, 6 Wasserstoffatome und 1 Sauerstoffatom gibt - Magnesiumhydroxid (MgO 2 H 2 ) wäre dort,
MgO2H2
wo es ein Magnesiumatom, zwei Sauerstoffatome und zwei Wasserstoffatome gibt.
Beachten Sie, dass Sie niemals mit Klammern umgehen müssen und jedes Element nur einmal in der Formel enthalten ist.
Während sich die meisten Leute wahrscheinlich an die Reihenfolge halten, in der sie sich am wohlsten fühlen, gibt es kein striktes Bestellsystem. Zum Beispiel kann Wasser entweder als H2O
oder angegeben werden OH2
.
M r
Hinweis: Angenommen, die Formelmasse entspricht der Molekularmasse
Das Mr einer Verbindung, die Molekülmasse, ist die Summe der Atomgewichte der Atome im Molekül.
Die einzigen Elemente und ihre Atomgewichte bis 1 Dezimalstelle, die Sie unterstützen müssen (Wasserstoff bis Kalzium, Edelgase ausgenommen), sind wie folgt. Sie können auch hier gefunden werden
H - 1.0 Li - 6.9 Be - 9.0
B - 10.8 C - 12.0 N - 14.0
O - 16.0 F - 19.0 Na - 23.0
Mg - 24.3 Al - 27.0 Si - 28.1
P - 31.0 S - 32.1 Cl - 35.5
K - 39.1 Ca - 40.1
Sie sollten die Ausgabe immer mit einer Dezimalstelle versehen.
Zum Beispiel hat Ethanol ( C2H6O
) ein Mr von, 46.0
da es die Summe der Atomgewichte der Elemente in ihm ist:
12.0 + 12.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 16.0
(2*C + 6*H + 1*O)
Eingang
Eine einzelne Zeichenfolge im obigen Format. Sie können garantieren, dass die in der Gleichung enthaltenen Elemente tatsächliche Elementsymbole sind.
Es wird nicht garantiert, dass die angegebene Verbindung in der Realität existiert.
Ausgabe
Die Summe Mr der Verbindung auf 1 Dezimalstelle.
Regeln
Builtins, die auf Element- oder chemische Daten zugreifen, sind nicht erlaubt (sorry Mathematica)
Beispiele
Input > Output
CaCO3 > 100.1
H2SO4 > 98.1
SF6 > 146.1
C100H202O53 > 2250.0
Gewinnen
Kürzester Code in Bytes gewinnt.
Dieser Posten wurde mit Genehmigung von Caird Coinheringaahing angenommen . (Beitrag jetzt gelöscht)
quelle
2H2O
?NumberForm[#&@@#~ChemicalData~"MolecularMass",{9,1}]&
Antworten:
Gelee , 63 Bytes
Ein monadischer Link, der eine Liste von Zeichen akzeptiert und eine Zahl zurückgibt.
Probieren Sie es online!
Wie?
quelle
Python 3 ,
189 182168 Bytes-14 Bytes mit dem Hash aus Justin Mariners JavaScript (ES6) -Antwort .
Probieren Sie es online!
Unten ist die 182-Byte-Version, ich lasse die Erklärung für diese - das Obige ändert nur die Reihenfolge der Gewichte, verwendet
int
, um den Elementnamen von der Basis zu konvertieren29
, und verwendet verschiedene Dividenden, um den Bereich der ganzen Zahlen nach unten zu komprimieren - siehe Justin Mariners Antwort .Eine unbenannte Funktion, die eine Zeichenfolge akzeptiert
s
und eine Zahl zurückgibt.Probieren Sie es online!
Wie?
Verwendet einen regulären Ausdruck, um die Eingabe
s
in die Elemente und ihre Anzahl zu unterteilen. Dabei wird Folgendes verwendet:re.findall("(\D[a-z]?)(\d*)",s)
\D
Stimmt genau mit einer Nicht-Ziffer[a-z]?
überein und stimmt mit 0 oder 1 Kleinbuchstaben überein, wobei übereinstimmende Elemente zusammengefasst werden.\d*
Stimmt mit 0 oder mehr Ziffern überein. Die Klammern unterteilen diese in zwei Gruppen und geben als solchefindall("...",s)
eine Liste mit Tupeln von Zeichenfolgen zurück[(element, number),...]
.Die Zahl ist einfach zu extrahieren, ist das einzige , was zu behandeln , die eine leere Zeichenfolge Mittel 1, das mit einer logischen erreicht wird ,
or
da Python Strings sind Falsey:int(n or 1)
.Der Elementkette wird eine eindeutige Nummer gegeben, indem das Produkt der Ordinalzahlen des ersten und des letzten Zeichens genommen wird (normalerweise sind dies die gleichen, z. B. S oder C, aber wir müssen zwischen Cl, C, Ca und Na unterscheiden, damit wir nicht einfach eine verwenden können Charakter).
Diese Zahlen werden dann gehasht, um einen viel kleineren Bereich von [0,18] abzudecken, der durch Durchsuchen des Modulo-Raums gefunden wird, was zu führt
%1135%98%19
. Zum Beispiel"Cl"
hat Ordnungszahlen67
und108
welche multiplizieren zu geben7736
, welche Modulo1135
ist426
, welche Modulo98
ist34
, welche Modulo19
ist15
; Diese Zahl wird verwendet, um eine Liste von ganzen Zahlen zu indizieren - der 15. (0-indizierte) Wert in der Liste[16,31,40.1,32.1,0,24.3,12,39.1,28.1,19,0,9,10.8,23,27,35.5,6.9,14,1]
ist
35.5
das Atomgewicht von Cl, das dann mit der Anzahl solcher Elemente multipliziert wird (wie oben gefunden).Diese Produkte werden dann mit addiert
sum(...)
.quelle
PHP , 235 Bytes
Probieren Sie es online!
Stattdessen
array_combine([H,Li,Be,B,C,N,O,F,Na,Mg,Al,Si,P,S,Cl,K,Ca],[1,6.9,9,10.8,12,14,16,19,23,24.3,27,28.1,31,32.1,35.5,39.1,40.1])
können Sie[H=>1,Li=>6.9,Be=>9,B=>10.8,C=>12,N=>14,O=>16,F=>19,Na=>23,Mg=>24.3,Al=>27,Si=>28.1,P=>31,S=>32.1,Cl=>35.5,K=>39.1,Ca=>40.1]
mit der gleichen Bytezahl arbeitenquelle
JavaScript (ES6), 150 Byte
Inspiriert von Jonathan Allans Python-Antwort , in der er erklärte, jedem Element eine eindeutige Nummer zu geben und diese Nummern in einen kleineren Bereich zu bringen.
Die Elemente wurden zu eindeutigen Zahlen gemacht, indem sie als Basis 29 (0-9 und AS) interpretiert wurden. Dann stellte ich fest, dass
%633%35%18
sich die Werte auf den Bereich von beschränken,[0, 17]
während die Eindeutigkeit erhalten bleibt.Testschnipsel
quelle
Clojure,
198194 BytesUpdate: besser
for
alsreduce
.Original:
Ich frage mich, ob es eine kompaktere Möglichkeit gibt, die Nachschlagetabelle zu codieren.
quelle
Python 3 , 253 Bytes
Probieren Sie es online!
quelle
Mathematica,
390338329 Bytes9 Bytes gespart, weil ich gerade wach bin und die von mir beabsichtigte Verkürzung verwendet habe.
Version 2.1:
Erläuterung: Ermitteln Sie die Position aller Großbuchstaben. Setzen Sie jeweils einen Punkt vor. Teilen Sie die Zeichenfolge an jedem Punkt. Führen Sie für diese Liste von Teilzeichenfolgen die folgenden Schritte aus: Teilen Sie die Liste anhand von Buchstaben und Ziffern auf. Für diejenigen, die durch Buchstaben getrennt sind, konvertieren Sie die Zeichenfolge in Zahlen. Für diejenigen, die durch Ziffern geteilt sind, ersetzen Sie jede Chemikalie durch ihr Molekulargewicht. Für alle mit einem Molekulargewicht und einer Atomzahl ersetzen Sie es durch das Produkt von ihnen. Sie finden die Summe.
Version 1:
Ich bin mir sicher, dass dies viele Golfplätze sein können (oder nur komplett umgeschrieben). Ich wollte nur herausfinden, wie es geht. (Wird am Morgen darüber nachdenken.)
Erläuterung: Teilen Sie zuerst die Zeichenfolge in Zeichen auf. Falten Sie dann das Array um und fügen Sie Kleinbuchstaben und Zahlen wieder zu ihrem Großbuchstaben hinzu. Fügen Sie am Ende einer Chemikalie eine 1 ohne Nummer hinzu. Führen Sie dann zwei Aufteilungen der Begriffe im Array durch - eine Aufteilung bei allen Zahlen und eine Aufteilung bei allen Buchstaben. Ersetzen Sie zuerst die Buchstaben durch ihre Molmassen und finden Sie dann das Skalarprodukt dieser beiden Listen.
quelle
Python 3 - 408 Bytes
Dies ist hauptsächlich @ovs 'Lösung, da er es um über 120 Bytes reduziert hat ... Siehe die erste Lösung unten.
Probieren Sie es online!
Python 3 -
550 548535 Bytes (Zählung mit Einrückung verloren)10 Bytes dank @cairdcoinheringaahing und 3 dank ovs gespeichert
Ich hatte das persönliche Ziel, kein Regex zu verwenden und es auf die unterhaltsame, altmodische Art und Weise zu tun ... Es stellte sich heraus, dass es 350 Bytes länger war als die Regex-Lösung, aber es verwendet nur die Standardbibliothek von Python ...
Probieren Sie es online!
Wenn irgendjemand bereit ist, Golf zu spielen (mit Einrückungskorrekturen und anderen Tricks ...), wird es zu 100% gut aufgenommen, und es scheint, als gäbe es einen besseren Weg, dies zu tun ...
quelle
for y in g: if str(y[0])==h[i][:h[i].index('-')]:x+=y[1]
mitfor y in g:x+=y[1]*(str(y[0])==h[i][:h[i].index('-')])
if/for/while
in der nächsten Zeile eine gibt. Da dies in jeder eingerückten Zeile der Fall ist, können Sie dadurch keine Bytes speichern.