Trigonometry has LOTS of identities. So many that you can expand most functions into sines and cosines of a few values. The task here is to do that in the fewest bytes possible.
Well, the ones we're using here.
sin(-x)=-sin(x) sin(π)=0 cos(-x)=cos(x) cos(π)=-1 sin(a+b)=sin(a)*cos(b)+sin(b)*cos(a) cos(a+b)=cos(a)cos(b)-sin(a)sin(b)
For the sake of golfing, I've omitted the identities that can be derived from these. You are free to encode double-angles and such but it may cost you bytes.
- You should take in an expression as a string with an arbitrary number of terms consisting of a coefficient and some sine and cosine functions, each with an exponent and an arbitrary number of arguments.
- Coefficients will always be nonzero integers.
- Each argument will be a coefficient, followed by either a single latin letter or pi.
- You can decide whether to take in pi as
π. Either way remember that you're scored in bytes, not characters.
Output the same expression, but…
- All trig functions are either
- All arguments of trig functions are single variables, with no coefficients.
- All like terms are combined.
- Terms with a coefficient of 0 are removed.
- All factors in the same term that are the same function of the same variable are condensed into a single function with an exponent.
+ signs are allowed, but not required.
a+-b is allowed, and equivalent to
a-b. If there are no terms with nonzero coefficients, then output either
0 or an empty string.
We'll start with
sin(-3x)+sin^3(x). The obvious first thing to do would be to deal with the sign using the parity identity, leaving
-sin(3x). Next I can expand
x+2x, and apply the sine additive identity recursively:
Next, some distributive property and like terms:
Now, I expand the
cos(2x) and apply the same reduction:
-sin(x)(cos(x)cos(x)-sin(x)sin(x))-2cos^2(x)sin(x)+sin^3(x) -sin(x)cos^2(x)+sin^3(x)-2cos^2(x)sin(x)+sin^3(x) 2sin^3(x)-3sin(x)cos^2(x)
And now, it's finished!
In addition to the following, all of the individual identities (above) are test cases. Correct ordering is neither defined nor required.
cos(2x)+3sin^2(x) => cos^2(x)+2sin^2(x) sin(-4x) => 4sin^3(x)cos(x)-4sin(x)cos^3(x) cos(a+2b-c+3π) => 2sin(a)sin(b)cos(b)cos(c)-sin(a)sin(c)cos^2(b)+sin(a)sin(c)sin^2(b)-cos(a)cos^2(b)cos(c)+cos(a)sin^2(b)cos(c)-2cos(a)sin(b)cos(b)sin(c) sin(x+674868986π)+sin(x+883658433π) => 0 (empty string works too) sin(x+674868986π)+sin(x+883658434π) => 2sin(x)
…and may the shortest program in bytes win.