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\$
10
  • \$\begingroup\$ related. Duplicate? \$\endgroup\$ Commented Apr 17, 2018 at 8:20
  • \$\begingroup\$ @OlivierGrégoire Inverse work \$\endgroup\$
    – l4m2
    Commented Apr 17, 2018 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\$ Commented Apr 17, 2018 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
    Commented Apr 18, 2018 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
    Commented Apr 23, 2018 at 14:58

3 Answers 3

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\$
3
  • \$\begingroup\$ @l4m2 I added the links to the question so we can remove these comments. Thanks. \$\endgroup\$
    – mbomb007
    Commented Apr 24, 2018 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
    Commented Apr 25, 2018 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
    Commented Apr 25, 2018 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\$
3
  • \$\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
    Commented Apr 27, 2018 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
    Commented Apr 27, 2018 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
    Commented Apr 28, 2018 at 5:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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