35
\$\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
  • 44
    \$\begingroup\$ ASCII art is disallowed. (ಥ﹏ಥ) \$\endgroup\$ Apr 13 '17 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
    Apr 13 '17 at 8:41
  • 2
    \$\begingroup\$ "If an image is output, it each side must be longer than 500 pixels." Are vector graphics allowed? \$\endgroup\$ Apr 13 '17 at 8:46
  • 1
    \$\begingroup\$ @MartinEnder Yes, I suppose so \$\endgroup\$
    – Beta Decay
    Apr 13 '17 at 8:47
  • 4
    \$\begingroup\$ Why am I not surprised to see MATLAB, MATL and Mathematica as some of the first answers. :) \$\endgroup\$ Apr 13 '17 at 11:12

20 Answers 20

22
\$\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\$ Apr 13 '17 at 14:29
  • 11
    \$\begingroup\$ @KonradRudolph See: TI-Basic scoring guidelines. \$\endgroup\$ Apr 13 '17 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\$ Apr 13 '17 at 17:20
  • 7
    \$\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
    Apr 14 '17 at 2:37
  • 1
    \$\begingroup\$ Who would've thought that a graphing calculator could graph things! \$\endgroup\$
    – PyRulez
    Apr 15 '17 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\$ Apr 14 '17 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
    Apr 14 '17 at 14:21
  • \$\begingroup\$ @Noiralef Thanks! :) \$\endgroup\$
    – R. Kap
    Apr 15 '17 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
    Apr 14 '17 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\$ Apr 14 '17 at 12:10
  • \$\begingroup\$ yup, works with --pylab (tested with python 2) \$\endgroup\$
    – Ajasja
    Apr 14 '17 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\$ Apr 14 '17 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
    Apr 14 '17 at 12:57
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\$ Apr 15 '17 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
    Apr 15 '17 at 14:07
  • \$\begingroup\$ Sorry correction: the matlab answers define functions as well. \$\endgroup\$
    – plannapus
    Apr 15 '17 at 14:15
  • \$\begingroup\$ Well. This is a code golf … \$\endgroup\$ Apr 15 '17 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
    Apr 17 '17 at 8:37
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.suever.net

\$\endgroup\$
0
11
\$\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
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
    Aug 25 '20 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
    Apr 13 '17 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\$ Apr 13 '17 at 14:04
  • 5
    \$\begingroup\$ I don't think it's ugly. It looks really cool. \$\endgroup\$
    – mbomb007
    Apr 13 '17 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\$ Apr 13 '17 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\$ Apr 13 '17 at 15:08
9
\$\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
    Apr 13 '17 at 20:26
  • 1
    \$\begingroup\$ @BetaDecay It would be if Excel could handle negative numbers raised to negative non-integers ¯\_(ツ)_/¯ \$\endgroup\$ Apr 13 '17 at 20:28
  • 2
    \$\begingroup\$ Isn't it shorter to use atn(1)*4 for pi? \$\endgroup\$
    – Kyle Kanos
    Apr 15 '17 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\$ Apr 18 '17 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\$ Jul 16 '18 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
    Apr 13 '17 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
    Apr 14 '17 at 10:29
  • \$\begingroup\$ @sanchises I didn't know either :-) It was flawr's idea \$\endgroup\$
    – Luis Mendo
    Apr 14 '17 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
    Apr 15 '17 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\$ Apr 15 '17 at 21:04
  • \$\begingroup\$ @DSM Ops, fixed. \$\endgroup\$
    – Ajasja
    Apr 15 '17 at 21:57
  • \$\begingroup\$ @JonathanAllan Thanks. \$\endgroup\$
    – Ajasja
    Apr 15 '17 at 21:58
  • \$\begingroup\$ Ah I saved you 2 in total, you just saved me 1 by changing to arange(121)! \$\endgroup\$ Apr 15 '17 at 22:01
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
    Apr 16 '17 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\$
3
\$\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\$
1
  • \$\begingroup\$ Dang, that's some clever (ab)use of the Braille characters. \$\endgroup\$
    – Adalynn
    Jul 17 '18 at 1:06
3
\$\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
    Jul 18 '18 at 9:07
  • \$\begingroup\$ @FrownyFrog Correct. Thanks. \$\endgroup\$
    – Adám
    Jul 18 '18 at 10:19
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, privacy policy and cookie policy

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