Bernd jest uczniem szkoły średniej, który ma pewne problemy z chemią. W klasie musi zaprojektować równania chemiczne dla niektórych przeprowadzanych eksperymentów, takich jak spalanie heptanu:
C 7 H 16 + 11o 2 → 7CO 2 + 8H 2 O
Ponieważ matematyka nie jest najsilniejszym przedmiotem Bernda, często ma trudności ze znalezieniem dokładnych proporcji między pro- i eduktami reakcji. Ponieważ jesteś wychowawcą Bernda, Twoim zadaniem jest mu pomóc! Napisz program, który oblicza ilość każdej substancji potrzebną do uzyskania prawidłowego równania chemicznego.
Wkład
Dane wejściowe to równanie chemiczne bez ilości. Aby było to możliwe w czystym ASCII, zapisujemy wszelkie subskrypcje jako zwykłe liczby. Nazwy elementów zawsze zaczynają się od dużej litery, a po nich może być mała. Cząsteczki są oddzielone +
znakami, po ->
obu stronach równania wstawiona jest strzałka ASCII-art :
Al+Fe2O4->Fe+Al2O3
Wejście jest zakończone znakiem nowej linii i nie będzie zawierało spacji. Jeśli dane wejściowe są niepoprawne, twój program może zrobić co chcesz.
Można założyć, że dane wejściowe nigdy nie przekraczają 1024 znaków. Twój program może albo odczytać dane wejściowe ze standardowego wejścia, z pierwszego argumentu lub w sposób zdefiniowany w implementacji w czasie wykonywania, jeśli żadne z nich nie jest możliwe.
Wydajność
Dane wyjściowe Twojego programu to równanie wejściowe powiększone o dodatkowe liczby. Liczba atomów dla każdego elementu musi być taka sama po obu stronach strzałki. W powyższym przykładzie poprawnym wynikiem jest:
2Al+Fe2O3->2Fe+Al2O3
Jeśli liczba cząsteczki wynosi 1, upuść ją. Liczba musi zawsze być dodatnią liczbą całkowitą. Twój program musi podawać liczby tak, aby ich suma była minimalna. Na przykład następujące działania są nielegalne:
40Al+20Fe2O3->40Fe+20Al2O3
Jeśli nie ma rozwiązania, wydrukuj
Nope!
zamiast. Przykładowe dane wejściowe, które nie mają rozwiązania, to
Pb->Au
Zasady
- To jest golf golfowy. Najkrótszy kod wygrywa.
- Twój program musi zakończyć się w rozsądnym terminie dla wszystkich uzasadnionych danych wejściowych.
Przypadki testowe
Każdy przypadek testowy ma dwa wiersze: dane wejściowe i prawidłowe dane wyjściowe.
C7H16+O2->CO2+H2O
C7H16+11O2->7CO2+8H2O
Al+Fe2O3->Fe+Al2O3
2Al+Fe2O3->2Fe+Al2O3
Pb->Au
Nope!
solve(
funkcji ieval(
interpretując dane wejściowe :)Odpowiedzi:
C, 442
505znakówUruchom jako:
Wyniki:
źródło
Mathematica 507
Zastosowałem metodę rozszerzonej matrycy składu chemicznego opisaną w
LRThorne, Innowacyjne podejście do bilansowania równań chemicznych - reakcyjnych: uproszczona matryca - technika odwrotna do wyznaczania macierzy zerowej. Chem.Educator , 2010, 15, 304–308 .
Dodano jedną drobną poprawkę: transponowałem wektor zerowej przestrzeni przez największy wspólny dzielnik elementów, aby zapewnić wartości całkowite w dowolnych rozwiązaniach. Moja implementacja nie obsługuje jeszcze przypadków, w których istnieje więcej niż jedno rozwiązanie równoważenia równania.
Testy
Analiza
Działa poprzez utworzenie następującej tabeli składu chemicznego, składającej się z gatunków chemicznych według pierwiastków, do których dodawany jest wektor nieważności dodania (staje się tabelą rozszerzonego składu chemicznego:
Komórki wewnętrzne usuwa się jako matrycę i odwraca, uzyskując.
Wyodrębniona zostaje kolumna znajdująca się najbardziej z prawej strony, co daje:
Każdy element w wektorze jest podzielony przez gcd elementów (1/8), co daje:
gdzie wartości ujemne zostaną umieszczone po lewej stronie strzałki. Ich wartości bezwzględne to liczby potrzebne do zrównoważenia pierwotnego równania:
źródło
Python, 880 znaków
Testy:
Wydajność:
Może być znacznie mniej niż 880, ale moje oczy już mnie zabijają ...
źródło
Python 2, 635 bajtów
poprzednie liczby bajtów: 794, 776, 774, 765, 759, 747, 735, 734, 720, 683, 658, 655, 654, 653, 651, 638, 637, 636 bajtów.
Drugi poziom wcięcia to tylko tabulator, trzeci to tabulator, a następnie spacja.
Szczerze mówiąc, to odpowiedź jadkik94, ale tyle bajtów zostało ogolonych, musiałem to zrobić. Powiedz mi, czy mogę ogolić jakieś bajty!
źródło
''.join(map(chr,range(97,122)))
Dmap(chr,range(97,123))
Działa jednak dla 12 zapisanych bajtów.JavaScript, 682 bajtów
To jest znacznie bardziej golfowa (dekady postaci!) Odpowiedź Kuilina. Może być niekonkurencyjny, ponieważ niektóre funkcje JS są datowane po wyzwaniu.
źródło
JavaScript, 705 bajtów
(niekonkurencyjne, niektóre funkcje dodają wyzwanie)
Wszystkie inne rozwiązania miały elementy brutalnego forsowania. Próbowałem zastosować bardziej deterministyczne podejście, przedstawiając równanie chemiczne jako zbiór równań liniowych, a następnie rozwiązując je za pomocą algorytmu Gaussa-Jordana, aby przyjąć postać tej macierzy o zmniejszonym układzie rzędów-rzędów. Aby wyodrębnić trywialny przypadek, w którym wszystko jest równe zero, zakładam, że jeden z elementów jest liczbą stałą - a liczba ta jest określona przez wszystkie liczby pomnożone razem, aby nie mieć ułamków. Następnie jako ostatni krok podzielimy każdy przez gcd, aby spełnić ostatni warunek.
Nie golfowany:
Grał w golfa
źródło