11
\$\begingroup\$

Given a polynomial in one variable with rational coefficients, output an equivalent expression containing only 1, variables, and definite integrals. For example, -x2 can be expressed as ∫x111dtxdu.

E := 1 | var | ∫EEEdvar

Any reasonable input/output method is allowed.

Examples:

\Large 1=1\ \Large x=x\ \Large 0 = \int_1^1 1\text dt\ \Large 2 = \int_{\int_1^{\int_1^1 1\text dv} 1\text du}^1 1\text dt\ \Large x^2=\int_{\int_1^1 1\text dt}^x x\text dv\ \Large \frac 12=\int_{\int_1^1 1\text dt}^1 v\text dv

Your score will be the your code length multiplied by the number of symbols used on the test cases. You should be able to score your program. Lowest score wins.

Test cases:

4/381*x^2+49/8*x^3-17/6
311/59*x^2-92/9*x^3-7/15*x
333/29*x^3+475/96*x^8

Golfing is going to be difficult, because I can't golf just the code or just the output, and I therefore do not know if a change will help or hurt my score until I try it, which sucks in my opinion.

Don't let the score restrict your creation. You are welcomed to answer with mainly one part of the score well optimized, even if the other one badly left.

\$\endgroup\$
  • \$\begingroup\$ related. Duplicate? \$\endgroup\$ – Olivier Grégoire Apr 17 '18 at 8:20
  • \$\begingroup\$ @OlivierGrégoire Inverse work \$\endgroup\$ – l4m2 Apr 17 '18 at 12:06
  • \$\begingroup\$ This is an interesting challenge, made much worse by its scoring system. I could instantly claim a score of 0, irregardless of my code's length, simply by assigning chr(8747)(or equivalent) to a variable, and using that as the sign, incurring zero occurrences of the symbol. I'd strongly recommend making this a vanilla code golf challenge. \$\endgroup\$ – caird coinheringaahing Apr 17 '18 at 21:38
  • 3
    \$\begingroup\$ @cairdcoinheringaahing No matter you use any output format, e.g. 0=[1,1,1], it's still counted as "1 ". Thus you can only get 0 score on test case 1 and x \$\endgroup\$ – l4m2 Apr 18 '18 at 4:31
  • 1
    \$\begingroup\$ Personally, I think this would be better as a code-golf question. Any solution will be impressive, so I don't think there's a need to require as few integrations as possible. \$\endgroup\$ – mbomb007 Apr 23 '18 at 14:58
5
\$\begingroup\$

Python 2, 315 bytes * 5113 = 1610595 score

I'm still working on golfing the score. Golfing is going to be difficult, because I can't golf just the code or just the output, and I therefore do not know if a change will help or hurt my score until I try it, which sucks in my opinion.

Despite the annoyance of golfing this, I did enjoy the calculus.

t='t'
Z=lambda n:N(Z(-n))if n<0else[1,t,N(1),Z(n-1)]if n>1else[[1,t,1,1],1][n]
N=lambda a:[1,t,a,Z(0)]
x=lambda n:n>1and[x(n-1),t,Z(0),'x']or'x'
M=lambda a,b:[b,t,Z(0),a]
print reduce(lambda a,b:[1,t,N(a),b],[M((lambda a,b:M(Z(a),[x(b-1)if b>1else 1,'x',Z(0),1]))(*c),x(i)if i else 1)for i,c in enumerate(input())])

Try it online!

Run all test cases - to score, count all [ in the output.

The input polynomial is taken as a list of (numerator, denominator) coefficient pairs in order from lowest to highest power of x. (0, 1) (zero) is used for missing powers.

Output is given with each integral represented by a list [f,t,a,b] to represent ∫abf dt

Verification

Here is a slightly less golfed version that outputs valid Mathematica syntax for integration, which may be tested in an online notebook. Unfortunately, decently-sized programs will not complete in a free notebook.

Go here, scroll to bottom, "Create New Notebook", paste (Wolfram Language Input), and evaluate (Shift+Enter) (Note that using num-pad Enter doesn't work).

Explanation

Uses these equations:

-a = \int_a^{0} 1 ~ dt

n = \int_{-1}^{n-1} 1 ~ dt, n>1

x^n = \int_0^{x} x^{n-1} ~ dt

a+b = \int_{-a}^b 1 ~ dt

ab = \int_0^a b ~ dt

\frac{1}{n} = \int_0^{1} x^{n-1} ~ dx

Links

\$\endgroup\$
  • \$\begingroup\$ @l4m2 I added the links to the question so we can remove these comments. Thanks. \$\endgroup\$ – mbomb007 Apr 24 '18 at 18:24
  • \$\begingroup\$ Define Z(n) as def Z(n):return N(Z(-n)) if n<0 else[1,t,1,1] if n<1 else 1 if n<2 else[1,t,N(1),Z(n-1)]? \$\endgroup\$ – l4m2 Apr 25 '18 at 0:32
  • \$\begingroup\$ or Z=lambda n:N(Z(-n))if n<0else[1,t,N(1),Z(n-1)]if n>1else[[1,t,1,1],1][n] \$\endgroup\$ – l4m2 Apr 25 '18 at 0:34
1
\$\begingroup\$

JavaScript (Node.js), 152 bytes * 5113 integrals = 777176 score

T='t';P=n=>--n?[T,'u',O,P(n)]:1;N=n=>n-1?n>-1?[1,T,N(1-n),1]:[1,T,N(-n),O]:1;O=N(0)
F=([e,...s])=>e?[1,T,[F(s),T,'x',O],[N(e[0]),T,O,[P(e[1]),T,O,1]]]:O

Try it online!

Mainly use these two equations:

\ax+b:=\int_{\int_a^0x\text dt}^b1\text dt\\frac 1a=\int_0^1u^{a-1}\text du

\$\endgroup\$
0
\$\begingroup\$

JavaScript (Node.js), 220 bytes * 616 integrals = 135520 score

O=[1,T='t',1,1]
D=(q,t)=>[t,'c',[q,T,1,O],q]
N=n=>n>0?[N(-n),T,1,O]:n?[D(1,1),'c',n&1?[T,T,O,1]:O,N(n/2|0)]:O
P=n=>n?[D(n%2?'x':1,T),T,O,P(n>>1)]:1
F=([e,...s])=>e?[1,T,[F(s),T,'x',O],[N(e[0]),T,O,[P(e[1]-1),'x',O,1]]]:O

Try it online!

enter image description here enter image description here enter image description here

\$\endgroup\$
  • \$\begingroup\$ Equation->Latex: function unpack(x) { return x instanceof Array ? `\\int_{${unpack(x[2])}}^{${unpack(x[3])}}${unpack(x[0])}\\text d${unpack(x[1])}` : x }; console.log (unpack(F([[0, 1], [-7, 15], [311, 59], [-92, 9]])).replace(/\{(.)\}/g,'$1')); \$\endgroup\$ – l4m2 Apr 27 '18 at 2:09
  • \$\begingroup\$ Just edit your existing answer. We don't need a separate answer for each attempt with a different score. Also, the equation images you included are not even worth including because they're not legible. \$\endgroup\$ – mbomb007 Apr 27 '18 at 18:08
  • 1
    \$\begingroup\$ @mbomb007 Usually I place similar solution together and quite different ones separated. The previous few times I found some not-allowed symbols used when I get the image, so I keep it here to easier see it's legal \$\endgroup\$ – l4m2 Apr 28 '18 at 5:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.