Оцініть поліноміальний рядок виразів


18

Створіть функцію, яка приймає поліноміальне рівняння, значення для xта повертає результат операції.

Приклад: дані 4x^2+2x-5та x=3вихідні дані 37. Це результат4(3)^2+2(3)-5

  • Припустимо, що всі многочлени є дійсними
  • Формат полінома завжди буде coefficient(variable)^exponent => 4x^2 за винятком:
    • Коли показник - 1це будеcoefficient(variable) => 4x
    • Коли коефіцієнт 1він буде(variable)^exponent => x^2
  • Поліноми є лише однією змінною
  • Використання зовнішніх бібліотек заборонено
  • Коефіцієнт і змінний вхід можуть бути додатними і від’ємними числами.

Тестові справи

  • ("3x^3-5x^2+2x-10", 5) => 250
  • ("10x^4-5x^3-10x^2+3x+50", 3) => 644
  • ("10x+20", 10) => 120
  • ("-20x^2+20x-50", -8) => -1490
  • ("9", 5) => 9
  • ("8x^2+5", 0) => 5

Оновлення

  • Формат полінома завжди буде coefficient(variable)^exponent => 4x^2 за винятком:
    • Коли показник - 1це будеcoefficient(variable) => 4x
    • Коли коефіцієнт 1він буде(variable)^exponent => x^2
  • Видалено правило негативного показника. Моя помилка. Дійсний многочлен не містить негативного показника
  • Експонент 0був би справедливимcoefficient
  • Додано тестовий випадок для input 0

Це , тому найкоротша відповідь у байтах виграє.


3
Наскільки гнучким є формат введення? Замість того, 3x^3-5x^2+2x-10щоб ми могли ввести 3*x^3-5*x^2+2*x-10? Або [3 -5 2 -10]. [3 2 1 0]?
Луїс Мендо

1
@Arnauld Так ...
Luis felipe De jesus Munoz

4
Що таке "зовнішня бібліотека" і наскільки це справедливо, порівняно з мовами, які "eval" вже реалізовані як особливість?
Олів'є Грегоар

1
Вибачте, я не використовував свій ПК з вчорашнього дня. Я оновив виклик пропозиціями, які ви мені дали. Будь ласка, погляньте на це і знову відкрийте його, якщо все в порядку.
Luis felipe De jesus Munoz

Відповіді:


12

JavaScript (ES7), 48 байт

На основі пропозиції від @RickHitchcock

Очікує Xвеликі літери. Здійснює введення в синтаксис currying (p)(X).

p=>X=>eval(p.replace(/[X^]/g,c=>c<{}?'*X':'**'))

Спробуйте в Інтернеті!


JavaScript (ES7), 49 байт

Той самий підхід, що і @DeadPossum . Здійснює введення в синтаксис currying (p)(x).

p=>x=>eval(p.split`x`.join`*x`.split`^`.join`**`)

Спробуйте в Інтернеті!


1
Я думаю, ви можете зберегти пару байтів, використовуючи replace: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
Рік Хічкок

@RickHitchcock Я не можу використати посилання на fнього, якщо воно не включено до підрахунку байтів, ціною двох байтів, які слід зберегти. Мені подобається цей метод. Можливо, є спосіб зберегти байт або два, перетворивши його якось.
Арнольд

2
@RickHitchcock Якщо ми можемо взяти Xвеликі регістри , тоді ми можемо це зробити a<{}?'*X':'**', економлячи байт. Звідси моє запитання до ОП.
Арнольд

1
не можу впоратись xпоодинці
l4m2

1
@ l4m2 Правила виклику були оновлені. : / Раніше 1xдля x.
Арнольд


8

Python 3 , 53 50 48 байт

редагувати : -5 байт завдяки Деннісу!

lambda p,x:eval(p.translate({94:"**",120:"*x"}))

Спробуйте в Інтернеті!

Використовується translateдля уникнення прикування replaceдзвінків; Версія Python 3 translateменш незграбна, ніж версія попередника.


"*(%d)"%xможе стати "*(x)".
Денніс

Дякую, я ніколи не з'ясував, що подію xбуло в моїх evalмежах! Я оновлю.
etene

1
Насправді, оскільки xце більше не є рядкове представлення, "*x"працює також.
Денніс

Навіть краще ! Знову дякую.
етен

5

R , 44 байти

function(f,x)eval(parse(t=gsub("x","*x",f)))

Спробуйте в Інтернеті!

Досить прямо з R. Замініть nxна, n*xа потім evalна parsed-рядок. xвикористовується так, як ми називаємо другий аргумент.

Функція Eval навіть може бути використана більш безпосередньо з правильно відформатованим першим аргументом, і інші формальні аргументи ( y, zі т.д.) можуть бути легко додані:

R , 20 байт (не конкуруючий)

function(f,x)eval(f)

Спробуйте в Інтернеті!


4

Japt 2.0, 13 байт

OvUd^'*²'x"*V

Спробуйте .

Пояснення:

OvUd^'*²'x"*V
              U = Implicit first input
              V = Implicit second input

Ov            Eval:
  Ud            In U, replace:
    ^             "^" with:
     '*²            "**"
        'x        "x" with:
          "*V       "*V"


3

JavaScript (Node.js) , 113 108 байт

_=>x=>_.match(/-?(?:[x\d]+|\^?)+/g).reduce((a,b)=>b.split`x`[0]*(~b.indexOf`x`?x**(b.split`^`[1]||1):1)+a,0)

Спробуйте в Інтернеті!

Дякуємо @Arnauld


Оскільки найкраще JS-рішення на сьогодні @Arnauld (49 байт) вже розміщене і воно використовує eval, я вирішив використовувати Regex і зменшити замість цього.

Досить тривалий порівняно з його хоч.

Пояснення:

A =>                            // lambda function accepting argument 1 
    x =>                        // argument number 2 (currying syntax used)
        A.match(                // this matches all instance of what comes next 
                                // and converts to array
       /[-]?(?:[x\d]+|\^?)+/g)  // regexp for -ve sign , variable number and ^ sign 
            .reduce((a, b) =>   // reduce the array to single (take 2 params a,b)
                b.split `x`     // split b at instances of `x` 
                        [0]     // and select the first instance 
                * (b.indexOf`x` // multiply that by value of index of x in b 
                    > 0 ?       // if it is greater than 0 then 
                x **            // multiplication will be with x raised to power
               (l = b.split `^` // set variable split b at every `x` 
                   [1]||1       // choose first index otherwise set to one
                )               // this is what x is raised to the power 
                : 1)            // in the case x is not present multiply by 1
                + a,            //  add value of `a` to that value 
        0)                      // in case no reduce is possible set value to 0


Наразі це не вдається в останньому тестовому випадку (має бути 0,25). Ви можете зберегти кілька байтів, використовуючи -замість [-], ~b.indexOf`x` а не b.indexOf`x`>0видаляючи, l=які не використовуються. (Але це не виправляє помилку.)
Арнольд

@Arnauld: Дякую Не маючи ідеї, чому це робиться, побачимо, в чому проблема
Мухаммед Салман

Ну, проблема полягає в тому, що ваш регекс розпадається 1x^-2на -.
Арнольд

3

05AB1E , 16 19 байт

„*(I')J'xs:'^„**:.E

+3 байти як виправлення помилок для негативного введення x.

.E( Запустити як пакетний код ) було замінено на Виконати як Pythoneval в останній версії @Adnan , але ця версія ще не є TIO. @ Mr.Xcoder перевірив його на своїй локальній (остання версія) 05AB1E, щоб перевірити, чи працює він.
Перегляньте цю версію, не .Eпобачивши, як вона перетворила рядок виразів.

Пояснення:

„*I')J'xs:    # Replace all "x" with "*(n)" (where `n` is the input-integer)
              #  i.e. 5 and 3x^3-5x^2+2x-10 → 3*(5)^3-5*(5)^2-2*(5)-10
'^„**:        # Replace all "^" with "**"
              #  i.e. 3*(5)^3-5*(5)^2-2*(5)-10 → 3*(5)**3-5*(5)**2-2*(5)-10
.E            # Evaluate as Python-eval
              #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → 250

Альтернатива 25- байтній програмі, яка працює на поточній версії TIO:

„*(I')J'xs:'^„**:“…¢(“s')J.e

Спробуйте в Інтернеті.

Пояснення:

„*(I')J'xs:'^„**:    # Same as explained above
“…¢(“                # Literal string "print("
     s               # Swap both
      ')             # Literal character ")"
        J            # Join everything together
                     #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → print(3*(5)**3-5*(5)**2-2*(5)-10)
.e                   # Run as Python code
                     #  i.e. print(3*(5)**3-5*(5)**2-2*(5)-10) → 250

“…¢(“це рядок print(, тому що:

  • і починається і закінчується стислим рядком
  • …¢дорівнює 0426тому, що він переглядає індекси у файлі info.txt , де має індекс 4 та ¢має індекс 26.
  • Потім цей індекс 0426використовується у словниковому файлі , де рядок 427 (індекс 426) - це слово, яке він отримує, що є printв цьому випадку.
  • У (файлі info.txt немає індексу, тому він інтерпретується як є.

2

JavaScript (Node.js) , 143 байти

Я знаю, що є кращі відповіді, але я хотів це зробити, не використовуючи eval

(_,x)=>_.match(/[+-]?(?:[a-z0-9.]+|\^-?)+/gi).reduce((a,b)=>~~(b.split('x')[0])*(b.indexOf('x')>0?Math.pow(x,(l=(b.split('^')[1]))?l:1):1)+a,0)

Спробуйте в Інтернеті!


Ваш регекс не потребує [a-z0-9.]? Єдиний лист, який може з’явитися, - це x. Будь-чому .? Вам не потрібно обробляти не цілі коефіцієнти або експоненти.
Пітер Кордес



2

Java 8, 150 149 148 байт

n->s->new javax.script.ScriptEngineManager().getEngineByName("JS").eval(s.replace("x","*"+n).replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))

Не впевнений, чи можливо функціонувати лямбда-каррі, що кидає виняток. Якщо це так, 1 байт можна зберегти, змінивши (s,n)->на n->s->. -1 байт завдяки @ OlivierGrégoire за те, що він показав мені, як це зробити.

Спробуйте в Інтернеті.

Пояснення:

n->s->     // Method with integer and String parameters and Object return-type
  new javax.script.ScriptEngineManager().getEngineByName("JS")
            //  Use a JavaScript engine
   .eval(s  //  And eval the input
      .replace("x","*"+n)
            //   After all 'x' has been replaced with '*n'
            //   (where `n` is the input-integer)
      .replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))
            //   And all `A^B` have have been replaced with `Math.pow(A,B)`
            //   (where both `A` and `B` are integers)

На жаль, JavaScript eval не підтримує **, тому мені доведеться використовувати довшу заміну, щоб перетворити його Math.powнатомість ..


JavaScript підтримує **(ES7 +), чому це не підтримує?
Мухаммад Салман

Крім того, немає ніякої оцінки в Java. Це не може бути правильно?
Мухаммад Салман

@MuhammadSalman Ні, у Java немає eval. І я думаю, що цей вбудований JavaScript-eval, яким я можу користуватися ScriptEngineManager, не оновлювався в Java JDK роками, тому він не підтримує ES7+..
Кевін Круїйсен

Людина, джева смокче, немає евалу чому? Гаразд, чому вона не була оновлена?
Мухаммад Салман

@MuhammadSalman Я не знаю .. Вам потрібно буде задати творцям Java це питання. ;)
Кевін Круїссен

2

TI-Basic, 6 байт

Prompt X:expr(Ans

Вираз приймається за аргумент, а X вводиться під час виконання. 8 байтів без expr:

Prompt X,u:u

Тут обидва аргументи вводяться під час виконання.


2

Октава , 47 38 37 байт

Збережено багато байт, взявши другий вхід як рядок замість числа.

@(x,c)eval(strrep(x,'x',['*(',c,41]))

Спробуйте в Інтернеті!

Пояснення:

Досить прямо вперед: Замініть xна (c), де cє другий вхід, і оцініть. Паретези необхідні тому, що в Октаві -8^2 == -64.




1

Рубі , 43 41 байт

->p,x{eval p.gsub('^','**').gsub'x','*x'}

Спробуйте в Інтернеті!

Збережено два байти завдяки @ Mr.Xcoder


Оскільки відповіді на Ruby ще немає, я додав її. Нвм був такий, який використовував інший підхід

Пояснення:

->p,x{                    # lambda function that takes two arguments p and x
    eval(                 # eval 
        p.gsub(           # replace all instance of 
            '^' , '**'    # `^` with `**` (use for raised to power of)
        )                 # end gsub
        .gsub(            # start another replace all
            'x' , '*x'    # replace all instances of `x` with `*x`
        )                 # end the replace function
    )                     # end eval function
}                         # end lambda function


1

Excel, 36 + 2 байти, неконкурентоспроможний

Оцінка текстового поля як формули не є прямолінійним в Excel. Є приховане=EVALUATE() функція, яку можна викликати шляхом визначення Імені.

У Excel 2007, Формули> Визначити ім'я. Визначте ім'я, яке називається E, з посиланням на:

=EVALUATE(SUBSTITUTE(A1,"x","*"&B1))

Потім, з формулою входом в A1, xзначення в B1, що входить =Eв C1повернень очікуваного результату.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.