Введение
Люди - замечательный вид, но иногда мы можем быть очень неловкими, особенно для компьютеров. В частности, нам, кажется, нравится писать многочлены в очень запутанной манере с, казалось бы, произвольными правилами.
Какую самую короткую программу вы можете написать для правильного форматирования полинома с использованием этих правил?
Вызов
вход
Список целых чисел от -1000 до 1000 (включительно), представляющий коэффициенты полинома, причем последняя запись является коэффициентом x ^ 0 (константа), вторая последняя - коэффициентом x ^ 1 и т. Д.
Выход
Строка, представляющая этот многочлен в правильно отформатированных математических обозначениях людей.
Правила:
- Знак ведущего коэффициента отображается только в том случае, если он отрицательный.
Right: -x^2+3
Wrong: +x^2+3
- Компоненты с коэффициентом 0 не печатаются (за исключением углового случая, когда все коэффициенты равны 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Коэффициенты
-1
и+1
должны отображаться без 1, если только они не являются постоянными.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- Показатель степени отображается только в том случае, если он больше 1, а переменная отображается только в том случае, если показатель степени больше 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Угловой случай: хотя нулевые значения обычно приводят к тому, что этот компонент не печатается, если все коэффициенты равны нулю, следует печатать константу 0.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Это код-гольф, поэтому победителем станет программа с наименьшим количеством байтов.
Пример ввода и вывода
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
Я с нетерпением жду ваших решений. Повеселись!
РЕДАКТИРОВАТЬ:
- Вы можете окружить операции пробелами, если хотите. Так
3x+5
и3x + 5
ладно.3x+ 5
а также3x +5
нет. - Если вы хотите создать фактические показательные символы (скажем, в тексте), это разрешено, поскольку это даже ближе к тому, как пишут люди.
- Коэффициенты должны появляться без каких-либо десятичных знаков, например
9x^2
, правильно,9.0x^2
нет.
источник
3x^2 + 4
против3x^2+4
?1x
->x
не меняется21x^2
на2x^2
.Ответы:
Сетчатка 0.8.2 , 56 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Вставьте все полномочия
x
, в том числе,x^1
но неx^0
.Удалить все степени
x
с нулевыми коэффициентами, но не в конце0
(пока).Удалить множитель
1
(но не константа1
).Удалить
^1
изx^1
.Удалите константу 0, если это не единственное, что осталось.
Удалить пробел перед
-
.Измените оставшиеся пробелы на
+
s.источник
JavaScript (ES6),
107106 байтПопробуйте онлайн!
Как?
Вывод строится путем применения следующих формул к каждому коэффициенту c входного массива a [] при отслеживании текущего показателя e .
1-я формула: знак плюс
Если коэффициент строго положительный и это не первый член в выходном выражении, мы добавляем a
+
. В противном случае мы ничего не добавляем.2-я формула: знак минус и коэффициент
Если показатель степени равен нулю или абсолютное значение коэффициента не равно 1, мы добавляем коэффициент (который может включать ведущий
-
). В противном случае мы добавляем либо-
(если коэффициент отрицательный), либо ничего.3-я формула: переменная и показатель степени
Если показатель равен 0, мы ничего не добавляем. Если показатель равен 1, мы добавляем
x
. В противном случае мы добавляем сx^
последующим показателем степени.источник
Stax , 37 байт
Запустите и отладьте его онлайн
Вот распакованная версия без игры в гольф.
Запустите этот
источник
Python 3,
279277258251 байтПринимает ввод в виде списка строк. Это решение пока не очень удачное. Это в основном работает, заменяя вещи в соответствии с форматом вывода, что значительно увеличивает количество байтов.
Попробуйте онлайн!
Отдельное спасибо ovs и NK1406 .
источник
if'0'!=i
иif'-1'==i
.Пари / ГП , 41 байт
Попробуйте онлайн!
Если
*
между коэффициентом и переменной разрешено:Пари / ГП , 3 байта
Попробуйте онлайн!
источник
APL (Dyalog Classic) ,
114113109107106 байтПопробуйте онлайн!
-4 байта благодаря @dzaima!
Это определенно может быть дальше. Это требует
⎕IO←0
источник
Пип , 78 байт
Принимает коэффициенты в качестве аргументов командной строки. Попробуйте онлайн!
Использует
ME
(map-enumerate) иJ
(join), чтобы сгенерировать что-то в форме0x^3+-1x^2+35x^1+0x^0
, а затем кучу замен регулярных выражений, чтобы преобразовать это в правильный формат.источник
APL (Dyalog Classic) ,
7976 байтПопробуйте онлайн!
источник
Python 3,
161162 байтаИсправлена ошибка благодаря ovs.
Expanded:
источник
C # , 237 байт
источник
Чисто , 172 байта
Попробуйте онлайн!
источник
Wolfram Language / Mathematica, 39 байт
Попробуйте онлайн!
Оказывается, есть встроенный вход в правильном порядке.
Предыдущее решение:
Wolfram Language / Mathematica, 93 байта
По крайней мере, для меня это удивительно долго для языка, предназначенного для математических манипуляций. Кажется, что этоExpand@FromDigits[#,x]&
должно сработать, но порядок по умолчанию для полиномов противоположен тому, что требуется в вопросе, поэтому требуется некоторая дополнительная путаница.объяснение
источник
SringReplace
бытьStringReplace
?Python3:
150146 байт(предыдущие реализации):
Вы можете попробовать это онлайн
Слава: @ Бенджамин
источник
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 байтаПопробуйте онлайн!
источник
Сетчатка 0.8.2 , 113 байт
Попробуйте онлайн!
Я уверен, что здесь есть много для игры в гольф ...
источник
Haskell ,
166163 байтаПопробуйте онлайн! Пример использования:
g [0,-1,35,0]
доходность"-x^2+35x"
.Предыдущее 166-байтовое решение, которое немного лучше читается:
Попробуйте онлайн!
источник
Рубин , 111 байт
Попробуйте онлайн!
Решение этой проблемы в Ruby оказалось немного неприятным, в основном из-за того, что, в отличие от большинства языков, в Ruby (почти) все верно, в том числе 0 и пустые строки, так что даже простая проверка на ноль становится совсем рядом так коротко, как
x?
.Я играл с различными методами построения строки и в итоге остановился на сочетании нескольких подходов:
+
и-
знаки производятся путем форматирования синтаксиса с принудительным знаком:%+d
x^i
выбрана с помощью индексации ракетного оператора[...][i<=>1]
источник
Шелуха ,
44 43 4140 байтПопробуйте онлайн!
Это чувствует себя немного неуклюжим; Шелуха не оптимизирована для работы со строками. Я позаимствовал некоторые идеи из ответа Stax .
объяснение
источник
Perl 6 , 97 байт
Попробуйте онлайн!
Объяснение:
$!
отслеживает текущий показатель.Добавьте
+
перед положительными коэффициентами, кроме случаев, когда это первый ненулевой.$_&&
Короткое замыкание гарантирует , что анонимная переменная состояния$
увеличиваются только для ненулевых коэффициентов.&
Узел свернут , когда принуждают Bool с?
.Декремент
$!
. Коэффициент Chop 1 или -1, если он не постоянен.Особые случаи линейных и постоянных членов. Использование
<< >>
конструкции защиты от кавычек на один байт короче, чем эквивалент('','x')
или2>$!??'x'x$!!!'x^'~$!
.Скройте нулевые термины, но всегда оценивайте предыдущее выражение для
--$!
побочного эффекта.Вернуть,
0
если все коэффициенты равны нулю.источник
Java 8,
202176174173 байтаОбъяснение:
Попробуйте онлайн.
источник
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
на0*j--
.Python, 165 байт
источник
PHP, 213 байт
Аргумент командной строки по запросу OP (один аргумент с квадратными скобками и запятыми).
Симпатичный принт и некоторые объяснения:
источник
PowerShell, 295 байт
источник