Stopień nienasycenia
Nie jest to szczególnie trudna łamigłówka - ale interesuje mnie twoje wiele sposobów jej rozwiązania.
Stopień nienasycenia to liczba podwójnych wiązań chemicznych między atomami i / lub liczba pierścieni w związku chemicznym.
Otrzymasz wzór cząsteczkowy związku chemicznego w postaci XaYbZc (gdzie a, b i c to liczba atomów X, Y lub Z w związku) - wzór może mieć dowolną długość i zawierać dowolny pierwiastek chemiczny w układzie okresowym (chociaż elementy inne niż C, H, N, F, Cl, Br, I mogą zostać zignorowane, ponieważ nie występują we wzorze). Związek będzie zawierał co najmniej jeden atom węgla. Musisz obliczyć i wyświetlić stopień nienasycenia.
Na przykład związek benzenu (na zdjęciu poniżej) ma DoU równą 4, ponieważ ma trzy wiązania podwójne (pokazane podwójną linią między atomami) i pojedynczy pierścień (kilka atomów połączonych w pętli):
Zgodnie z definicją LibreTexts :
DoU = (2C + 2 + N - X - H) / 2
Gdzie:
C
to liczba atomów węglaN
to liczba atomów azotuX
Jest to liczba atomów chlorowca (F
,Cl
,Br
,I
)H
to liczba atomów wodoru
Przypadki testowe:
C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety.
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input
Wyjaśnienie CH patrz tutaj
Zasadniczo musisz określić, czy w związku występuje którykolwiek z powyższych pierwiastków (C, H, N, F, Cl, Br, I), a jeśli tak, to ile ich jest. Następnie obliczyć stopień nienasycenia, korzystając z powyższego wzoru.
Tylko C, H, N, F, Cl, Br i I są poprawnymi danymi wejściowymi dla formuły DoU. Na potrzeby tej układanki wszelkie inne elementy można całkowicie zignorować (np. Jeśli związek miałby postać C6H6Mn, wynik nadal wynosiłby 4). Jeśli nie ma żadnego z powyższych związków, odpowiedź wynosiłaby zero.
Możesz założyć, że wszystkie wprowadzone związki są chemicznie możliwe, zawierają co najmniej jeden atom węgla i wiadomo, że istnieją. Jeśli dane wejściowe są niepoprawne, program może wyprowadzić wartość 0 lub -1 lub nie wygenerować żadnego wyniku.
Zasady
Obowiązują standardowe zasady i luki we / wy . Dane wejściowe muszą być ciągiem standardowym i można założyć, że dane wejściowe nie będą puste. To jest codegolf - więc wygrywa najkrótszy kod w bajtach.
Na2O
i metyloidyna:CH
iCCl4He
. Oto niektóre narożne przypadki, które mogą złamać kilka rozwiązań. Nawiasem mówiąc, nie to, że ma to znaczenie dla kogokolwiek innego niż Mathematica (prawdopodobnie), ale czy możemy założyć, że związki (mogą) istnieć?C9H2O1 --> 0
. Czy nie powinno być 9?(2*9+2+0-0-2)/2
Odpowiedzi:
JavaScript (ES6),
117112 bajtówZwraca
0
za nieprawidłowe dane wejściowe.Przypadki testowe
Pokaż fragment kodu
Alternatywna wersja, 103 bajty
Gdyby zagwarantowano, że dane wejściowe są prawidłowe - jak sugeruje wprowadzenie w błąd wprowadzające w błąd - moglibyśmy po prostu:
Próbny
Pokaż fragment kodu
źródło
Python 3 ,
142 151148 bajtówZwraca 0 w przypadku błędu.
Dzięki @HyperNeutrino zmniejszeniu bajtów.
Wypróbuj online!
źródło
dict
!Pip ,
7067 bajtówBierze wzór chemiczny jako argument wiersza polecenia. Dane wyjściowe
0
dla nieprawidłowych danych wejściowych. Wypróbuj online!Wyjaśnienie
Wykorzystuje serię zamienników wyrażeń regularnych, aby przekształcić wzór chemiczny w wzór matematyczny, sprawdzić go i dokonać kilku poprawek, aby uzyskać ostateczną wartość.
Zamienniki (wersja nieco nie golfowa):
Analizujemy powstały ciąg za pomocą
V
. To nam daje2C + N − X − H
. Aby uzyskać prawidłową wartość, dokonujemy następujących korekt:źródło
C (gcc) , 195
197202bajtyPrawdopodobnie najdłuższa odpowiedź.
Wypróbuj online!
Zwraca 0 w przypadku błędu.
źródło