Polinom ifade dizesini değerlendirme


18

Bir polinom denklemi, değer için bir değer xalan ve işlemin sonucunu döndüren bir işlev oluşturun .

Örnek: verilen 4x^2+2x-5ve x=3çıktı 37. Bunun sonucu4(3)^2+2(3)-5

  • Tüm polinomların geçerli olduğunu varsayın
  • Polinom formatı daima aşağıdakiler coefficient(variable)^exponent => 4x^2dışında olacaktır :
    • Üs ne 1zaman olacakcoefficient(variable) => 4x
    • Katsayı olduğunda 1öyle olacak(variable)^exponent => x^2
  • Polinomlar sadece bir değişkendir
  • Harici kütüphane kullanımı yasaktır
  • Katsayı ve değişken girdi pozitif ve negatif sayılar olabilir.

Test senaryoları

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

Güncelleme

  • Polinom formatı daima aşağıdakiler coefficient(variable)^exponent => 4x^2dışında olacaktır :
    • Üs ne 1zaman olacakcoefficient(variable) => 4x
    • Katsayı olduğunda 1öyle olacak(variable)^exponent => x^2
  • Negatif üs kuralı kaldırıldı. Benim hatam. Geçerli bir polinom negatif üs içermiyor
  • Bir üssü 0sadececoefficient
  • İçin test örneği eklendi input 0

Bu , bu yüzden bayt en kısa cevap kazanmak.


3
Giriş formatı ne kadar esnektir? Girebilir 3x^3-5x^2+2x-10miyiz 3*x^3-5*x^2+2*x-10? Yoksa [3 -5 2 -10]. [3 2 1 0]?
Luis Mendo

1
@Arnauld Evet ...
Luis felipe De jesus Munoz

4
Bir “dış kütüphane” nedir ve “eval” i zaten bir özellik olarak uygulayan dillere kıyasla nasıl adil?
Olivier Grégoire

1
Özür dilerim dünden beri bilgisayarımı kullanmadım. Meydan okumayı bana verdiğiniz önerilerle güncelledim. Lütfen bir göz atın ve her şey yolundaysa yeniden açın.
Luis felipe De jesus Munoz

Yanıtlar:


12

JavaScript (ES7), 48 bayt

@RickHitchcock'un bir önerisine dayanarak

Bekliyor Xbüyük harf olarak. Körili sözdiziminde girdi alır (p)(X).

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

Çevrimiçi deneyin!


JavaScript (ES7), 49 bayt

@DeadPossum ile aynı yaklaşım . Körili sözdiziminde girdi alır (p)(x).

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

Çevrimiçi deneyin!


1
Bence kullanarak birkaç bayt kaydedebilirsiniz replace: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
Rick Hitchcock

@RickHitchcock fBayt sayısına dahil edilmediği sürece, kaydedilmesi gereken 2 baytın maliyetine referans kullanamıyorum. Yine de bu yöntemi seviyorum. Bir veya iki baytı bir şekilde yenileyerek kurtarmanın bir yolu olabilir.
Arnauld

2
@RickHitchcock XBüyük harf alabilirsek a<{}?'*X':'**', bir bayt tasarrufu yapabiliriz . Bu yüzden sorum OP'ye.
Arnauld

1
cant handle xalone
l4m2

1
@ l4m2 Meydan okuma kuralları güncellendi. : / Eskiden 1xiçin x.
Arnauld


8

Python 3 , 53 50 48 bayt

edit : Dennis sayesinde -5 bayt teşekkürler!

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

Çevrimiçi deneyin!

translateZincirleme replaceçağrıları önlemek için kullanılır ; Python 3'ün versiyonu translateöncekilerden daha az garip.


"*(%d)"%xolabilir "*(x)".
Dennis

Teşekkür ederim, xbenim evalkapsamımda olduğunu anlayan olay olmadı ! Güncelleyeceğim.
etene

1
Aslında, xartık bir dize temsili olmadığı için "*x"de çalışır.
Dennis

Daha iyi ! Tekrar teşekkürler.
etene

5

R , 44 bayt

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

Çevrimiçi deneyin!

Oldukça değiştirin R. ile anlaşılır nxile n*xve daha sonra d dizesi. ikinci argümanı böyle adlandırdığımız için kullanılır.evalparsex

Eval işlevi bile düzgün şekilde biçimlendirilmiş bir ilk argüman ile daha doğrudan kullanılabilir ve diğer resmi argümanlar ( y, zvs.) kolayca eklenebilir:

R , 20 bayt (rakip olmayan)

function(f,x)eval(f)

Çevrimiçi deneyin!


4

Japt 2,0, 13 bayt

OvUd^'*²'x"*V

Deneyin .

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

@Arnauld sayesinde


@Arnauld (49 bayt) tarafından şimdiye kadarki en iyi JS çözümü zaten gönderildiğinden ve kullandığından eval, Regex kullanmaya ve bunun yerine azaltmaya karar verdim.

Yine de oldukça uzun.

Açıklama:

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


Bu son test durumunda şu anda başarısız olur (0,25 olmalıdır). Kullanılmayan -yerine [-], ~b.indexOf`x` yerine b.indexOf`x`>0kaldırmak için kullanarak birkaç bayt kaydedebilirsiniz l=. (Ama bu hatayı düzeltmez.)
Arnauld

@Arnauld: Teşekkürler. Neden yaptığını bilmiyorum, sorunun ne olduğunu göreceksiniz
Muhammed Salman

Eh, sorun olduğunu da düzenli ifade böler 1x^-2üzerinde -.
Arnauld

3

05AB1E , 16 19 bayt

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

Negatif giriş için hata düzeltmesi olarak +3 bayt x.

.E( Toplu iş kodu olarak çalıştır ), @Adnan'ın bu son işleminde Python olarak çalıştıreval ile değiştirildi , ancak bu sürüm henüz TIO'da değil. @ Mr.Xcoder çalıştığını doğrulamak için yerel (son sürüm) 05AB1E üzerinde test etti. İfade dizesini nasıl dönüştürdüğünü görmek için bu sürüme bakmadan bakın.
.E

Açıklama:

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

TIO'nun mevcut sürümünde çalışan alternatif 25 28 bayt programı:

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

Çevrimiçi deneyin.

Açıklama:

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

“…¢(“dizedir print(, çünkü:

  • ve sıkıştırılmış dizgiyi başlatır ve bitirir
  • …¢eşittir 0426içeri endeksleri bakar çünkü info.txt dosyası , indeks 4 olan ve ¢endeks 26 sahiptir.
  • Bu dizin 0426daha sonra sözlük dosyasında kullanılır ; burada satır 427 (dizin 426) getirdiği sözcüktür, printbu durumda.
  • (Olduğu gibi yorumlamak bu yüzden, info.txt dosyasında bir dizin yok.

2

JavaScript (Node.js) , 143 bayt

Daha iyi cevaplar olduğunu biliyorum ama eval kullanmadan yapmak istedim

(_,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)

Çevrimiçi deneyin!


Normal ifadenize gerek [a-z0-9.]yok mu? Görünen tek harf x. Neden .? Tamsayı olmayan katsayıları veya üsleri ele almanıza gerek yoktur.
Peter Cordes



2

Java 8, 150 149 148 bayt

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

Bir İstisna atan bir köri lambda fonksiyonunun mümkün olup olmadığından emin değilim. Eğer öyleyse, 1 bayt değişen kaydedilebilir (s,n)->için n->s->. @ OlivierGrégoire'a bunu nasıl yapacağımı gösterdiği için -1 byte teşekkürler .

Çevrimiçi deneyin.

Açıklama:

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)

Ne yazık ki JavaScript eval desteklemiyor **, bu yüzden Math.powbunun yerine dönüştürmek için daha uzun bir yedek kullanmak zorunda ..


JavaScript destekliyor **(ES7 +), bu neden bunu desteklemiyor?
Muhammed Salman

Ayrıca Java'da hiçbir değerlendirme yoktur. Bu doğru olamaz mı?
Muhammed Salman

@MuhammadSalman Hayır, Java'nın yok eval. Sanırım kullanabileceğim bu yerleşik JavaScript-eval ScriptEngineManager, yıllardır Java ES7+
JDK'da

Adamım, java berbat, neden hayır? Tamam, neden güncellenmedi?
Muhammed Salman

@MuhammadSalman Ben bilmiyorum .. Java'nın yaratıcılarına bu soruyu sormak zorunda kalacaksınız. ;)
Kevin Cruijssen

2

TI-Basic, 6 bayt

Prompt X:expr(Ans

İfade bağımsız değişken olarak alınır ve çalışma zamanı sırasında X girilir. Alternatif olarak expr:

Prompt X,u:u

Burada her iki argüman çalışma zamanında girilir.


2

Oktav , 47 38 37 bayt

İkinci girdiyi sayı yerine dize olarak alarak çok bayt kaydetti.

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

Çevrimiçi deneyin!

Açıklama:

Oldukça yalındır: Değiştir xtarafından (c), nerede cikinci girdidir ve değerlendirir. Parantezler gereklidir çünkü Octave'de -8^2 == -64.




1

Yakut , 43 41 bayt

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

Çevrimiçi deneyin!

@ Mr.Xcoder sayesinde iki bayt tasarruf etti


Ruby cevabı olmadığından henüz bir cevap ekledim. Nvm farklı bir yaklaşım kullanan bir tane vardı

Açıklama:

->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 bayt, Rekabet etmeyen

Bir Metin alanını formül olarak değerlendirmek Excel'de düz değildir. =EVALUATE()Bir Ad tanımlayarak çağrılabilen gizli bir işlev vardır .

Excel 2007'de Formüller> Adı Tanımla. Aşağıdakileri ifade eden bir ad tanımlayın E:

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

Daha sonra, Formül girişi ile A1, xdeğer B1girerek, =Eiçinde C1geri dönüş sonucu beklenen.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.