Символическое дифференцирование 1: ушел Coefishin '
задача
Напишите программу, которая принимает полином от x из стандартного ввода (1 <deg (p) <128) и дифференцирует его. Входной многочлен будет строкой следующей формы:
"a + bx + cx^2 + dx^3 +" ...
где коэффициент каждого члена является целым числом (-128 <a <128). Каждый член отделяется одним пробелом, + и другим пробелом; линейные и постоянные члены выглядят, как указано выше (то есть, нет x^0
или x^1
). Термины будут появляться в порядке возрастания степени, а те степени с нулевым коэффициентом опущены. Все термины с коэффициентом 1 или -1 отображают этот коэффициент явно.
Ваш вывод должен иметь точно такую же форму. Обратите внимание, что коэффициенты на выходе могут быть такими большими, как 127 * 127 == 16129.
Примеры
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
счет
Ваша оценка - это длина вашей программы в байтах, умноженная на три, если вы используете встроенную или библиотеку, которая выполняет символическую алгебру.
Ответы:
Retina ,
534342414035 байтВ целях подсчета каждая строка идет в отдельном файле, но вы можете запустить вышеуказанное как один файл, вызвав Retina с
-s
флагом.Это предполагает, что числа во входной строке будут даны в унарном формате и будут давать выходные данные в том же формате. Например
вместо того
объяснение
Код описывает одну подстановку регулярных выражений, которая в основном состоит из 4 подстановок, сжатых в одну. Обратите внимание, что только одна из ветвей заполнит группу,
$2
поэтому, если какие-либо другие три совпадения, совпадение будет просто удалено из строки. Итак, мы можем взглянуть на четыре разных случая отдельно:Если можно найти пробел в начале строки, не встречая, это
x
означает, что первый член является постоянным, и мы его удаляем. Из-за жадности+
, это также будет соответствовать плюс и второй пробел после постоянного члена. Если нет постоянного члена, эта часть просто никогда не будет совпадать.Это соответствует символу,
x
за которым следует пробел, т. Е.x
Линейного члена (если он существует), и удаляет его. Мы можем быть уверены, что после него есть пробел, потому что степень многочлена всегда равна как минимум 2.Это выполняет умножение коэффициента на показатель степени. Это соответствует единичному
1
коэффициенту и заменяет его на весь соответствующий показатель степени с помощью предварительного просмотра.Это уменьшает все оставшиеся экспоненты путем сопоставления конечного значения
1
(обеспечивается предварительным просмотром). Если это возможно, чтобы соответствовать^11
(и граница слова), мы удаляем это вместо этого, который заботится о правильном отображении линейного термина.Что касается сжатия, мы замечаем, что большинство условий не влияют друг на друга.
(\^1)?
не будет совпадать, если предположение в третьем случае истинно, поэтому мы можем сложить эти два какТеперь у нас уже есть предпросмотр , необходимое для второго случая , а другие никогда не могут быть истинными при совпадении
x
, так что мы можем просто обобщить1
к\w
:Первый случай на самом деле не имеет ничего общего с другими, поэтому мы держим его отдельно.
источник
CJam,
4341 байтСпасибо @ jimmy23013 за указание на одну ошибку и отыгрывание двух байтов!
Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
Perl,
6463 байта62b код + 1 командная строка (-p)
Не удивительно на данный момент, но я буду продолжать пытаться сократить его.
Пример использования:
Спасибо Денис за -1б
источник
Юлия, 220 байт
Нет регулярных выражений!
Это создает лямбда-функцию, которая принимает строку и возвращает строку. Внутренние символы имитируют то, что происходит, когда вычисляется код Джулии: строка разбирается на символы, выражения и вызовы. Я мог бы на самом деле попытаться написать полную функцию символического дифференцирования Юлии и представить ее как часть Юлии.
Ungolfed + объяснение:
источник
C
204162 байтаВ основном разберите каждый термин и распечатайте дифференцированный термин в последовательности. Довольно просто.
источник
JavaScript ES6, 108 байт
Фрагмент ES5:
источник
Python 2, 166 байт
Мальчик, это кажется дольше, чем должно быть.
Функция
d
принимает непостоянный членt
и возвращает свою производную. Причина, по которой яdef
использую функцию вместо использования лямбды, заключается в том, что я могу присвоить показатель минус 1e
, который затем используется еще четыре раза. Основная раздражающая вещь заключается в том, что нужно переходить туда-сюда между строками и целыми числами, хотя в этом помогает оператор backtick в Python 2.Затем мы разбиваем входные данные на термины и вызываем
d
каждый из"x"
них, тем самым устраняя постоянный член. Результаты объединяются и печатаются.источник
CJam,
62575549 байтНу, Деннис опозорил это еще до того, как я заметил, что сайт вернулся. Но вот мое творение в любом случае:
Последняя версия сохраняет несколько байтов с ярлыками, предложенными @Dennis (используйте переменные и разделяйте их пробелами вместо
+
).Попробуйте онлайн
источник
_({'^a\}{;}?
на 1 байт длиннее:T({T'^a\}&
.~
оставшийся блок else, и вы можете также удалить его.x
. Я нашел еще несколько улучшений, пока я был на этом. Главным образом, поскольку у меня теперь есть значения в переменных, я могу вспомнить их там, где они мне действительно нужны, сохранив некоторые манипуляции со стеком. У меня также был шальной,a
который должен был быть удален, когда я оптимизировал генерацию вывода ранее.Pyth, 62 байта
Довольно уродливое решение, использующее некоторые подстановки регулярных выражений.
источник
Python 3, 176 байт
Действительно, главное раздражение в том, что нужно конвертировать строки в строки. Кроме того, если требуется постоянный термин, код будет только 153 байта.
источник
Python 2, 229 байт
источник
Python 2, 174 байта
К сожалению, трюк DLosc переименовать метод split и выполнить дифференцирование в определенной функции не сокращает мой код ...
источник