Wyzwanie
Biorąc pod uwagę wzór substancji chemicznej, uzyskaj Mr związku.
Równanie
Po każdym pierwiastku w związku występuje liczba oznaczająca liczbę wspomnianego atomu w związku. Jeśli nie ma liczby, w związku jest tylko jeden z tych atomów.
Oto niektóre przykłady:
- Etanol (C 2 H 6 O) byłby
C2H6O
tam, gdzie są dwa atomy węgla, 6 atomów wodoru i 1 atom tlenu - Wodorotlenek magnezu (MgO, 2 H 2 ) byłoby
MgO2H2
w którym znajduje się jeden atom magnezu, dwa atomy tlenu i dwa atomy wodoru.
Pamiętaj, że nigdy nie będziesz musiał obsługiwać nawiasów, a każdy element jest uwzględniany tylko raz w formule.
Podczas gdy większość ludzi prawdopodobnie będzie trzymać się kolejności, w której czują się najlepiej, nie ma ścisłego systemu zamówień. Na przykład, woda może być podawany albo jako H2O
lub OH2
.
M r
Uwaga: Załóżmy, że masa wzoru jest taka sama jak masa cząsteczkowa
M R związku, masy cząsteczkowej, to suma masy atomowej atomów w cząsteczce.
Jedyne pierwiastki i ich masy atomowe do 1 miejsca po przecinku, które musisz wesprzeć (wodór do wapnia, nie licząc gazów szlachetnych) są następujące. Można je również znaleźć tutaj
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
Zawsze należy podawać wynik z dokładnością do jednego miejsca po przecinku.
Na przykład, etanol ( C2H6O
) ma M r z 46.0
, jak to jest suma masy atomowej elementy w go:
12.0 + 12.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 16.0
(2*C + 6*H + 1*O)
Wejście
Pojedynczy ciąg w powyższym formacie. Możesz zagwarantować, że elementy zawarte w równaniu będą rzeczywistymi symbolami żywiołów.
Nie ma gwarancji, że dany związek istnieje w rzeczywistości.
Wynik
Całkowity Mr związku, do 1 miejsca po przecinku.
Zasady
Wbudowane, które mają dostęp do danych pierwiastków lub danych chemicznych są niedozwolone (przepraszam Mathematica)
Przykłady
Input > Output
CaCO3 > 100.1
H2SO4 > 98.1
SF6 > 146.1
C100H202O53 > 2250.0
Zwycięski
Najkrótszy kod w bajtach wygrywa.
Ten post został przyjęty za zgodą Cairney Coheringaahing . (Opublikuj teraz usunięte)
źródło
2H2O
:?NumberForm[#&@@#~ChemicalData~"MolecularMass",{9,1}]&
Odpowiedzi:
Galaretka , 63 bajty
Monadyczny link przyjmujący listę znaków i zwracający liczbę.
Wypróbuj online!
W jaki sposób?
źródło
Python 3 ,
189 182168 bajtów-14 bajtów przy użyciu skrótu z odpowiedzi JavaScript (ES6) Justina Marinera .
Wypróbuj online!
Poniżej znajduje się wersja 182-bajtowa, wyjaśnię to - powyższe po prostu zmienia kolejność wag, używa
int
do konwersji nazwy elementu z bazy29
i używa różnych dywidend w celu zmniejszenia zakresu liczb całkowitych - patrz Justin Odpowiedź Marinera .Nienazwana funkcja akceptująca ciąg znaków
s
i zwracająca liczbę.Wypróbuj online!
W jaki sposób?
Używa wyrażenia regularnego, aby podzielić dane wejściowe,
s
na elementy i ich liczbę, używając:re.findall("(\D[a-z]?)(\d*)",s)
\D
dopasowuje dokładnie jedną cyfrę i[a-z]?
dopasowuje 0 lub 1 małą literę, razem dopasowując elementy.\d*
dopasowuje 0 lub więcej cyfr. Nawiasy, aby te dwie grupy i jako takifindall("...",s)
zwraca listę krotek ciągi[(element, number),...]
.Liczba jest łatwa do wyodrębnienia, jedyną rzeczą do zrobienia jest to, że pusty ciąg oznacza 1, osiąga się to logicznie
or
, ponieważ Python ciągi są falsey:int(n or 1)
.Ciąg elementu otrzymuje unikalny numer, biorąc iloczyn rzędów pierwszego i ostatniego znaku (zwykle są one takie same, np. S lub C, ale musimy rozróżnić Cl, C, Ca i Na, więc nie możemy po prostu użyć jednego postać).
Liczby te są następnie mieszane, aby objąć znacznie mniejszy zakres [0,18], znaleziony w wyniku przeszukania przestrzeni modułu
%1135%98%19
. Na przykład"Cl"
ma liczby porządkowe67
i108
, które mnożą się, aby dać7736
, który1135
to modulo jest426
, który98
jest modulo34
, który19
jest modulo15
; liczba ta służy do indeksowania do listy liczb całkowitych - 15. wartość (indeksowana 0) na liście:[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]
jest
35.5
to masa atomowa Cl, która jest następnie mnożona przez liczbę takich pierwiastków (jak stwierdzono powyżej).Produkty te są następnie dodawane razem za pomocą
sum(...)
.źródło
PHP , 235 bajtów
Wypróbuj online!
Zamiast tego
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])
możesz używać[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]
tej samej liczby bajtówźródło
JavaScript (ES6), 150 bajtów
Zainspirowany odpowiedzią Jonathana Allana na Python , w której wyjaśnił, jak nadać każdemu elementowi unikalny numer i mieszać te liczby w mniejszym zakresie.
Elementy zostały przekształcone w unikalne liczby, interpretując je jako base-29 (0-9 i AS). Potem odkryłem, że
%633%35%18
zawęża wartości do zakresu[0, 17]
przy zachowaniu wyjątkowości.Test Snippet
źródło
Clojure,
198194 bajtówAktualizacja: lepiej
for
niżreduce
.Oryginał:
Zastanawiam się, czy istnieje bardziej zwarty sposób kodowania tabeli przeglądowej.
źródło
Python 3 , 253 bajty
Wypróbuj online!
źródło
Mathematica,
390338329 bajtówZaoszczędziłem 9 bajtów, ponieważ nie śpię i korzystam z zamierzonego skrótu.
Wersja 2.1:
Objaśnienie: Znajdź pozycję wszystkich wielkich liter. Umieść kropkę przed każdym. Podziel ciąg w każdej kropce. Dla tej listy podciągów wykonaj następujący podział na podstawie liter i podziel na podstawie cyfr. Dla podzielonych na litery przekształć ciąg znaków na liczby. Dla tych podzielonych cyframi zamień każdą substancję chemiczną na jej masę cząsteczkową. Dla każdego o masie cząsteczkowej i liczbie atomów zamień go na ich iloczyn. Oni znajdują sumę.
Wersja 1:
Jestem pewien, że można to dużo zagrać w golfa (lub po prostu całkowicie przepisać). Chciałem tylko wymyślić, jak to zrobić. (Zastanowi się nad tym rano).
Objaśnienie: Najpierw podziel łańcuch na znaki. Następnie złóż tablicę łączącą małe litery i cyfry z powrotem do ich stolicy. Następnie dodaj 1 do dowolnej substancji chemicznej bez numeru na końcu. Następnie wykonaj dwa podziały terminów w tablicy - jeden podział na wszystkie liczby i jeden podział na wszystkie litery. Najpierw zamień litery na ich masy molowe, a następnie znajdź iloczyn skalarny tych dwóch list.
źródło
Python 3 - 408 bajtów
Jest to głównie rozwiązanie @ovs, ponieważ grał w golfa o ponad 120 bajtów ... Zobacz wstępne rozwiązanie poniżej.
Wypróbuj online!
Python 3 -
550 548535 bajtów (stracił licznik z wcięciem)Zaoszczędzono 10 bajtów dzięki @cairdcoinheringaahing i 3 zaoszczędzono dzięki ovs
Miałem osobisty cel, aby nie używać żadnego wyrażenia regularnego i robić to w zabawny, oldschoolowy sposób ... Okazało się, że jest o 350 bajtów dłuższy niż rozwiązanie wyrażenia regularnego, ale korzysta tylko ze standardowej biblioteki Pythona ...
Wypróbuj online!
Jeśli ktoś chce zagrać w golfa (z poprawkami wcięć i innymi sztuczkami ...), zostanie w 100% dobrze przyjęty, czując, że jest lepszy sposób na zrobienie tego ...
źródło
for y in g: if str(y[0])==h[i][:h[i].index('-')]:x+=y[1]
zfor y in g:x+=y[1]*(str(y[0])==h[i][:h[i].index('-')])
if/for/while
w następnym wierszu. Tak jest w przypadku każdej wciętej linii, dlatego nie można zapisać bajtów.