다항식의 상징적 통합


21

주어진 문자열에 무기한 적분을 적용하십시오. 사용할 유일한 규칙은 다음과 같이 정의됩니다.

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C 및 n은 모두 상수입니다.

명세서:

  • 다항식을 가능한 모든 기능과 통합 할 수 있어야합니다.
    • 형식에서 분수 일 수 있습니다 (numerator/denominator).
    • 전자와 π는 상수이고, 자신의 사용, 분수하거나 포함하는 표현을 형성 할 수 인식 것을 (같은 부분에서 유지 될 수있다 (e/denominator)거나 (numerator/e), 또는 지수의 경우, x^(e+1))
      • 이 두 가지 특수 상수 외에도 모든 계수는 합리적인 실수입니다.
    • 형식의 지수 (아마도 분수) x^(exponent)
      • 그들 과 함께 e또는 π그들 안에서의 표현 은 지수에 있지 않을 것입니다. (와 같은 것을 통합 할 필요는 없지만 통합 x^(e+1)할 수 있습니다 x^(e))
    • (즉, 비 X 1 - 문자 변수를 사용할 수 있습니다 f)
      • ASCII 범위 65-90 및 97-122에만 해당됩니다.
    • 체인 규칙을 사용하거나 통합 할 필요는 없습니다 x^(-1).
  • 출력에는 패딩이 있어야합니다 (즉, 용어 사이의 분리) x^2 + x + C.
  • 위의 기능과 통합하는 방법을 모르는 경우 프로그램이 인쇄되어야합니다 "Cannot integrate "+input.
  • 전체 프로그램이어야합니다.

보너스 :

  • 10 % 당신이 (대신 가격 인하에 대한 서식이 "꽤"지수를 인쇄하는 경우 x^2, x<sup>2</sup>).
  • 10 % 당신은 (즉, 방정식을 인쇄하는 경우 ∫xdx = (1/2)x^2 + C)

예 :

입력:

x

산출:

(1/2)x^(2) + C

입력:

-f^(-2)

산출:

f^(-1) + C

입력:

(1/7)x^(1/7) + 5

산출:

(1/56)x^(8/7) + 5x + C

입력:

πx^e

산출:

(π/(e+1))x^(e+1) + C

입력:

(f+1)^(-1)

산출:

Cannot integrate (f+1)^(-1)

1
놀랍게도 우리는 아직이 질문이 없습니다. 그러나 나는 dup을 찾을 수 없었습니다. +1
디지털 외상

3
1. eand 이외의 π계수의 유일한 값은 유리수 라고 가정합니다 . 즉 다 변수 다항식을 처리 할 필요가 없습니까? 2. " x가 아닌 1 문자 변수 " 라고 말할 때 a-zA-Z다른 유니 코드 범위 를 제한 하거나 포함 시키려고합니까?
피터 테일러

1
누군가의 프로그램 ln(x) + C이 입력을 위해 인쇄한다면 보너스가 있어야한다고 생각 x^(-1)합니까?
Arcturus

1
@Ampora No-계수 ln을 다루는 벌레의 전체 캔을 엽니 다.
애디슨 크럼

1
@LeifWillerts 1) 나는 그것이 정수 x^(e+1)가 아니라는 것을 의미 했지만 통합의 결과 일 수 있습니다. 2) 여러 글자 변수가 없습니다. 3) 예. 4) 그렇습니다.하지만 (1/56)x^(1/7+1) + C(예에서 실수했습니다).
애디슨 크럼

답변:


2

Mathematica 478 * 0.9 = 430.2

φ=(α=ToExpression;Π=StringReplace;σ="Cannot integrate "<>#1;Λ=DeleteDuplicates@StringCases[#1,RegularExpression["[a-df-zA-Z]+"]];μ=Length@Λ;If[μ>1,σ,If[μ<1,Λ="x",Λ=Λ[[1]]];Ψ=α@Π[#1,{"e"->" E ","π"->" π "}];Φ=α@Λ;Θ=α@Π[#1,{"e"->" 2 ","π"->" 2 "}];λ=Exponent[Θ,Φ,List];Θ=Simplify[Θ*Φ^Max@@Abs@λ];Θ=PowerExpand[Θ/.Φ->Φ^LCM@@Denominator@λ];If[Coefficient[Ψ,Φ,-1]==0&&PolynomialQ[Θ,Φ],"∫("<>#1<>")d"<>Λ<>" = "<>Π[ToString[Integrate[Ψ,Φ],InputForm],{"E"->"e","Pi"->"π"}]<>" + C",σ]])&

이것은 하나의 문자열을 입력으로 사용하는 진정한 함수 φ를 만듭니다. (이것은 Mathematica의 완전한 프로그램으로 간주됩니까?)

ungolfed 버전은 다음과 같습니다.

φ=(
    σ="Cannot integrate "<>#1;
    Λ=DeleteDuplicates@StringCases[#1,RegularExpression["[a-df-zA-Z]+"]];
    If[Length@Λ>1,σ,
        If[Length@Λ<1,Λ="x",Λ=Λ[[1]]];
        Ψ=ToExpression@StringReplace[#1,{"e"->" E ","π"->" π "}];
        Φ=ToExpression@Λ;
        Θ=ToExpression@StringReplace[#1,{"e"->" 2 ","π"->" 2 "}];
        λ=Exponent[Θ,Φ,List];
        Θ=Simplify[Θ*Φ^Max@@Abs@λ];
        Θ=PowerExpand[Θ/.Φ->Φ^LCM@@Denominator@λ];
        If[Coefficient[Ψ,Φ,-1]==0&&PolynomialQ[Θ,Φ],
            "∫("<>#1<>")d"<>Λ<>" = "<>StringReplace[ToString[Integrate[Ψ,Φ],InputForm],{"E"->"e","Pi"->"π"}]<>" + C",
            σ
        ]
    ]
)&

입력에 다른 모든 문자를 사용하려면 그리스 문자가 필요합니다.


7

MATLAB, 646 x 0.9 = 581.4 바이트

t=input('','s');p=char(960);s=regexprep(t,{p,'pi([a-zA-Z])','([a-zA-Z])pi','([\)e\d])([a-zA-Z])','([a-zA-Z])(([\(\d]|pi))','e^(\(.+?\))','e'},{'pi','pi*$1','$1*pi','$1*$2','$1*$2','exp($1)','exp(1)'});r=[s(regexp(s,'\<[a-zA-Z]\>')),'x'];r=r(1);e=0;try
I=int(sym(strsplit(s,' + ')),r);S=[];for i=I
S=[S char(i) ' + '];end
b=0;o=[];for i=1:nnz(S)
c=S(i);b=b+(c==40)-(c==41);if(c==42&&S(i+1)==r)||(b&&c==32)
c='';end
o=[o c];end
o=regexprep(char([8747 40 t ')d' r ' = ' o 67]),{'pi','exp\(1\)','exp','\^([^\(])',['1/' r]},{p,'e','e^','^($1)',[r '^(-1)']});catch
e=1;end
if e||~isempty(strfind(o,'log'))
disp(['Cannot integrate ' t]);else
disp(o);end

이것은 현재 기호 통합 기능에 내장 된 MATLAB을 사용하여 진행중인 작업입니다. 현재 요구 사항이 업데이트되어 이제 형식이 요구 사항과 일치합니다. 또한 두 번째 -10 % 보너스를받을 수 있습니다.

누구든지 출력을 수정하고 출력을 수정하는 방법을 제안 하거나이 코드를 다른 답변의 기초로 사용하려면 자유롭게 느끼십시오 :). 시간을 찾을 수 있으면 계속 재생하고 출력을 다시 포맷하는 방법을 생각할 수 있는지 확인합니다.

업데이트 : 좋아, 조금 더 많은 작업을 한 후에 코드가 현재 서있는 방법이 있습니다. 여전히 진행중인 작업이지만 필요한 출력을 일치시키는 데 점점 더 가까워지고 있습니다.

t=input('','s'); %Get input as a string
p=char(960); %Pi character
s=regexprep(t,{p,'pi([a-zA-Z])','([a-zA-Z])pi','([\)e\d])([a-zA-Z])','([a-zA-Z])(([\(\d]|pi))','e^(\(.+?\))','e'},{'pi','pi*$1','$1*pi','$1*$2','$1*$2','exp($1)','exp(1)'}); %Reformat input to work with built in symbolic integration
r=[s(regexp(s,'\<[a-zA-Z]\>')),'x'];r=r(1); %determine the variable we are integrating
e=0; %Assume success
try
    I=int(sym(strsplit(s,' + ')),r); %Integrate each term seperately to avoid unwanted simplificaiton
    S=[];
    for i=I
        S=[S char(i) ' + ']; %Recombine integrated terms
    end
    %Now postprocess the output to try and match the requirements
    b=0;o=[];
    for i=1:nnz(S)
        %Work through the integrated string character by character
        c=S(i);
        b=b+(c=='(')-(c==')'); %Keep track of how many layers deep of brackets we are in
        if(c=='*'&&S(i+1)==r)||(b&&c==' ') %If a '*' sign preceeds a variable. Also deblank string.
            c=''; %Delete this character
        end
        o=[o c]; %merge into new output string.
    end
    o=regexprep([char(8747) '(' t ')d' r ' = ' o 'C'],{'pi','exp\(1\)','exp','\^([^\(])',['1/' r]},{p,'e','e^','^($1)',[r '^(-1)']});
catch
    e=1; %failed to integrate
end
if e||~isempty(strfind(o,'log'))
    disp(['Cannot integrate ' t])  %bit of a hack - matlab can integrate 1/x, so if we get a log, we pretend it didn't work.
else
    disp(o)% Display it.
end

다음은 현재 생산되는 몇 가지 예입니다. 보시다시피, 옳지 않지만 점점 가까워지고 있습니다.

입력 :

x
-f^(-2)
(1/7)x^(1/7) + 5
πx^e
(f+1)^(-1)

출력 :

∫(x)dx = x^(2)/2 + C
∫(-f^(-2))df = f^(-1) + C
∫((1/7)x^(1/7) + 5)dx = x^(8/7)/8 + 5x + C
∫(πx^(e))dx = (πx^(e+1))/(e+1) + C
Cannot integrate (f+1)^(-1)

나는 당신이 가지고있는 출력의 문제가 분수가 단일 계수로 단순화 / 이동하지 않는다고 가정합니까?
애디슨 크럼

@FlagAsSpam, 분수가 단순화되고 있지만 문제는 변수의 잘못된면에 있다는 것입니다. 예를 들어 세 번째 예에서는 x^(8/7)/8수학적으로 올바른 반면 원하는 형식이 아닙니다 (1/8)x^(8/7).
Tom Carpenter

당신이 지금까지 유일한 대답이라고 생각하면, 하루나 이틀 안에 더 이상 답이 나오지 않으면 분수에 대한 "수학적으로 올바른 유효한 결과"로 바꾸는 것을 고려할 수 있습니다.
애디슨 크럼

귀하의 답변은 유효합니다-더 이상 분수 출력을 단순화 할 필요가 없습니다. c :
애디슨 크럼

나는 그것을 조금 아래로 골프하고 바이트를 계산합니다.
Tom Carpenter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.