Uwielbiam programować i znam każdy język, ale jestem do kitu. Niestety, moja szkoła wymaga, aby uczniowie komputerowi mieli rok rachunku różniczkowego. W przyszłym tygodniu jest test i nie znam żadnych wzorów na pochodne!
Pomóż mi znaleźć formuły. Potrzebuję ściągawki - programu (tak krótkiego, jak to możliwe, aby mój nauczyciel tego nie zauważył), który przyjmuje wyrażenie (jak 4*x^3-2
) jako dane wejściowe i wyprowadza pochodną. (Nie dbam o to, czy dane wejściowe i wyjściowe używają argumentów wiersza poleceń, STDIN, STDOUT lub cokolwiek innego, ponieważ i tak wykonuję wszystkie obliczenia w mojej głowie.)
Test obejmuje następujące typy funkcji:
- Stałe, takie jak
-3
lub8.5
- Funkcje zasilania, takie jak
x^0.5
lubx^-7
- Funkcje wykładnicze, takie jak
0.5^x
lub7^x
(podstawa jest zawsze dodatnia) - Stała pomnożona przez funkcję, taką jak
3*x^5
lub-0.1*0.3^x
- Suma i różnica wielu funkcji, takich jak
-5*x^2+10-3^x
Mój nauczyciel zawsze formatuje swoje pytania w dokładnie taki sam sposób, jak pokazano powyżej. Nie używa również ułamków, liczb takich jak pi lub e , ani naprawdę dużych liczb (większych niż 1000). Nigdy nie używa nawiasów i zawsze pokazuje mnożenie za pomocą gwiazdki ( *
). Jedyną używaną zmienną jest zawsze x .
Z drugiej strony mój nauczyciel jest dość pobłażliwy w kwestii odpowiedzi. Nie muszą być wcale uproszczone ani sformatowane dokładnie tak, jak pokazano powyżej, o ile jasne jest, co mówi odpowiedź.
Chociaż mogę używać dowolnego języka, pamiętaj, że nie jestem w stanie samodzielnie zrozumieć pochodnych. Więc jeśli program używa wbudowanych funkcji do radzenia sobie z równaniami lub obliczania pochodnych, nie będę w stanie ich użyć.
Podczas testu nie będę mieć dostępu do Internetu ani żadnych plików innych niż program na ściągawce.
Uwaga: ten scenariusz jest całkowicie fikcyjny. W prawdziwym życiu oszukiwanie i pomaganie innym w oszukiwaniu jest złe i nigdy nie powinno się tego robić.
x
zawsze będzie to zmienna, która będzie różnicować?Odpowiedzi:
Wolfram
136134109 [Podziękowania dla Calle za komentarz poniżej]Ograniczone wsparcie dla reguł produktu i łańcucha.
Przykład:
Zauważ, że nie używa to żadnych „wbudowanych funkcji do radzenia sobie z równaniami lub obliczania pochodnych”: dotyczy tylko dopasowania wzorca *.
[* No cóż ... technicznie interpreter również analizuje i buduje swego rodzaju AST na podstawie danych wejściowych]
Nie golfowany:
źródło
Power
,Times
itp. IDK ile to poprawi twoją wersję golfa, ale masz przynajmniej jednąTimes
, abyś mógł def. zapisz niektóre postacie. Zauważ też, że w twojej wersji bez golfa jest napisaned[expr_]:= v/...
.Perl - 121
122(+2 za
-p
)Test:
źródło
Haskell 38 znaków
Funkcja
d
przyjmuje funkcję i zwraca funkcję. Jest wprowadzany w postaci szeregu mocy i jest wyprowadzany w ten sam sposób (co jest rodzajem czegokolwiek).Na przykład, jeśli wprowadzimy
x->x^2
, otrzymamyx->2*x
.I dla funkcji wykładniczej.
źródło
2^x
?4*x^3-2
) jako dane wejściowe”, jak wymaga OP.Prolog 176
Obsługiwane operatory: binarne
+
, binarne-
, binarne*
, binarne^
, jednoargumentowe-
. Pamiętaj, że jednoargumentowy+
nie jest obsługiwany.Przykładowy przebieg:
Prolog jest zdezorientowany, gdy biegnie w
^-
sekwencji. Przestrzeń musi być włożona pomiędzy^
i-
na to, aby poprawnie analizować wypowiedzi.Mam nadzieję, że nauczycielowi nie przeszkadza bałagan równania.
Szalony czas:
źródło
C 260
Hej, myślę, że znam twojego nauczyciela! Czy to nie ten, który ma nadprzyrodzoną zdolność do wykrywania uczniów wykonujących funkcje dopasowywania wzorców bibliotecznych w swojej głowie?
Tak więc używanie nie
sscanf
wchodzi w rachubę ... Ale nie martw się:Uruchamianie przykładów (wejście włączone
stdin
; wyjście idzie dostdout
):Ten format jest znacznie lepszy niż tylko
12*x^2
, ponieważ w ten sposób nauczyciel może być pewien, że sam obliczyłeś odpowiedź i nie oszukiwał, kopiując ją od kogoś innego!Dane wyjściowe mają niewielki problem z domeną
x=0
, ale są poprawne prawie wszędzie !Dla porównania, tutaj jest wersja bez golfa, czytelna (dla zwykłych śmiertelników). Wykorzystuje maszynę stanów z 5 stanami i 5 kategoriami znaków wejściowych.
PS Uważaj na tę
gets
funkcję: ma ona lukę w zabezpieczeniach, która może pozwolić nauczycielowi na wykonanie rootkita w twoim umyśle, dostarczając zbyt długich danych wejściowych ...źródło
Lua
296268263Niezbyt grałem i nie mogą obecnie obsługiwać wiele warunków (można po prostu uruchomić go kilka razy, prawda?), Ale może obsłużyć
n^x
,x^n
an
jako wejście.Nie golfił ...
źródło
str.func(str,...)
==str:func(...)
, dlatego ciągi mają metatatable mimo wszystko ...l
lokalnego. Po prostu oczekuj, że wejście zostanie zapisanea
i powiedz, że wyjście zostanie zapisanel
.a:find("x")
, zauważ również, że1then
działa tylko w Lua 5.2()
opcjonalne. Zostało1then
to naprawione, ponieważ nie mam wersji 5.2 (nie robię żadnych aktualizacji procesora, dopóki nie zakończy się rozprawa b / c, nie chcę niczego zepsuć).ECMAScript 6, 127 bajtów
Oto moja próba wyrażenia regularnego (użycie jednego wyrażenia regularnego i pewnej logiki w zastępczym wywołaniu zwrotnym):
Oczekuje, że łańcuch wejściowy zostanie zapisany
i
i po prostu zwróci wynik. Wypróbuj to w konsoli zgodnej z ECMAScript 6 (takiej jak Firefox).źródło
sed, 110
Mówiąc bardzo dosłownie „Nie trzeba ich wcale upraszczać ani formatować dokładnie tak, jak pokazano powyżej, o ile jasne jest, co mówi odpowiedź”:
Liczba bajtów obejmuje 1 dla
r
flagi.Niegolfowany, z komentarzami:
Przykładowy przebieg:
Założę się, że można to jeszcze pograć w golfa; to moja pierwsza próba
sed
. Zabawa!źródło
Ruby, 152
... lub 150, jeśli nie musisz drukować ... lub 147, jeśli również dobrze sobie radzisz z tablicą, do której musisz dołączyć.
Biegnij z
ruby -nal
bez golfa:
Moim głównym problemem z tym jest liczba znaków potrzebnych do właściwego podziału. Jedynym innym sposobem, w jaki mogłem myśleć, było to,
split(/(?<!\^)([-+])/)
które daje+
i-
jako własne wyniki. Jakieś wskazówki na lepsze rozwiązanie?Ponadto, czy istnieje krótszy sposób zwrotu,
s
jeśli nie jest pusty, ale w przeciwnym razie powróciy
? Użyłems[0]?y:s
? W JS po prostu bym to zrobiłs||y
, ale""
to prawda w Ruby.źródło
split(/(?<!\^)(?=[-+])/)
?