Oceń wielomianowy ciąg wyrażenia

18

Utwórz funkcję, która pobiera równanie wielomianowe, wartość xi zwraca wynik operacji.

Przykład: dany 4x^2+2x-5i x=3wynik 37. To wynik4(3)^2+2(3)-5

  • Załóżmy, że wszystkie wielomiany są prawidłowe
  • Format wielomianowy zawsze będzie coefficient(variable)^exponent => 4x^2z wyjątkiem:
    • Kiedy wykładnik 1to będziecoefficient(variable) => 4x
    • Gdy będzie 1to współczynnik , będzie(variable)^exponent => x^2
  • Wielomiany są tylko jedną zmienną
  • Korzystanie z bibliotek zewnętrznych jest zabronione
  • Współczynnik i zmienne wejściowe mogą być dodatnimi i ujemnymi liczbami.

Przypadki testowe

  • ("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

Aktualizacja

  • Format wielomianowy zawsze będzie coefficient(variable)^exponent => 4x^2z wyjątkiem:
    • Kiedy wykładnik 1to będziecoefficient(variable) => 4x
    • Gdy będzie 1to współczynnik , będzie(variable)^exponent => x^2
  • Usunięto zasadę wykładnika ujemnego. Mój błąd. Prawidłowy wielomian nie zawiera wykładnika ujemnego
  • Wykładnik 0byłby sprawiedliwycoefficient
  • Dodano przypadek testowy dla input 0

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Luis Felipe De Jesus Munoz
źródło
3
Jak elastyczny jest format wejściowy? Czy 3x^3-5x^2+2x-10możemy wprowadzić 3*x^3-5*x^2+2*x-10? Czy [3 -5 2 -10]. [3 2 1 0]?
Luis Mendo
1
@Arnauld Tak ...
Luis Felipe De
4
Co to jest „biblioteka zewnętrzna” i jak jest sprawiedliwa w porównaniu z językami, które „eval” już zaimplementowały jako funkcję?
Olivier Grégoire
1
Przepraszam, że od wczoraj nie korzystam z komputera. Zaktualizowałem wyzwanie sugestiami, które mi dałeś. Spójrz na to i otwórz je ponownie, jeśli wszystko jest w porządku.
Luis felipe De jesus Munoz

Odpowiedzi:

12

JavaScript (ES7), 48 bajtów

Na podstawie sugestii @RickHitchcock

Oczekuje Xwielkimi literami. Pobiera dane wejściowe w składni curry (p)(X).

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

Wypróbuj online!


JavaScript (ES7), 49 bajtów

Takie samo podejście jak @DeadPossum . Pobiera dane wejściowe w składni curry (p)(x).

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

Wypróbuj online!

Arnauld
źródło
1
Myślę, że możesz zaoszczędzić kilka bajtów, używając replace: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
Rick Hitchcock
@ RickHitchcock Nie mogę użyć odwołania, fchyba że jest ono uwzględnione w liczbie bajtów, kosztem 2 bajtów, które powinny zostać zapisane. Jednak podoba mi się ta metoda. Może istnieć sposób na zaoszczędzenie jednego lub dwóch bajtów poprzez ich przeróbkę.
Arnauld
2
@ RickHitchcock Jeśli możemy wziąć Xwielkie litery, możemy to zrobić a<{}?'*X':'**', oszczędzając bajt. Stąd moje pytanie do OP.
Arnauld
1
nie mogę poradzić sobie xsam
l4m2
1
@ l4m2 Reguły wyzwania zostały zaktualizowane. : / Kiedyś 1xza x.
Arnauld
8

Python 2 , 54 bajty

-2 bajty dzięki Jo King

-5 bajtów dzięki Arnauldowi

lambda p,x:eval(p.replace('^','**').replace('x','*x'))

Wypróbuj online!

Dead Possum
źródło
8

Python 3 , 53 50 48 bajtów

edycja : -5 bajtów dzięki Dennisowi!

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

Wypróbuj online!

Służy translatedo unikania replacepołączeń łańcuchowych ; Wersja Pythona 3 translatejest mniej niezręczna niż jej poprzednik.

eten
źródło
"*(%d)"%xmoże zostać "*(x)".
Dennis
Dziękuję, nie wiedziałem, że wydarzenie xjest w moim evalzasięgu! Zaktualizuję.
etene
1
W rzeczywistości, ponieważ xnie jest już reprezentacją ciągu, "*x"działa również.
Dennis
Nawet lepiej ! Dzięki jeszcze raz.
etene
5

R , 44 bajty

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

Wypróbuj online!

Dość proste z R. Wymień nxz n*xczym ciąg d. jest używany, ponieważ tak nazywamy drugi argument.evalparsex

Funkcja eval mogą być używane nawet bardziej bezpośrednio z prawidłowo sformatowany pierwszy argument, a inne argumenty formalne ( y, z, itd.) Może być łatwo dodana:

R , 20 bajtów (niekonkurencyjny)

function(f,x)eval(f)

Wypróbuj online!

JayCe
źródło
4

Japt 2.0, 13 bajtów

OvUd^'*²'x"*V

Spróbować .

Wyjaśnienie:

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

Ov            Eval:
  Ud            In U, replace:
    ^             "^" with:
     '*²            "**"
        'x        "x" with:
          "*V       "*V"
Oliver
źródło
3

JavaScript (Node.js) , 113 108 bajtów

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

Wypróbuj online!

Dzięki @Arnauld


Ponieważ najlepsze dotychczasowe rozwiązanie JS @Arnauld (49 bajtów) zostało już opublikowane i korzysta z niego eval, postanowiłem użyć Regex i zmniejszyć zamiast tego.

Dość długi w porównaniu do jego.

Objaśnienie:

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

Muhammad Salman
źródło
To obecnie kończy się niepowodzeniem w ostatnim przypadku testowym (powinno wynosić 0,25). Możesz zapisać kilka bajtów, używając -zamiast [-], ~b.indexOf`x` zamiast b.indexOf`x`>0i usuwając, l=który nie jest używany. (Ale to nie naprawia błędu.)
Arnauld
@Arnauld: Dzięki. Nie mam pojęcia, dlaczego to robi, zobaczy, na czym polega problem
Muhammad Salman
Problem polega na tym, że wyrażenie regularne dzieli 1x^-2się na -.
Arnauld
3

05AB1E , 16 19 bajtów

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

+3 bajty jako poprawka błędów dla negatywnych danych wejściowych x.

.E( Uruchom jako kod wsadowy ) został zastąpiony przez Uruchom jako Pythoneval w najnowszym zatwierdzeniu @Adnan , ale ta wersja nie jest jeszcze dostępna w TIO. @ Mr.Xcoder przetestował go na swoim lokalnym (najnowsza wersja) 05AB1E, aby sprawdzić, czy działa.
Zobacz tę wersję, .Eaby zobaczyć, jak przekonwertował ciąg wyrażenia.

Wyjaśnienie:

„*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

Alternatywny 25 28 bajtowy program, który działa na bieżącej wersji TIO:

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

Wypróbuj online.

Wyjaśnienie:

„*(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

“…¢(“jest ciągiem print(, ponieważ:

  • i rozpoczyna i kończy skompresowany ciąg
  • …¢jest równa, 0426ponieważ przegląda indeksy w pliku info.txt , gdzie ma indeks 4 i ¢indeks 26.
  • Indeks ten 0426jest następnie używany w pliku słownika , w którym wiersz 427 (indeks 426) jest słowem, które pobiera, co printw tym przypadku.
  • Plik (nie ma indeksu w pliku info.txt, więc jest interpretowany jako taki.
Kevin Cruijssen
źródło
2

JavaScript (Node.js) , 143 bajty

Wiem, że są lepsze odpowiedzi, ale chciałem to zrobić bez użycia 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)

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Twój regex nie potrzebuje [a-z0-9.], prawda? Jedyną literą, która może się pojawić, jest x. Wiesz dlaczego .? Nie musisz obsługiwać współczynników ani wykładników niecałkowitych.
Peter Cordes,
2

Galaretka , 21 bajtów

ṣ”^j⁾**ṣ”xjØ(j”*;Ʋ}ŒV

Wypróbuj online!

Erik the Outgolfer
źródło
Ze względu na pierwszeństwo operatora nie działa to ("-20x^2+20x-50", -8).
Dennis
@Dennis Dostosowane odpowiednio.
Erik the Outgolfer
2

Java 8, 150 149 148 bajtów

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

Nie jestem pewien, czy można mieć funkcję curdowania lambda, która zgłasza wyjątek. Jeśli tak, można zapisać 1 bajt, zmieniając (s,n)->na n->s->. -1 bajt dzięki @ OlivierGrégoire za pokazanie mi, jak to zrobić.

Wypróbuj online.

Wyjaśnienie:

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)

Niestety eval JavaScript nie obsługuje **, więc muszę użyć dłuższej zamiany, aby go przekonwertować na Math.pow...

Kevin Cruijssen
źródło
JavaScript obsługuje **(ES7 +), dlaczego to nie obsługuje?
Muhammad Salman
Również nie ma ewaluacji w java. To nie może być prawda?
Muhammad Salman
@MuhammadSalman Nie, Java nie ma eval. I myślę, że ta wbudowana wersja JavaScript, z którą mogę korzystać ScriptEngineManager, nie była aktualizowana w Javie JDK od lat, więc nie obsługuje ES7+..
Kevin Cruijssen
Człowieku, java jest do bani, nie wiadomo dlaczego? Okej, dlaczego nie został zaktualizowany?
Muhammad Salman
@MuhammadSalman Nie wiem .. Musisz zadać to pytanie twórcom Javy. ;)
Kevin Cruijssen
2

TI-Basic, 6 bajtów

Prompt X:expr(Ans

Wyrażenie jest traktowane jako argument, a X jest wprowadzany podczas działania. Alternatywnie 8 bajtów bez expr:

Prompt X,u:u

Tutaj oba argumenty są wprowadzane w czasie wykonywania.

Timtech
źródło
2

Oktawa , 47 38 37 bajtów

Zaoszczędzono wiele bajtów, przyjmując drugie wejście jako ciąg zamiast liczby.

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

Wypróbuj online!

Wyjaśnienie:

Dość prosto: zamień xna (c), gdzie cjest drugie wejście i oceń. Paretheses są konieczne, ponieważ w Octave -8^2 == -64.

Stewie Griffin
źródło
1

Rubin , 43 41 bajtów

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

Wypróbuj online!

Zaoszczędzono dwa bajty dzięki @ Mr.Xcoder


Ponieważ nie ma jeszcze odpowiedzi Ruby, dodałem ją. Nvm był taki, który zastosował inne podejście

Objaśnienie:

->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
Muhammad Salman
źródło
1

Excel, 36 + 2 bajty, niekonkurencyjny

Ocena pola tekstowego jako formuły nie jest prosta w programie Excel. Istnieje ukryta =EVALUATE()funkcja, którą można wywołać, definiując Nazwę.

W programie Excel 2007 formuły> Zdefiniuj nazwę. Zdefiniuj nazwę o nazwie E, z Odnosi się do:

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

Następnie z wejściem wzorze In A1, xwartości B1wchodzące =Ew C1powraca oczekiwanego rezultatu.

Wernisch
źródło