Die Herausforderung
Schreiben Sie ein Programm, das eine eingegebene chemische Formel aufschlüsselt (siehe unten) und die entsprechenden Atome in der Form ausgibt element: atom-count
.
Eingang
Beispieleingabe:
H2O
Ihre Eingabe enthält immer mindestens ein Element, jedoch nicht mehr als zehn. Ihr Programm sollte Eingaben akzeptieren, die geschachtelte Klammern enthalten.
Elemente in den Zeichenfolgen stimmen immer überein [A-Z][a-z]*
, dh sie beginnen immer mit einem Großbuchstaben. Zahlen sind immer einstellige Zahlen.
Ausgabe
Beispielausgabe (für die obige Eingabe):
H: 2
O: 1
Ihrer Ausgabe kann optional eine neue Zeile folgen.
Moleküle abbauen
Die Zahlen rechts von einer Reihe von Klammern werden auf jedes Element innerhalb von verteilt:
Mg(OH)2
Sollte ausgeben:
Mg: 1
O: 2
H: 2
Das gleiche Prinzip gilt für einzelne Atome:
O2
Sollte ausgeben:
O: 2
Und auch Verketten:
Ba(NO2)2
Sollte ausgeben:
Ba: 1
N: 2
O: 4
Beispiele
> Ba(PO3)2
Ba: 1
P: 2
O: 6
> C13H18O2
C: 13
H: 18
O: 2
> K4(ON(SO3)2)2
K: 4
O: 14
N: 2
S: 4
> (CH3)3COOC(CH3)3
C: 8
H: 18
O: 2
> (C2H5)2NH
C: 4
H: 11
N: 1
> Co3(Fe(CN)6)2
Co: 3
Fe: 2
C: 12
N: 12
Eingaben werden durch einen Pfeil (Vorzeichen; >
) gekennzeichnet.
Anzeigetafel
Damit Ihre Partitur auf der Tafel erscheint, sollte sie in folgendem Format vorliegen:
# Language, Score
Oder wenn Sie einen Bonus verdient haben:
# Language, Score (Bytes - Bonus%)
function getURL(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:getURL(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),useData(answers)}})}function getOwnerName(e){return e.owner.display_name}function useData(e){var s=[];e.forEach(function(e){var a=e.body.replace(/<s>.*<\/s>/,"").replace(/<strike>.*<\/strike>/,"");console.log(a),VALID_HEAD.test(a)&&s.push({user:getOwnerName(e),language:a.match(VALID_HEAD)[1],score:+a.match(VALID_HEAD)[2],link:e.share_link})}),s.sort(function(e,s){var a=e.score,r=s.score;return a-r}),s.forEach(function(e,s){var a=$("#score-template").html();a=a.replace("{{RANK}}",s+1+"").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SCORE}}",e.score),a=$(a),$("#scores").append(a)})}var QUESTION_ID=58469,ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],answer_ids,answers_hash,answer_page=1;getAnswers();var VALID_HEAD=/<h\d>([^\n,]*)[, ]*(\d+).*<\/h\d>/;
body{text-align:left!important}table thead{font-weight:700}table td{padding:10px 0 0 30px}#scores-cont{padding:10px;width:600px}#scores tr td:first-of-type{padding-left:0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="scores-cont"><h2>Scores</h2><table class="score-table"><thead> <tr><td></td><td>User</td><td>Language</td><td>Score</td></tr></thead> <tbody id="scores"></tbody></table></div><table style="display: none"> <tbody id="score-template"><tr><td>{{RANK}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SCORE}}</td></tr></tbody></table>
Bearbeiten: Eckige Klammern sind nicht mehr Teil der Frage. Alle Antworten, die vor dem 23. September, 3:00 Uhr UTC, eingehen, sind sicher und werden von dieser Änderung nicht betroffen.
[HCl] = 0.01 mol L^-1
.>
.Antworten:
CJam,
5957 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Pyth,
6665 BytesPort meiner Python-Antwort. Unterstützt nur die Eingabe in regulären Klammern.
quelle
Python3,
157154 BytesUnterstützt nur die Eingabe in regulären Klammern.
Vor dem Erstellen der Golflösung mithilfe der
eval
obigen Informationen habe ich diese Referenzlösung erstellt, die ich als sehr elegant empfand :quelle
JavaScript ES6, 366 Bytes
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Ich bin mir ziemlich sicher, dass das gekürzt werden kann, aber ich muss mich wieder an die Arbeit machen. ;-)
quelle
return
Aussage. Das sollte vorerst reichen.replace
viel, um einige Bytes zu sparen, indem Siexyz[R='replace'](...)
das erste Mal undabc[R] (...)
jedes weitere Mal verwenden.SageMath ,
156148 BytesProbieren Sie es hier online aus (hoffentlich funktioniert der Link, möglicherweise ist ein Online-Account erforderlich)
Hinweis: Wenn Sie es online versuchen, müssen Sie es durch
input()
die Zeichenfolge ersetzen (z. B."(CH3)3COOC(CH3)3"
)Erläuterung
Mit Sage können Sie algebraische Ausdrücke vereinfachen, sofern sie im richtigen Format vorliegen (siehe 'Symbolische Manipulation' dieses Links). Die regulären Ausdrücke in eval () dienen im Wesentlichen dazu, die Eingabezeichenfolge in das richtige Format zu bringen, zum Beispiel in etwa wie folgt:
eval()
wird dies dann zu vereinfachen8*C + 18*H + 2*O
:, und dann ist es nur eine Frage der Formatierung der Ausgabe mit einer anderen Regex-Ersetzung.quelle
Python 3, 414 Bytes
Ich hoffe, dass die Reihenfolge des Ergebnisses nicht zählt.
quelle
Javascript (ES6),
286284Nicht viel kürzer als die andere ES6, aber ich habe mein Bestes gegeben. Hinweis: Dies wird fehlschlagen, wenn Sie eine leere Zeichenfolge oder die meisten ungültigen Eingaben eingeben. Erwartet auch, dass alle Gruppen eine Anzahl von mehr als 1 haben (dh nein
CO[OH]
). Wenn dies gegen die Herausforderungsregeln verstößt, lassen Sie es mich wissen.Verwendet einen stapelbasierten Ansatz. Zunächst wird die Zeichenfolge vorverarbeitet, um sie
1
zu jedem Element ohne Zahl hinzuzufügen , dhCo3(Fe(CN)6)2
wirdCo3(Fe1(C1N1)6)2
. Dann durchläuft es in umgekehrter Reihenfolge und sammelt die Anzahl der Elemente.Geige
quelle
Perl,
177172 Bytes171 Byte Code + 1 Byte Befehlszeilenparameter
Ok, vielleicht habe ich mich in diesem Fall ein bisschen von Regex mitreißen lassen ...
Anwendungsbeispiel:
quelle
Mathematica, 152 Bytes
Das Obige definiert eine Funktion,
f
die einen String als Eingabe akzeptiert. Die Funktion verwendet die Zeichenfolge, umschließt jeden Elementnamen mit Anführungszeichen und fügt vor jeder Zahl einen Infix-Exponentiationsoperator hinzu. Die Zeichenfolge wird dann als Ausdruck interpretiert:Dann nimmt es den Logarithmus davon und erweitert ihn (Mathematica ist es egal, was man den Logarithmus von nimmt :)):
und dann findet es alle Vorkommen der Multiplikation von a
Log
mit einer Zahl und analysiert sie in die Form von{log-argument, number}
und gibt diese in einer Tabelle aus. Einige Beispiele:quelle
Java, 827 Bytes
Git-Repository mit ungolfed-Quelle (keine perfekte Parität, ungolfed unterstützt Zahlen mit mehreren Zeichen).
Ich dachte mir schon eine Weile, ich würde Java eine Vorstellung geben. Ich werde definitiv keine Preise gewinnen :).
quelle
ES6, 198 Bytes
Wo
\n
ist ein buchstäbliches Newline-Zeichen.Ungolfed:
quelle
Pip ,
8577 + 1 = 78 BytesNicht konkurrierende Antwort, da Sprachfunktionen verwendet werden, die neuer sind als die Herausforderung. Nimmt die Formel als Befehlszeilenargument und verwendet das
-n
Flag für die richtige Ausgabeformatierung.Probieren Sie es online!
Der Haupttrick besteht darin, die Formel über reguläre Ausdrücke in einen Pip-Ausdruck umzuwandeln. Dies wird, wenn es evaluiert wird, die Wiederholung durchführen und Klammern für uns auflösen. Anschließend werden die Atomzahlen ein wenig nachbearbeitet und alles korrekt formatiert.
Ungolfed, mit Kommentaren:
So wird die Eingabe
Co3(Fe(CN)6)2
transformiert:Dann:
quelle