Aufgabe
Schreiben Sie ein Programm, das eine Verbindung nur aus Elementen mit einer Ordnungszahl kleiner oder gleich 92 (Uran) aufnimmt und die Molmasse der Verbindung in ausgibt grams/mole
.
Regeln und Einschränkungen
- Sie dürfen keine Funktion verwenden, die Molmassen direkt für Sie berechnet.
- Ihr Programm muss auf einem Offline-Computer ausgeführt werden können.
- Sie können eine separate Datendatei verwenden. Der Inhalt dieser Datei muss zur Verfügung gestellt werden.
- Ihre Punktzahl ist die Länge Ihres Programms in Bytes sowie die Länge Ihrer Datendatei in Bytes, falls Sie eine verwenden möchten.
- Dies ist Code-Golf , daher gewinnt die niedrigste Punktzahl.
Eingang
Eine Zeichenfolge, die die Verbindung enthält. Diese Zeichenfolge kann gelesen STDIN
, als Argument übergeben oder auf eine Variable gesetzt werden (bitte angeben, welche). Folgendes sind alle gültigen Eingaben:
CH2
(ein Kohlenstoff, zwei Wasserstoff)(CH2)8
(8 Kohlenstoffe, 16 Wasserstoffe)U
(1 Uran)
Ihr Programm muss weder für eingebettete Klammern (dh ((CH3)2N4)4
) noch für eine Verbindung funktionieren , die ein Element mit einer Ordnungszahl größer als 92 enthält. Wenn Ihr Programm in keinem der beiden oben genannten Fälle funktioniert, muss es in Invalid formula
diesen Fällen Folgendes ausgeben : kein undefiniertes Verhalten.
Ausgabe
Sie sollten STDOUT
die Molmasse der Verbindung in oder auf eine Variable ausgeben grams/mole
. Eine Liste der Atommassen von Elementen finden Sie hier (Wikipedia) . Ihre Antwort sollte bei Verbindungen mit weniger als 100 Atomen (gerundet) auf die Dezimalstelle genau sein.
Ist die Eingabe ungültig, Invalid formula
muss ausgegeben werden.
Informationen zur Berechnung der Molmasse einer Verbindung in grams/mole
(Wikipedia).
Beispiele
Input Output
H2O 18.015
O 15.999 (16 acceptable)
C6H2(NO2)3CH3 227.132
FOOF 69.995
C6H12Op3 Invalid formula
Np 237 (or Invalid formula)
((C)3)4 144.132 (or Invalid formula)
CodeGolf Invalid formula
U1000000
ist schwerer bis zum Komma zu bestimmen als die Masse vonU2
13
wenn die Atommasse ist12.999
?Antworten:
Bash,
978 708 675 673 650 636 632 631 598594211 Bytes für das Programm und 382 Bytes für die Daten.
Eingang ist auf STDIN, Ausgang ist auf STDOUT. WARNUNG: Erstellt aufgerufene Dateien
g
unda
falls vorhanden, werden diese überschrieben!Datendatei
Dies erfordert eine Datei namens
y
, die die zopfli- komprimierte Form dieser Daten ist (kein abschließender Zeilenumbruch). zopfli ist ein gzip-kompatibler Komprimierungsalgorithmus und kann mit Standard-gzip-Tools dekomprimiert werden. Es wurde mit 1024 Iterationen ausgeführt (dies ist wahrscheinlich zu viel). Die letzten 8 Bytes wurden dann entfernt.Die base64 von
y
is (wirdbase64 -d
zum Reproduzieren der Originaldatei verwendet):Die md5sum ist
d392b0f5516033f2ae0985745f299efd
.Erläuterung
Die Zahlen in der Datei sind Inkremente der relativen Atommasse (also der relativen Atommasse von Lithium
1.008 + 0 + 2.995 + 2.937
).Dieses Skript konvertiert die chemische Formel in einen arithmetischen Ausdruck mit
+
und*
ersetzt jedes Symbol durch seine relative Atommasse und gibt dann den Ausdruck anbc
. Wenn die Formel ungültige Symbole enthält,bc
wird ein Syntaxfehler ausgegeben und nichts an STDOUT ausgegeben. in diesem Fall ist die AusgabeInvalid formula
.Wenn STDIN leer ist, ist die Ausgabe
0
. Geschachtelte Klammern werden unterstützt.Beispiel
quelle
Perl - 924
Es verwendet eine Reihe von regulären Ersetzungsoperationen für die eingegebene Formel, um die tiefgestellten Elemente und Gruppen zu erweitern, die Elemente durch Atomgewichte zu ersetzen und sie in eine Folge von Additionen zu transformieren, die dann ausgewertet werden.
quelle
Mathematica 9 -
247227Dies ist eindeutig ein Betrug, da ich eine Funktion verwende, die direkt atomatische Massen berechnet (aber keine Molmassen!):
Verwendung: Rufen Sie die Funktion
f
mit einer Zeichenfolge auf, die die Formel enthält. Die Ausgabe ist die Masse.Prüfung:
Mathematica 10 gibt keine rohe Zahl aus, sondern eine Zahl mit einer Einheit, sodass dies möglicherweise nicht akzeptabel ist.
quelle
Javascript, 1002
Eingang ist in
q
und Ausgang ist ina
. Ich war mir nicht sicher, wie die Rundungsregeln lauten, daher habe ich auf 3 Stellen nach dem Komma gekürzt (oder weniger, wenn die Ziffern in Wikipedia nicht verfügbar waren).quelle
q
, obwohl alles andere in Ordnung zu sein scheint. +1Javascript (E6) 1231
Als Funktion mit der Eingabe als Argument und Rückgabe der Ausgabe. Präzision: 3 Dezimalstellen
Verwenden Sie regexp, um die chemische Formel in einen einfachen arithmetischen Ausdruck mit Summen und Produkten umzuwandeln, der Folgendes ersetzt:
(
mit+(
Dann wird der Ausdruck ausgewertet und der Wert zurückgegeben. Bei Fehlern oder wenn der Wert NaN (oder Null) ist, gibt die Funktion 'Ungültige Formel' zurück.
Jetzt sehe ich, dass alle anderen Antworten die gleiche Methode verwenden ... na ja, hier ist die Javascript-Version
quelle
PHP - 793 (583 + 210)
Weitgehend übertroffen von der Antwort von professorfish , der eine ähnliche Methode anwendet, aber hey ... Die Symbole und die Massen sind in der Datei,
a
die mit dem folgenden Code erhalten wurde, gzip-komprimiert :Die Formel sollte in der
$f
Variablen gespeichert werden:Hier ist die ungolfed und kommentierte Version:
quelle
Scala, 1077
Ich sehe alle Ihre Lösungen in dynamisch getippten Sprachen mit Auskopplungen wie
eval
oder eingebauter atomarer Massenfunktion und erzeuge Ihnen eine statisch getippte Sprachlösung:Ich sollte eine Komprimierung für die Daten in Betracht ziehen, aber lassen Sie uns vorerst nur die Atommassen in Basis 94 unkomprimiert haben.
quelle
molarmass.scala:5: error: ';' expected but identifier found. def a(m:S)={var(r,s)=(m,0);do{val(y,z)=o(r);r=z;s+=y}while(r!=""&&r(0)!=41)s->r}