बहुपद का सांकेतिक एकीकरण


21

किसी दिए गए स्ट्रिंग में अनिश्चितकालीन अभिन्न लागू करें। आपके द्वारा उपयोग किए जाने वाले एकमात्र नियम इस प्रकार परिभाषित किए गए हैं:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n C -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% आप "सुंदर" markdown के लिए स्वरूपित एक्स्पोनेंट्स प्रिंट आउट (बजाय अगर 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
हैरानी की बात यह है कि हमारे पास पहले से ही यह सवाल नहीं है - लेकिन मैं एक डुबकी नहीं लगा सकता। +1
डिजिटल ट्रॉमा

3
1. मुझे लगता है कि eऔर π, गुणांक में केवल मूल्यों तर्कसंगत संख्या होगी? यानी बहु-उपयोगी बहुपद को संभालना आवश्यक नहीं है? 2. जब आप कहते हैं " गैर-एक्स 1-चार चर ", क्या आप प्रतिबंधित कर रहे हैं a-zA-Zया आप अन्य यूनिकोड पर्वतमाला को शामिल करने का इरादा रखते हैं?
पीटर टेलर

1
क्या आपको लगता है कि अगर किसी के ln(x) + Cइनपुट के लिए प्रोग्राम प्रिंट करता है तो बोनस होना चाहिए x^(-1)?
आर्कटुरस

1
@Ampora नहीं - कि एलएन के गुणांक के साथ काम कर कीड़े की एक पूरी खोल सकता है।
Addison Crump

1
@LeifWillerts 1) मेरा मतलब था कि x^(e+1)यह एक एकीकृत नहीं होगा, लेकिन यह एक एकीकरण का परिणाम हो सकता है। 2) कई अक्षर चर नहीं होंगे। 3) हां। 4) हां, लेकिन यह होना चाहिए (1/56)x^(1/7+1) + C(मैंने उदाहरणों में गलती की)।
एडिसन क्रम्प

जवाबों:


2

गणितज्ञ 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",σ]])&

यह एक वास्तविक फ़ंक्शन बनाता है St जो एक स्ट्रिंग को इनपुट के रूप में लेता है। (क्या वह गणितज्ञ के लिए संपूर्ण कार्यक्रम के रूप में गिना जाता है?)

अनगोल्ड संस्करण होगा:

φ=(
    σ="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

यह वर्तमान में प्रतीकात्मक एकीकरण क्षमताओं में निर्मित MATLABs का उपयोग करके एक कार्य-प्रगति है। वर्तमान में आवश्यकताओं को अपडेट किया गया है इसलिए प्रारूप अब आवश्यकताओं से मेल खाता है। यह दूसरे -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)

मुझे लगता है कि आपके पास होने वाले आउटपुट में समस्या यह है कि भिन्न एक ही गुणांक में सरल / नहीं जाते हैं?
Addison Crump

@FagagAsSpam, अंश आसान कर रहे हैं, लेकिन परेशानी यह है कि वे चर के गलत पक्ष पर समाप्त होते हैं। उदाहरण के लिए तीसरे उदाहरण में यह परिणाम है x^(8/7)/8जिसमें गणितीय रूप से सही उस रूप में नहीं है जैसा आप चाहते हैं (1/8)x^(8/7)
टॉम कारपेंटर

यह देखते हुए कि आप अब तक का एकमात्र उत्तर हैं, मैं इसे बदलने पर विचार कर सकता हूं कि यदि कोई और उत्तर एक या दो दिन में "किसी भी गणितीय रूप से सही, मान्य आउटपुट" के अंशों के लिए नहीं आता है।
एडिसन Crump

आपका उत्तर मान्य है - आपको अब आंशिक उत्पादन को सरल बनाने की आवश्यकता नहीं है। c:
Addison Crump

मैं इसे थोड़ा नीचे गोल्फ करूंगा और बाइट्स गिनूंगा।
टॉम कारपेंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.