Wyzwanie
Napisz program, który może rozbić wprowadzony wzór chemiczny (patrz poniżej) i wyprowadzić odpowiednie atomy w postaci element: atom-count
.
Wejście
Przykładowe dane wejściowe:
H2O
Twój wkład zawsze będzie zawierał co najmniej jeden element, ale nie więcej niż dziesięć. Twój program powinien akceptować dane wejściowe zawierające nawiasy, które mogą być zagnieżdżone.
Elementy w ciągach zawsze będą pasować [A-Z][a-z]*
, co oznacza, że zawsze będą zaczynać się od dużej litery. Liczby zawsze będą jednocyfrowe.
Wynik
Przykładowe dane wyjściowe (dla powyższego wejścia):
H: 2
O: 1
Twój wynik może opcjonalnie poprzedzić nowy wiersz.
Rozkład cząsteczek
Liczby po prawej stronie zestawu nawiasów są rozdzielane na każdy element wewnątrz:
Mg(OH)2
Powinien generować:
Mg: 1
O: 2
H: 2
Ta sama zasada dotyczy pojedynczych atomów:
O2
Powinien generować:
O: 2
A także łączenie:
Ba(NO2)2
Powinien generować:
Ba: 1
N: 2
O: 4
Przykłady
> 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
Wejścia są oznaczone strzałką (znak większy niż; >
).
Tablica wyników
Twój wynik powinien pojawić się na tablicy, powinien mieć następujący format:
# Language, Score
Lub jeśli zarobiłeś bonus:
# 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>
Edycja: nawiasy kwadratowe nie są już częścią pytania. Wszelkie odpowiedzi wysłane przed godziną 3:00 czasu UTC, 23 września, są bezpieczne i nie będą miały wpływu na tę zmianę.
[HCl] = 0.01 mol L^-1
. :>
.Odpowiedzi:
CJam,
5957 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Pyth,
6665 bajtówPort mojej odpowiedzi w języku Python. Obsługuje tylko wprowadzanie przy użyciu zwykłych nawiasów.
źródło
Python3,
157154 bajtówObsługuje tylko wprowadzanie przy użyciu zwykłych nawiasów.
Przed stworzeniem powyższego rozwiązania golfowego
eval
stworzyłem to rozwiązanie referencyjne, które uważam za bardzo eleganckie:źródło
JavaScript ES6, 366 bajtów
JS Fiddle: https://jsfiddle.net/32tunzkr/1/
Jestem pewien, że można to skrócić, ale muszę wrócić do pracy. ;-)
źródło
return
oświadczenie. Na razie powinno to wystarczyć.replace
dużo, więc możesz zaoszczędzić trochę bajtów, używającxyz[R='replace'](...)
pierwszego iabc[R] (...)
każdego kolejnego.SageMath ,
156148 bajtówWypróbuj online tutaj (mam nadzieję, że link zadziała, może wymagać konta online)
Uwaga: jeśli próbujesz online, musisz zastąpić
input()
ciągiem (np."(CH3)3COOC(CH3)3"
)Wyjaśnienie
Sage pozwala uprościć wyrażenia algebraiczne, pod warunkiem, że mają odpowiedni format (patrz „manipulacja symboliczna” tego łącza). Wyrazy regularne wewnątrz eval () służą zasadniczo do wprowadzenia ciągu wejściowego do odpowiedniego formatu, na przykład coś takiego:
eval()
uprości to do:,8*C + 18*H + 2*O
a następnie wystarczy sformatować dane wyjściowe za pomocą innego podstawienia wyrażenia regularnego.źródło
Python 3, 414 bajtów
Mam nadzieję, że kolejność wyniku się nie liczy.
źródło
JavaScript (ES6),
286284Nie tak dużo krótszy niż drugi ES6, ale dałem z siebie wszystko. Uwaga: spowoduje to błąd, jeśli podasz mu pusty ciąg lub najbardziej nieprawidłowe dane wejściowe. Oczekuje również, że wszystkie grupy będą miały więcej niż 1 (tj. Nie
CO[OH]
). Jeśli to złamie jakiekolwiek zasady wyzwania, daj mi znać.Stosuje podejście oparte na stosie. Po pierwsze, wstępnie przetwarza ciąg, aby dodać
1
do dowolnego elementu bez liczby, tzn .Co3(Fe(CN)6)2
Staje sięCo3(Fe1(C1N1)6)2
. Następnie przechodzi w pętli w odwrotnej kolejności i gromadzi liczbę elementów.Skrzypce
źródło
Perl,
177172 bajtów171 bajtów kodu + 1 bajtowy parametr wiersza poleceń
Ok, więc mogłem się trochę ponieść z regexem w tym ...
Przykład użycia:
źródło
Mathematica, 152 bajty
Powyżej definiuje funkcję,
f
która przyjmuje ciąg znaków jako dane wejściowe. Funkcja bierze ciąg i zawija nazwę każdego elementu w cudzysłów i dodaje operator potęgowania wykładnika przed każdą liczbą, a następnie interpretuje ciąg jako wyrażenie:Następnie bierze logarytm tego i rozwija go (mathematica nie dba o to, z czego wziąć logarytm :)):
a następnie znajduje wszystkie wystąpienia pomnożenia a
Log
przez liczbę i analizuje je w postaci{log-argument, number}
i wyświetla te w tabeli. Kilka przykładów:źródło
Java, 827 bajtów
Repozytorium Git ze źródłami niestosowanymi (nie jest to idealna parzystość, nieskolowane obsługuje liczby wieloznakowe).
Minęło trochę czasu, pomyślałem, że dam reprezentację Java. Zdecydowanie nie wygrywam żadnych nagród :).
źródło
ES6, 198 bajtów
Gdzie
\n
jest dosłowny znak nowej linii.Nie golfowany:
źródło
Pip ,
8577 + 1 = 78 bajtówOdpowiedź niekonkurencyjna, ponieważ wykorzystuje funkcje językowe, które są nowsze niż wyzwanie. Pobiera formułę jako argument wiersza polecenia i używa
-n
flagi do poprawnego formatowania wyjściowego.Wypróbuj online!
Główną sztuczką jest przekształcenie formuły przez zastąpienie wyrażeń regularnych w wyrażenie Pip. To po ewaluacji wykona dla nas powtórzenie i rozwiąże nawiasy. Następnie przetwarzamy trochę później, aby uzyskać liczbę atomów i poprawnie sformatować wszystko.
Niegolfowany, z komentarzami:
Oto jak dane wejściowe
Co3(Fe(CN)6)2
są przekształcane:Następnie:
źródło