Я люблю программирование и знаю каждый язык, но я сосу математику. К сожалению, моя школа требует, чтобы компьютеры учеников проходили год обучения. На следующей неделе будет тест, и я не знаю ни одной формулы для производных!
Пожалуйста, помогите мне найти формулы. Мне нужен шпаргалка - программа (настолько короткая, насколько это возможно, чтобы мой учитель не заметил этого), которая принимает выражение (например 4*x^3-2
) в качестве входных данных и выводит производную. (Мне все равно, будут ли входные и выходные данные использовать аргументы командной строки, STDIN, STDOUT или что-то еще, поскольку я все равно делаю все вычисления в своей голове.)
Тест охватывает следующие типы функций:
- Константы, как
-3
или8.5
- Силовые функции, как
x^0.5
илиx^-7
- Экспоненциальные функции, как
0.5^x
или7^x
(база всегда положительна) - Константа, умноженная на функцию, например
3*x^5
или-0.1*0.3^x
- Сумма и разность нескольких функций, таких как
-5*x^2+10-3^x
Мой учитель всегда форматирует свои вопросы точно так же, как показано выше. Он также не использует дроби, числа, такие как пи или е , или действительно большие числа (больше 1000). Он никогда не использует круглые скобки и всегда показывает умножение, используя звездочку ( *
). Единственная используемая переменная всегда х .
С другой стороны, мой учитель довольно снисходительно относится к ответам. Их совсем не нужно упрощать или форматировать в точности так, как показано выше, при условии, что ясно, что говорит ответ.
Хотя я могу использовать любой язык, помните, что я не могу самостоятельно определить производные. Так что, если программа использует встроенные функции для работы с уравнениями или вычисления производных, я не смогу использовать его.
Во время теста у меня не будет доступа к Интернету или другим файлам, кроме программы на шпаргалке.
Примечание. Этот сценарий полностью вымышлен. В реальной жизни обманывать и помогать другим обманывать - это неправильно и никогда не должно быть сделано.
x
это всегда переменная для дифференциации?Ответы:
Вольфрам
136134109 [Спасибо Калле за его комментарий ниже]Ограниченная поддержка правил продукта и цепочки.
Пример:
Обратите внимание, что здесь не используются никакие «встроенные функции для работы с уравнениями или вычисления производных»: используется только сопоставление с образцом *.
[* Ну ... технически интерпретатор также анализирует и создает своего рода AST из входных данных]
Ungolfed:
источник
Power
иTimes
т. Д. ИДК, насколько это улучшит вашу версию для гольфа, но у вас есть хотя бы один вариант,Times
чтобы вы могли определить. сохранить несколько символов. Также обратите внимание, что в вашей негольфированной версии написаноd[expr_]:= v/...
.Perl - 121
122(+2 за
-p
)Контрольная работа:
источник
Haskell 38 символов
Функция
d
принимает функцию и возвращает функцию. Он вводится в виде степенного ряда и выводится тем же способом (который является типом чего угодно).Например, если мы введем
x->x^2
, мы получимx->2*x
.И для показательной функции.
источник
2^x
?4*x^3-2
) в качестве входных данных», как того требует ОП.Пролог 176
Поддерживаемые операторы: двоичные
+
, двоичные-
, двоичные*
, двоичные^
, унарные-
. Обратите внимание, что унарный+
не поддерживается.Образец прогона:
Пролог в замешательстве, когда он работает в
^-
последовательности. Пространство должно быть вставлено между^
и-
для того , чтобы правильно разобрать выражение.Надеюсь, ваш учитель не возражает против беспорядка уравнения.
Сумасшедшее время:
источник
С 260
Эй, я думаю, что знаю твоего учителя! Разве это не тот, кто обладает сверхъестественной способностью обнаруживать учеников, выполняющих функции сопоставления с образцом библиотеки в своей голове?
Итак, об использовании не
sscanf
может быть и речи ... Но не волнуйтесь:Выполнение примеров (вход включен
stdin
; выход идет вstdout
):Этот формат намного лучше, чем просто
12*x^2
, потому что таким образом ваш учитель может быть уверен, что вы сами рассчитали ответ, а не обманули, скопировав его у кого-то другого!Вывод имеет небольшую проблему с доменом в
x=0
, но это верно почти везде !Для справки, вот неопрятная, читаемая (для простых смертных) версия. Он использует конечный автомат с 5 состояниями и 5 категориями вводимых символов.
PS Остерегайтесь этой
gets
функции: в ней есть уязвимость, которая может позволить вашему учителю выполнить руткит в вашем уме, предоставляя слишком длинный ввод ...источник
Луа
296268263Не очень golfed и не может в настоящее время обрабатывать несколько терминов (вы можете просто запустить его несколько раз, не так ли?), Но он может работать
n^x
,x^n
и вn
качестве входных данных.Ungolfed ...
источник
str.func(str,...)
==str:func(...)
, именно поэтому струны получилиl
local. Просто ожидайте, что вход будет сохранен,a
и скажите, что выход будет сохранен вl
.a:find("x")
, также обратите внимание, что1then
работает только в Lua 5.2()
это необязательно. Это1then
было просто исправлено, так как у меня нет 5.2 (я не делаю никаких обновлений ЦП, пока не закончена диссертация, потому что я не хочу ничего испортить).ECMAScript 6, 127 байт
Вот моя попытка регулярного выражения (с использованием одного регулярного выражения и некоторой логики в обратном вызове замены):
Это предполагает, что входная строка будет сохранена
i
и просто вернет результат. Попробуйте это в консоли ECMAScript 6 (как в Firefox).источник
Сед, 110
В буквальном смысле «их не нужно ни упрощать, ни форматировать в точности так, как показано выше, если понятно, что говорит ответ»:
Количество байтов включает 1 для
r
флага.Ungolfed, с комментариями:
Образец прогона:
Могу поспорить, что это может быть дальше в гольфе; это моя первая попытка
sed
. Веселье!источник
Руби, 152
... или 150, если вам не нужно печатать ... или 147, если вы также в порядке с массивом, к которому вам нужно присоединиться.
бежать с
ruby -nal
ungolfed:
Моя главная проблема с этим - количество символов, которые нужно разделить. Единственный другой способ, которым я мог придумать, был,
split(/(?<!\^)([-+])/)
который дает+
и-
как их собственные результаты. Любые намеки на лучшее решение?Кроме того, есть ли более короткий способ возврата,
s
если он не пустой, а в противном случае возвратy
? Я использовалs[0]?y:s
? В JS я бы просто сделалs||y
, но""
это правда в Ruby.источник
split(/(?<!\^)(?=[-+])/)
?