Zadanie
Napisz program, który przyjmuje związek złożony wyłącznie z pierwiastków o liczbie atomowej mniejszej lub równej 92 (uran) i podaje masę molową związku w grams/mole
.
Zasady i ograniczenia
- Nie możesz używać funkcji, która bezpośrednio oblicza dla ciebie masy molowe.
- Twój program musi być w stanie działać na maszynie offline.
- MOŻESZ użyć osobnego pliku danych. Należy podać zawartość tego pliku.
- Twój wynik to długość programu w bajtach plus długość pliku danych w bajtach, jeśli zdecydujesz się go użyć.
- Jest to kod-golf , dlatego wygrywa najniższy wynik.
Wejście
Ciąg zawierający związek. Ten ciąg może zostać odczytany STDIN
, przekazany jako argument lub ustawiony na zmienną (proszę określić, która). Wszystkie prawidłowe dane wejściowe:
CH2
(jeden węgiel, dwa atomy wodoru)(CH2)8
(8 węgli, 16 atomów wodoru)U
(1 uran)
Twój program nie musi działać dla osadzonych nawiasów (tj. ((CH3)2N4)4
), Ani dla żadnego związku zawierającego element o liczbie atomowej większej niż 92. Jeśli twój program nie działa w żadnym z powyższych dwóch przypadków, musi wygenerowaćInvalid formula
w takich przypadkach - brak niezdefiniowanego zachowania.
Wynik
Powinieneś wyprowadzić, do STDOUT
lub do zmiennej, masę molową związku w grams/mole
. Lista mas atomowych pierwiastków jest dostępna tutaj (Wikipedia) . Twoja odpowiedź powinna być dokładna do miejsca po przecinku dla związków zawierających mniej niż 100 atomów (w zaokrągleniu).
Jeśli dane wejściowe są nieprawidłowe, Invalid formula
należy je wyprowadzić.
Informacje na temat obliczania masy molowej związku w grams/mole
(Wikipedia).
Przykłady
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
jest trudniejsza do określenia do miejsca dziesiętnego niż masaU2
13
jeśli masa atomowa wynosi12.999
?Odpowiedzi:
Grzmotnąć,
978 708 675 673 650 636 632 631 598594211 bajtów dla programu i 382 bajtów dla danych.
Wejście jest na STDIN, wyjście na STDOUT. OSTRZEŻENIE: tworzy pliki o nazwie,
g
aa
jeśli istnieją, zostaną nadpisane!Plik danych
Wymaga to pliku o nazwie
y
, który jest skompresowaną zopfli formą tych danych (bez końcowego znaku nowej linii). zopfli jest algorytmem kompresji kompatybilnym z gzip i można go zdekompresować za pomocą standardowych narzędzi gzip. Uruchomiono go z 1024 iteracjami (to chyba za dużo). Ostatnie 8 bajtów zostało następnie usuniętych.Base64 of
y
to (użyjbase64 -d
do odtworzenia oryginalnego pliku):Suma md5 jest
d392b0f5516033f2ae0985745f299efd
.Wyjaśnienie
Liczby w pliku są przyrostami względnej masy atomowej (więc względna masa atomowa litu wynosi
1.008 + 0 + 2.995 + 2.937
).Ten skrypt działa poprzez konwersję wzoru chemicznego na wyrażenie arytmetyczne za pomocą
+
i*
, zastępowanie każdego symbolu jego względną masą atomową, a następnie podawanie wyrażenia dobc
. Jeśli formuła zawiera niepoprawne symbole,bc
spowoduje błąd składniowy i nie wyśle nic do STDOUT; w takim przypadku wynikiem jestInvalid formula
.Jeśli STDIN jest pusty, wynikiem jest
0
. Obsługiwane są nawiasy zagnieżdżone.Przykład
źródło
Perl - 924
Wykorzystuje serię operacji podstawiania wyrażeń regularnych na wprowadzonej formule, aby rozwinąć indeksowane elementy i grupy, zastąpić elementy wagami atomowymi i przekształcić je w sekwencję dodatków, które następnie ocenia.
źródło
Mathematica 9 -
247227To wyraźnie oszukuje, ponieważ używam funkcji, która bezpośrednio oblicza masy atomatyczne (ale nie masy molowe!):
Użycie: Wywołaj funkcję
f
z łańcuchem zawierającym formułę, wynikiem będzie masa.Test:
Mathematica 10 nie generuje liczby surowej, ale liczbę z jednostką, więc może to nie być dopuszczalne.
źródło
JavaScript, 1002
Wejście jest w,
q
a wyjście jest wa
. Nie byłem pewien, jakie są zasady zaokrąglania, więc skróciłem się do 3 miejsc po przecinku (lub mniej, jeśli cyfry były niedostępne z Wikipedii).źródło
q
, choć wszystko inne wydaje się w porządku. +1JavaScript (E6) 1231
Jako funkcja z wejściem jako argumentem i zwracaniem wyniku. Precyzja: 3 cyfry dziesiętne
Użyj wyrażenia regularnego, aby przekształcić wzór chemiczny w proste wyrażenie arytmetyczne z sumami i produktami, zastępując:
(
z+(
Następnie wyrażenie jest oceniane i zwracana jest wartość. W przypadku błędów lub jeśli wartość wynosi NaN (lub zero), funkcja zwraca „Niepoprawną formułę”
Teraz widzę, że wszystkie inne odpowiedzi używają tej samej metody ... no cóż, tutaj jest wersja javascript
źródło
PHP - 793 (583 + 210)
Znacznie przewyższa odpowiedź professorfish , która używa podobnej metody, ale hej… Symbole i masy są kompresowane gzip w pliku
a
uzyskanym za pomocą następującego kodu:Formuła powinna być przechowywana w
$f
zmiennej:Oto nieposkromiona i skomentowana wersja:
źródło
Scala, 1077
Widzę wszystkie twoje rozwiązania w dynamicznie wpisywanych językach z wyskakującymi
eval
funkcjami, takimi jak lub wbudowana funkcja masy atomowej, i przedstawiam ci rozwiązanie w języku statycznym:Powinienem wziąć pod uwagę pewną kompresję danych, ale na razie po prostu miejmy masy atomowe w bazie 94 bez kompresji.
źródło
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}