15
\$\begingroup\$

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.

Identity list

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.

Input

  • 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 pi or π. Either way remember that you're scored in bytes, not characters.

Output

Output the same expression, but…

  • All trig functions are either sin or cos.
  • 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.

Note: Leading + 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.

Worked Example

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 3x into x+2x, and apply the sine additive identity recursively:

-(sin(x)cos(2x)+cos(x)sin(2x))+sin^3(x)
-(sin(x)cos(2x)+cos(x)(sin(x)cos(x)+sin(x)cos(x)))+sin^3(x)

Next, some distributive property and like terms:

-sin(x)cos(2x)-2cos^2(x)sin(x)+sin^3(x)

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!

Test Cases

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.

\$\endgroup\$
  • \$\begingroup\$ May we output (for example) sin(x)^3 rather than sin^3(x)? Can we take pi as PI as well? \$\endgroup\$ – Giuseppe Apr 6 '18 at 17:01
  • 2
    \$\begingroup\$ This looks very close to a dup of codegolf.stackexchange.com/questions/38341/… \$\endgroup\$ – Digital Trauma Apr 6 '18 at 17:11
  • \$\begingroup\$ @DigitalTrauma that seems to be about printing a specific answer set, not a generalized and specified input-processing challenge. \$\endgroup\$ – Stephen Leppik Apr 6 '18 at 17:24
  • 1
    \$\begingroup\$ cos(0) = cos(pi+(-pi)) = cos(pi)cos(-pi) - sin(pi)sin(-pi) = cos(pi)cos(pi) - 0 = (-1)^2 = 1. So, 1 = cos(0) = cos(x+(-x)) = cos(x)cos(-x) - sin(x)sin(-x) = cos(x)cos(x) + sin(x)sin(x) = cos^2(x) + sin^2(x). \$\endgroup\$ – JungHwan Min Apr 6 '18 at 17:51
  • 1
    \$\begingroup\$ @NoOneIsHere yes, but I won't upvote it because it's zero-effort. \$\endgroup\$ – Stephen Leppik Apr 7 '18 at 1:16

Your Answer

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

Browse other questions tagged or ask your own question.