36
\$\begingroup\$

Challenge

Given an input of an integer, \$n\$ (where \$0<n<50\$), output the graph of \$y=\mathrm{Re}((-n)^x)\$ from \$x = -3\$ to \$x = 3\$ inclusive.

Where \$\mathrm{Re}(p)\$ is the real part of the complex number \$p\$.

Note that \$\mathrm{Re}((-n)^x) = n^x \cos{(\pi x)}\$

Output

The output may be in any form you wish (e.g. an image or a window etc.). ASCII art is disallowed.

The graph does not need to have axes (to allow languages without built-in graphing functions to compete).

If an image is output, it each side must be longer than 500 pixels. Similarly, the plot must fill the image as best it can.

The minimum interval between plots is 0.05.

Vector graphics are allowed.

Examples

For an input of 2:

For an input of 1:


You must put your corresponding outputs in your answer (n = 1 and n = 2).

Winning

The shortest code in bytes wins.

\$\endgroup\$
18
  • 50
    \$\begingroup\$ ASCII art is disallowed. (ಥ﹏ಥ) \$\endgroup\$ Commented Apr 13, 2017 at 8:40
  • 1
    \$\begingroup\$ Can the axes be on the left and bottom edges of the graph? instead of at the centre? \$\endgroup\$
    – user41805
    Commented Apr 13, 2017 at 8:41
  • 2
    \$\begingroup\$ "If an image is output, it each side must be longer than 500 pixels." Are vector graphics allowed? \$\endgroup\$ Commented Apr 13, 2017 at 8:46
  • 4
    \$\begingroup\$ Why am I not surprised to see MATLAB, MATL and Mathematica as some of the first answers. :) \$\endgroup\$ Commented Apr 13, 2017 at 11:12
  • 2
    \$\begingroup\$ -1 for banning ascii art \$\endgroup\$ Commented Aug 27, 2020 at 6:41

21 Answers 21

24
\$\begingroup\$

TI-Basic, 26 21 bytes

~3→Xmin
3→Xmax
Prompt N
DrawF N^Xcos(πX

Output for N=2:

TI84SE GRAPH OUTPUT

\$\endgroup\$
8
  • 1
    \$\begingroup\$ I count 47 characters in your code, not 26. \$\endgroup\$ Commented Apr 13, 2017 at 14:29
  • 12
    \$\begingroup\$ @KonradRudolph See: TI-Basic scoring guidelines. \$\endgroup\$ Commented Apr 13, 2017 at 14:44
  • 5
    \$\begingroup\$ "If an image is output, it each side must be longer than 500 pixels." Doesn't seem like the built in graphing capability will work here. \$\endgroup\$ Commented Apr 13, 2017 at 17:20
  • 9
    \$\begingroup\$ @user5090812 "The output may be in any form you wish (e.g. an image or a window etc.)" - I'm outputting by the graph window, not an image, so this restriction doesn't apply. \$\endgroup\$
    – Timtech
    Commented Apr 14, 2017 at 2:37
  • 1
    \$\begingroup\$ Who would've thought that a graphing calculator could graph things! \$\endgroup\$ Commented Apr 15, 2017 at 19:09
15
\$\begingroup\$

Bash + Gnuplot, 56 45 bytes

(-11 bytes thanks to Noiralef!)

gnuplot -e "se t png;p[-3:3]real((-$1)**x)">A

Saves the resulting graph as a png image named A in the current working directory.

Example Outputs

For n = 1:

For n = 2:

\$\endgroup\$
3
  • 1
    \$\begingroup\$ +1 for using a langage I use everyday. (no "garbled binary nonsense" as with golf-langages ^^). This can be re-used in everyday situations. \$\endgroup\$ Commented Apr 14, 2017 at 13:52
  • 5
    \$\begingroup\$ You can save 11 bytes by using abbreviations: gnuplot -e "se t png;p[-3:3]real((-2)**x)">A \$\endgroup\$
    – Noiralef
    Commented Apr 14, 2017 at 14:21
  • \$\begingroup\$ @Noiralef Thanks! :) \$\endgroup\$
    – R. Kap
    Commented Apr 15, 2017 at 17:06
14
\$\begingroup\$

Python 3 with matplotlib, 103 72 bytes

-12 bytes thanks to DSM (a module is installed alongside matplotlib called pylab with the necessary functionality "making Python in a repl more like Matlab" - odd, but true!)
-18 more as a result (pylab has many numpy functions too!)
-1 byte thanks to Ajasja (replacing arange(-60,61)/20+0j with arange(121)/20-3+0j)

from pylab import*
def f(n):x=arange(121)/20-3+0j;plot(x,(-n)**x);show()

n=2,1

n=2 n=1

\$\endgroup\$
11
  • 2
    \$\begingroup\$ Can you get rid of from matplotlib.pyplot import* if you start ipython with the --pylab --matplotlib flag? \$\endgroup\$
    – Ajasja
    Commented Apr 14, 2017 at 11:56
  • \$\begingroup\$ Have you got iPython; does it work? I suspect it would be acceptable if it does, but would need to ask myself. I don't have iPython and have never had the need to use it. \$\endgroup\$ Commented Apr 14, 2017 at 12:10
  • \$\begingroup\$ yup, works with --pylab (tested with python 2) \$\endgroup\$
    – Ajasja
    Commented Apr 14, 2017 at 12:28
  • \$\begingroup\$ There is nothing non-standard in any config file making the display work, right? If not I'd say post it as a separate answer on this occasion since it's a clever use of a change of language IMO. EDIT: I see you have golfed it there too :) \$\endgroup\$ Commented Apr 14, 2017 at 12:40
  • 1
    \$\begingroup\$ Yes, I remembered %pylab gives you numpy as well and if you're in a notebook you don't need a show at the end:) \$\endgroup\$
    – Ajasja
    Commented Apr 14, 2017 at 12:57
12
\$\begingroup\$

MATL, 22 18 16 bytes

Thanks @LuisMendo for additional -2 bytes!

I_.01I3$:i_y^&XG


I_                       push 3 and negate         
  .01                    push 0.01
     I                   push 3  
      3$:                generate the list [-3,-2.99,-2.98,...,3]                        
         i_y^            calculate (-input)^(list)                 
             $XG         plot the first list against the real part of the second list

Try it on matl.io

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

Mathematica, 41 bytes

Plot[Re[(-#)^x],{x,-3,3},PlotRange->All]&

Output looks exactly as shown in the challenge except for the font of the numbers (which I suspect was created with Wolfram Alpha).

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

R, 29 bytes

curve(Re((0i-scan())^x),-3,3)

n is provided through stdin. Result for n=1: enter image description here

And for n=2:

enter image description here

\$\endgroup\$
7
  • \$\begingroup\$ Why not use a variable n like the other answers and shave off five characters from your answer? Anyway, crazy answer. I always forget about curve. \$\endgroup\$ Commented Apr 15, 2017 at 13:37
  • \$\begingroup\$ @KonradRudolph Thanks. Actually most other answers don't predefine n. The matlab, matl, TI-Basic and mathematica answers take input as stdin (as far as I understand them), while the python and VBA answers create a function. Even if it's allowed, it's just a matter of personal taste: I just don't like predefining variables as a way of input. \$\endgroup\$
    – plannapus
    Commented Apr 15, 2017 at 14:07
  • \$\begingroup\$ Sorry correction: the matlab answers define functions as well. \$\endgroup\$
    – plannapus
    Commented Apr 15, 2017 at 14:15
  • \$\begingroup\$ Well. This is a code golf … \$\endgroup\$ Commented Apr 15, 2017 at 15:00
  • 1
    \$\begingroup\$ Yes you're right and this is why i didn't downvote your answer despite it using that form of input, but allow me to respect the rules i believe in. In addition, as explained in my previous comment, i think your assumption that "most of the other answers just use a variable" is wrong: apart from yours (and maybe the postscript) I don't see any. The others use anonymous functions or, like me, a prompt. \$\endgroup\$
    – plannapus
    Commented Apr 17, 2017 at 8:37
11
\$\begingroup\$

MATLAB, 35 30 bytes

x=-3:.01:3;@(n)plot(x,(-n).^x)

This defines an anyonmous function. The output is via a new window with a resizable vector graphic output. MATLAB's plot automatically ignores the imaginary part of the y-coordinates as long as your provide corresponding x-coordinates.The following output is for n=3.

\$\endgroup\$
1
  • \$\begingroup\$ Would @(n)fplot(@(x)(-n).^x,[-3,3]) work for 29 bytes? \$\endgroup\$
    – Sanchises
    Commented Aug 25, 2020 at 17:11
10
\$\begingroup\$

R, 30 bytes

plot(Re((0i-n)^seq(-3,3,.05)))

n = 1

enter image description here

n = 2

enter image description here

\$\endgroup\$
6
  • 3
    \$\begingroup\$ Oooh pretty circles \$\endgroup\$
    – Beta Decay
    Commented Apr 13, 2017 at 13:58
  • 2
    \$\begingroup\$ @BetaDecay R’s default rendering is ugly. The rationale for the default is that unfilled circles don’t hide overplotted points as much as filled circles/dots would. \$\endgroup\$ Commented Apr 13, 2017 at 14:04
  • 5
    \$\begingroup\$ I don't think it's ugly. It looks really cool. \$\endgroup\$
    – mbomb007
    Commented Apr 13, 2017 at 14:25
  • 1
    \$\begingroup\$ The x axis is labelled incorrectly. I think you need x=seq(-3,3,.05);plot(x,Re((0i-n)^x)) \$\endgroup\$ Commented Apr 13, 2017 at 14:51
  • 2
    \$\begingroup\$ @user2390246 Given that the axes are completely optional, I don’t think it matters. If the axis labelling matters, other answers also have issues due to scaling (e.g. the 30-char MATLAB answer). \$\endgroup\$ Commented Apr 13, 2017 at 15:08
10
\$\begingroup\$

Excel VBA, 168 160 147 138 Bytes (cells as pixels at 100x scale)

Saved 8 bytes thanks to KyleKanos
Saved 22 bytes thanks to Taylor Scott

Sub g(n)
For i=0To 1
For x=-3To 3Step.01
y=n^x*Cos([Pi()]*x)
m=IIf(y<m,y,m)
If i Then Cells(500*(1-y/m)+1,(x+3)*100+1)="#
Next x,i
End Sub

Formatted, it looks like this:

Sub g(n)
    For i = 0 To 1
    For x = -3 To 3 Step 0.01
        y = n ^ x * Cos([Pi()] * x)
        m = IIf(y < m, y, m)
        If i Then Cells(500 * (1 - y / m) + 1, (x + 3) * 100 + 1) = "#"
    Next x, i
End Sub

Fun Fact: VBA does not have a built-in pi variable so we have to evaluate it as a worksheet function where it does exist.

n=1                                                                         n=2
n=1     n=2


I started with a chart version at 193 bytes but it did get prettier results.

Sub c(n)
For x=-3To 3Step 0.05
r=r+1
Cells(r,1)=n^x*Cos(Atn(1)*4*x)
Next
With ActiveSheet.Shapes.AddChart(xlLine).Chart
.SetSourceData Range("A1:A121")
.Axes(xlCategory).Delete
End With
End Sub

n=1
n=1
n=2
n=2

\$\endgroup\$
9
  • 1
    \$\begingroup\$ Is it not shorter to use (-n)^x instead of hardcoding pi? \$\endgroup\$
    – Beta Decay
    Commented Apr 13, 2017 at 20:26
  • 1
    \$\begingroup\$ @BetaDecay It would be if Excel could handle negative numbers raised to negative non-integers ¯\_(ツ)_/¯ \$\endgroup\$ Commented Apr 13, 2017 at 20:28
  • 2
    \$\begingroup\$ Isn't it shorter to use atn(1)*4 for pi? \$\endgroup\$
    – Kyle Kanos
    Commented Apr 15, 2017 at 14:04
  • 2
    \$\begingroup\$ @KyleKanos Indeed it is, thanks. I didn't find that identity in my constants lookup table and, as an engineer, that's where I'm legally obligated to stop. \$\endgroup\$ Commented Apr 18, 2017 at 0:01
  • 1
    \$\begingroup\$ @TaylorScott That's three new tricks, thanks. That's more valuable than the 7 bytes they saved me this time. \$\endgroup\$ Commented Jul 16, 2018 at 12:52
6
\$\begingroup\$

MATLAB, 35 33 bytes

Thanks fo @flawr for removing 2 bytes!

@(n)ezplot(@(x)real((-n)^x),-3:3)

This defines an anonymous function. To call it with input 2, use ans(2) (or assign the function to a variable such as f and then use f(2)).

Output is vector graphics (resizable window). The sampling interval on the x axis is determined automatically by the ezplot function, but it seems to be more than enough.

A warning is produced in STDERR because the function passed to ezplot (@(x)real((-n)^x)) is not vectorized, but the graph is generated.

Example for n = 2:

enter image description here

\$\endgroup\$
3
  • 1
    \$\begingroup\$ ezplot = la-z-plot :D (I keep forgetting about this one...) \$\endgroup\$
    – flawr
    Commented Apr 13, 2017 at 12:53
  • \$\begingroup\$ Huh. Never knew that you could pass the domain to ezplot like that. Sadly, the same cannot be said for fplot, so no byte can be saved there. \$\endgroup\$
    – Sanchises
    Commented Apr 14, 2017 at 10:29
  • \$\begingroup\$ @sanchises I didn't know either :-) It was flawr's idea \$\endgroup\$
    – Luis Mendo
    Commented Apr 14, 2017 at 13:16
5
\$\begingroup\$

Jupyter notebook and Python 3; 53 bytes

%pylab
def f(n):x=arange(121)/20-3+0j;plot(x,(-n)**x)

Three bytes saved thanks to @Jonathan Allan.

n=1 n=2

\$\endgroup\$
7
  • \$\begingroup\$ Two minor bits: if I read the specs right, you need a minimum of 0.05 (not 0.1) between (effective) points, and we're supposed to be inclusive of 3. \$\endgroup\$
    – DSM
    Commented Apr 15, 2017 at 20:26
  • \$\begingroup\$ You can use x=arange(-60,61)/20 to fix the issues highlighted by DSM at a cost of 2 bytes. If you add 0j to the arange it can be used to change over to plot(x,(-n)**x) saving 4. \$\endgroup\$ Commented Apr 15, 2017 at 21:04
  • \$\begingroup\$ @DSM Ops, fixed. \$\endgroup\$
    – Ajasja
    Commented Apr 15, 2017 at 21:57
  • \$\begingroup\$ @JonathanAllan Thanks. \$\endgroup\$
    – Ajasja
    Commented Apr 15, 2017 at 21:58
  • \$\begingroup\$ Ah I saved you 2 in total, you just saved me 1 by changing to arange(121)! \$\endgroup\$ Commented Apr 15, 2017 at 22:01
4
\$\begingroup\$

Julia 0.6 with Plots.jl, 46 bytes

using Plots
~n=plot(real((0im-n).^(-3:.05:3)))

GR plot

This needed a Julia representation!

Not much to golf here though, except (ab)using operator overloading to save bytes on function defintion, and using 0im-n to make the input number complex where I might usually have used Complex(n). That's necessary because in Julia, for type stability reasons, the ^ operator returns Complex results only when the input is Complex itself. So here we make it a complex number by adding 0im ie. 0i.

One cool thing about the Plots.jl package is that it automatically chooses the backend to use based on what plotting packages you have installed and where you're running the plot command from. The above plot was created with the GR backend, but if I didn't have that installed (or if I explicitly ran a plotly() command like I did for this), it would have used the more interactive Plotly backend and output this (which looks a tiny bit nicer IMO):

Plotly plot

There's even a UnicodePlots backend, to print a plot in the terminal (or save to a text file) using Unicode characters and color codes. SE keeps messing up the plot alignment if I try to directly paste it though, so here's a terminal screenshot:

UnicodePlots plot

PS: The alternate formula, \$ Re((−n)^x)=n^xcos(πx) \$, comes out to the same length:

using Plots
~n=plot(n.^(x=-3:.05:3).*cospi(x))
\$\endgroup\$
2
  • \$\begingroup\$ Dang, that's some clever (ab)use of the Braille characters. \$\endgroup\$
    – Adalynn
    Commented Jul 17, 2018 at 1:06
  • \$\begingroup\$ 45 bytes \$\endgroup\$
    – MarcMush
    Commented Mar 18, 2022 at 10:28
4
\$\begingroup\$

J, 37 36 bytes

Thanks to my colleague Marshall for guidance. -2 thanks to FrownyFrog.

Anonymous tacit prefix function.

-(]plot@;9 o.^)i:@3j120[load@'plot'

Plot window

-(]plot@;9 o.^)i:@3j120[load@'plot'
                        load@'plot'       NB. load plotting library
               i:@3j120                   NB. -3...3 in 120 steps
-                                         NB. negate argument
 (           ^)                           NB. raise the negated value to those exponents
 (       9 o. )                           NB. real part
 (]     ;     )                           NB. pair with the exponents
 ( plot@      )                           NB. plot it
\$\endgroup\$
2
  • \$\begingroup\$ I think 20%~i:@60 can be i:@3j120. \$\endgroup\$
    – FrownyFrog
    Commented Jul 18, 2018 at 9:07
  • \$\begingroup\$ @FrownyFrog Correct. Thanks. \$\endgroup\$
    – Adám
    Commented Jul 18, 2018 at 10:19
4
\$\begingroup\$

Desmos, 12 10 9 bytes

-2 thanks to @Steffan
-1 thanks to @LeoDog896

n^xcosxπ

How has nobody used Desmos yet?

\$\endgroup\$
3
  • \$\begingroup\$ You can do n^xcosx\pi for 10 bytes \$\endgroup\$
    – naffetS
    Commented May 12, 2022 at 23:32
  • \$\begingroup\$ Huh, it appears you can. I didn't realize you could say just cos rather than \cos. \$\endgroup\$
    – Bbrk24
    Commented May 13, 2022 at 12:08
  • \$\begingroup\$ You can also use the pi symbol itself, which is 2 bytes but replaces the 3 bytes taken up by \pi: n^xcosxπ \$\endgroup\$
    – LeoDog896
    Commented May 4, 2023 at 13:25
3
\$\begingroup\$

Encapsulated PostScript; 232 bytes

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 500 500
%%EndComments
/n 1 def .02 setlinewidth /f{dup dup n exch exp exch 180 mul cos mul 3 div}def
250 250 translate 80 80 scale newpath -3 f moveto -3 .05 3{f lineto}for stroke
%%EOF

Now since this is a vector image itself...

enter image description here

enter image description here

\$\endgroup\$
1
  • \$\begingroup\$ Ooh that is nice \$\endgroup\$
    – Beta Decay
    Commented Apr 16, 2017 at 20:50
3
\$\begingroup\$

TikZ + PGFPlots, 175 bytes

\documentclass{standalone}\usepackage{tikz,pgfplots}\begin{document}\typein[\n]{}\tikz{\begin{axis}\addplot[domain=-3:3,samples=120]{\n^x*cos(180*x)};\end{axis}}\end{document}

Compile with, e.g., latexmk -cd -f -pdf in.tex for a pdf output. During compilation, the user is prompted for n.

Sample outputs (converted to png) for n = 1 and n = 2:

n = 1 n = 2

\$\endgroup\$
2
\$\begingroup\$

Math.JS Grapher, 20 Bytes

r(n)=f(x)=re((-n)^x)

By sheer fluke, this graphing utility is TC (For the most part, Infinite loops just crash it.), and by nature, it's primary output is graphs.

How it works

r(n)= assigns a function r which takes the argument n to the expression f(x)=re((-n)^x). re((-n)^x) is pretty much letter for letter the challenge description. But this assigns the function f(x) to this, which the grapher implicitly outputs as a line graph.

How to test it

You can use this site, punch that function in there, then call it with r(input).

Output

Output

\$\endgroup\$
2
\$\begingroup\$

Dyalog APL, 41 bytes

⎕SE.UCMD∊'chart x(9○(-'⍞')*x←3-20÷⍨⍳121)'

How it works:

⎕SE.UCMD∊'chart x(9○(-'⍞')*x←3-20÷⍨⍳121)' ⍝ Main function
⎕SE.UCMD∊                                 ⍝ User Command (called from the session object)
         'chart                           ⍝ Plot a chart with arguments:
                 (           3-20÷⍨⍳121)' ⍝ Yields the list [-3, -2.95, -2.9,..., 2.9, 2.95, 3]
                           x←             ⍝ Assign that list to x
                          *               ⍝ and use it as exponent
                    (-'⍞')                ⍝ with (-input) as base
                  9○                      ⍝ discard the complex part; this generates Re((-n)^x)
                x                         ⍝ And x.

The user command ]chart, in this case, takes two vector arguments, x and y and plots the graphs:

For \$n=1\$: n=1

For \$n=2\$: n=2

\$\endgroup\$
2
\$\begingroup\$

Excel VBA, 133 bytes

Immediate window script that takes input from [A1] and outputs a Chart object to the Sheet1 object.

[B:B]="=ROW()/20-3.05":[C:C]="=A$1^B1*Cos(Pi()*B1)":Set c=Sheet1.Shapes.AddChart(4).Chart:c.SetSourceData[C1:C121]:c.Axes(1).Delete

Ungolfed

Full Subroutine version. I/O is unchanged.

Sub b()
    [B:B] = "=ROW()/20-3.05"                ''  Define `x`-axis
    [C:C] = "=A$1^B1*Cos(Pi()*B1)"          ''  Define `y`-axis in terms of input from A1
    Set c = Sheet1.Shapes.AddChart(4).Chart ''  Add line plot to Sheet1 (xlLine)
    c.SetSourceData [C1:C121]               ''  Set `y` source to match `x` in [-3,3]
    c.Axes(1).Delete                        ''  Remove erroneous axes (xlCategory)
End Sub

Output

Where input, \$n=1\$

Output plot n=1

Where input, \$n=3\$

Output plot n=3

\$\endgroup\$
1
\$\begingroup\$

Google Sheets, 65

  • Input N is in A1

Graphing:

  • =SPARKLINE(ArrayFormula(IMREAL(IMPOWER(-A1,.05*SEQUENCE(121,1,-60 or
  • =SPARKLINE(ArrayFormula(IMREAL(IMPOWER(-A1,SEQUENCE(121,1,-60)/20

Resize row and column of graph to 500x500.

I tried to use the COS() formula, but the best I can do is 66 characters with a named range. Problems that I came across:

  • X is generated by the SEQUENCE(), which is then used twice. You would naturally think to cache this, but every time you cache into a column, to use it again, you have to either name a range, or use a FILTER. Named Range is obviously better, but it does cost 1 character to make it fair.
  • Attempting to scalar multiply a SEQUENCE() forces us into an ArrayFormula (or MMULT() at best), and we cannot use a non-integer step for SEQUENCE(). This means that the most optimal way to use it is to give it to the SPARKLINE formula.
  • This also means that our scalar multiply/divide has to occur each time we use the range.
\$\endgroup\$
0
\$\begingroup\$

SmileBASIC, 82 bytes

INPUT N
FOR I=0TO 399X=I/66.5-3GPSET I,120-POW(N,X-3*SGN(N-1))*COS(PI()*X)*120NEXT

Graph fills the entire screen, even when N is less than 1.

When N is greater than 1, you can scale Y to be between -1 and 1 by dividing it by n^3. I'm already doing n^x, and n^x / n^3 can be simplified to n^(x-3). However, when N is less than 1, I have to divide Y by n^-3 instead. This is equivalent to n^(x+3).

I can use n^(x-3*sign(n-1)) to use -3 if n>1, and +3 if n<1

Images coming soon

\$\endgroup\$

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.