다항식 문자열 평가


18

다항식, 값을 가져와 x연산 결과를 반환 하는 함수를 만듭니다 .

예 : 주어진 4x^2+2x-5x=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]?
Luis Mendo 2016 년

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

4
"외부 라이브러리"란 무엇이며 "eval"을 이미 기능으로 구현 한 언어와 비교하여 어떻게 공평합니까?
Olivier Grégoire 2016 년

1
사과합니다 어제부터 PC를 사용하지 않았습니다. 나는 당신이 나에게 제안한 내용으로 도전을 업데이트했습니다. 확인하고 모든 것이 정상이면 다시여십시오.
Luis felipe De jesus Munoz

답변:


12

자바 스크립트 (ES7), 48 바이트

@RickHitchcock의 제안을 기반으로 함

X대문자로 예상 됩니다. 카레 구문으로 입력을 (p)(X)받습니다.

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

온라인으로 사용해보십시오!


자바 스크립트 (ES7), 49 바이트

@DeadPossum 과 동일한 접근 방식 . 카레 구문으로 입력을 (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':'**'))
Rick Hitchcock

@RickHitchcock f저장 해야하는 2 바이트의 비용으로 바이트 수에 포함되지 않으면 참조를 사용할 수 없습니다 . 그래도 나는이 방법을 좋아한다. 어떻게 든 그것을 수정하여 바이트를 저장하는 방법이있을 수 있습니다.
Arnauld 2018 년

2
@RickHitchcock X대문자로 할 수 있다면 a<{}?'*X':'**'바이트를 절약 할 수 있습니다 . 따라서 OP에 대한 질문입니다.
Arnauld 2016 년

1
처리 어차피 x혼자
l4m2

1
@ l4m2 챌린지 규칙이 업데이트되었습니다. : /이로 사용 1x을 위해 x.
Arnauld


8

파이썬 3 , 53 50 48 바이트

편집 : Dennis 덕분에 -5 바이트!

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

온라인으로 사용해보십시오!

통화 translate연결을 피하는 데 사용 됩니다 replace. Python 3의 버전은 translate이전 버전 보다 덜 어색합니다.


"*(%d)"%x될 수 있습니다 "*(x)".
Dennis

감사합니다. 이벤트 x가 내 eval범위 내에 있지 않다고 생각했습니다 ! 업데이트하겠습니다.
etene

1
실제로 x는 더 이상 문자열 표현이 아니기 때문에 "*x"작동합니다.
Dennis

더 나은! 다시 감사합니다.
etene

5

R , 44 바이트

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

온라인으로 사용해보십시오!

상당히 교체 R.으로 간단 nx함께 n*x다음 D 문자열입니다. 이것이 우리가 두 번째 인수의 이름을 지정하는 방식이므로 사용됩니다.evalparsex

평가 후면 기능도 올바른 형식의 첫 번째 인수에 더 직접적으로 사용될 수 있으며, 다른 형식 인수 ( y, z, 등)에 쉽게 추가 할 수 있습니다 :

R , 20 바이트 (비경쟁)

function(f,x)eval(f)

온라인으로 사용해보십시오!


4

apt 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

자바 스크립트 (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에게 감사합니다


@Arnauld (49 바이트)에 의해 지금까지 최고의 JS 솔루션이 이미 게시되어 있고를 사용 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

@Arnauld : 감사합니다. 왜 그런지 모르겠다. 문제가 무엇인지 알 것이다
Muhammad Salman

글쎄, 문제는 정규 표현식이 1x^-2에서 분할된다는 것 -입니다.
Arnauld 2016 년

3

05AB1E , 16 19 바이트

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

음수 입력을위한 버그 수정으로 +3 바이트 x.

.E@Adnan의 최신 커밋 에서 ( 배치 코드로 실행 )이 Run as Pythoneval 으로 대체 되었지만이 버전은 아직 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

현재 버전의 TIO에서 작동하는 대체 25 28 바이트 프로그램 :

„*(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(과 같은 이유로 문자열입니다 .

  • 시작 및 종료 압축 문자열
  • …¢info.txt 파일 에서 인덱스가 4이고 인덱스가 26 인 인덱스 를 확인 0426하기 때문에¢
  • 0426그런 다음 이 색인 은 dictionary-file 에서 사용되며 , 여기서 427 행 (인덱스 426)은 페치하는 단어이며이 print경우에 사용됩니다.
  • (그대로 해석됩니다 있도록 info.txt 파일의 인덱스가 없습니다.

2

자바 스크립트 (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입니다. 왜 그런가요 .? 정수가 아닌 계수 또는 지수를 처리 할 필요가 없습니다.
Peter Cordes 2018 년



2

자바 (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)->하여 1 바이트를 저장할 수 있습니다 n->s->. 이 작업을 수행하는 방법을 보여 준 @ OlivierGrégoire 에게 -1 바이트 감사합니다 .

온라인으로 사용해보십시오.

설명:

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 +)를 지원합니다. 왜 이것이 지원하지 않습니까?
Muhammad Salman

또한 자바에는 평가가 없습니다. 맞지 않아요?
Muhammad Salman

@MuhammadSalman 아니요, Java는 없습니다 eval. 그리고 나는이 자바 스크립트 평가 내장 내가 함께 사용할 수있는 생각 ScriptEngineManager은 지원하지 않습니다, 그래서 년 동안 자바 JDK에 업데이트되지 않았습니다 ES7+..
케빈 Cruijssen에게

사람, 자바는 짜증나고, 평가가없는 이유는 무엇입니까? 그래 왜 업데이트되지 않았습니까?
Muhammad Salman

@MuhammadSalman I dunno .. Java 제작자에게 그 질문을해야합니다. ;)
Kevin Cruijssen 2014 년

2

TI 기본, 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두 번째 입력하고, 평가한다. 옥타브에서는 paretheses가 필요 -8^2 == -64합니다.




1

루비 , 43 41 바이트

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

온라인으로 사용해보십시오!

@ Mr.Xcoder 덕분에 2 바이트 절약


루비 답변이 아직 없기 때문에 하나 추가했습니다. NVM은 다른 접근 방식을 사용했습니다.

설명 :

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

엑셀, 36 + 2 바이트, 비경쟁

Excel에서 텍스트 필드를 수식으로 평가하는 것은 간단하지 않습니다. 숨겨진=EVALUATE()이름을 정의하여 호출 할 수 함수가 있습니다.

Excel 2007에서 수식> 이름 정의 다음 E을 참조하여 이라는 이름을 정의하십시오 .

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

그런 다음 수식 입력에 A1, x값을 B1입력 =E하고 입력하면 C1예상 결과 가 반환됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.