Zeichnen Sie einen Graphen von

31

Herausforderung

Bei einer Eingabe einer ganzen Zahl (wobei ) wird der Graph von von bis einschließlich ausgegeben.n0<n<50y=Re((-n)x)x=-3x=3

Wobei der Realteil der komplexen Zahl .Re(p)p

Beachten Sie, dassRe((n)x)=nxcos(πx)

Ausgabe

Die Ausgabe kann in einer beliebigen Form erfolgen (z. B. ein Bild oder ein Fenster usw.). ASCII-Kunst ist nicht erlaubt.

Das Diagramm muss keine Achsen haben (damit Sprachen ohne integrierte Grafikfunktionen miteinander konkurrieren können).

Wenn ein Bild ausgegeben wird, muss jede Seite länger als 500 Pixel sein. Ebenso muss der Plot das Bild so gut wie möglich ausfüllen.

Das Mindestintervall zwischen den Darstellungen beträgt 0,05.

Vektorgrafiken sind erlaubt.

Beispiele

Für eine Eingabe von 2:

Für eine Eingabe von 1:


Sie müssen Ihre entsprechenden Ausgaben in Ihre Antwort eintragen (n = 1 und n = 2).

Gewinnen

Der kürzeste Code in Bytes gewinnt.

Beta-Zerfall
quelle
37
ASCII art is disallowed.(ಥ﹏ಥ)
Albert Renshaw
1
Können sich die Achsen am linken und unteren Rand des Diagramms befinden? statt in der Mitte?
Kritixi Lithos
2
"Wenn ein Bild ausgegeben wird, muss jede Seite länger als 500 Pixel sein." Sind Vektorgrafiken erlaubt?
Martin Ender
1
@MartinEnder Ja, ich denke schon
Beta Decay
4
Warum wundert es mich nicht, MATLAB, MATL und Mathematica als erste Antworten zu sehen? :)
Kevin Cruijssen

Antworten:

12

MATL, 22 18 16 Bytes

Danke @LuisMendo für zusätzliche -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 th real part of the second list

Probieren Sie es auf matl.suever.net

Fehler
quelle
21

TI-Basic Früher 26 21 Bytes

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

Ausgabe für N = 2:

TI84SE GRAPH OUTPUT

Timtech
quelle
1
Ich zähle 47 Zeichen in Ihrem Code, nicht 26.
Konrad Rudolph
11
@KonradRudolph Siehe: TI-Basic-Bewertungsrichtlinien.
Addison Crump
5
"Wenn ein Bild ausgegeben wird, muss jede Seite länger als 500 Pixel sein." Scheint nicht so, als würde die eingebaute Grafikfunktion hier funktionieren.
user5090812
7
@ user5090812 "Die Ausgabe kann in jeder gewünschten Form erfolgen (z. B. ein Bild oder ein Fenster usw.)" - Ich gebe über das Grafikfenster aus, kein Bild, daher gilt diese Einschränkung nicht.
Timtech
1
Wer hätte gedacht, dass ein Grafikrechner die Dinge grafisch darstellen könnte!
PyRulez
15

Bash + Gnuplot, 56 45 Bytes

(-11 Bytes dank Noiralef!)

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

Speichert das resultierende Diagramm als pngBild Aim aktuellen Arbeitsverzeichnis.

Beispielausgaben

Für n = 1 :

Für n = 2 :

R. Kap
quelle
1
+1 für die Verwendung einer Sprache, die ich jeden Tag verwende. (kein "verstümmelter binärer Unsinn" wie bei Golf-Sprachen ^^). Dies kann in alltäglichen Situationen wiederverwendet werden.
Olivier Dulac
5
Sie können 11 Bytes sparen, indem Sie Abkürzungen verwenden:gnuplot -e "se t png;p[-3:3]real((-2)**x)">A
Noiralef
@Noiralef Danke! :)
R. Kap
13

Python 3 mit Matplotlib , 103 72 Bytes

-12 Bytes durch DSM (ein Modul neben installiert wird matplotlibaufgerufen pylabmit der notwendigen Funktionalität „ zu machen Python in einem ers mehr wie Matlab“ - seltsam, aber wahr)
-18 mehr als Ergebnis (pylab hat viele numpy Funktionen auch!)
- 1 Byte dank Ajasja (Ersetzen arange(-60,61)/20+0jdurch 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

Jonathan Allan
quelle
2
Können Sie loswerden, from matplotlib.pyplot import*wenn Sie ipython mit dem Flag --pylab --matplotlib starten?
Ajasja
Hast du iPython? funktioniert es? Ich vermute, es wäre akzeptabel, müsste mich aber fragen. Ich habe kein iPython und hatte nie die Notwendigkeit, es zu benutzen.
Jonathan Allan
yup, arbeitet mit --pylab (getestet mit Python 2)
Ajasja
Es gibt in keiner Konfigurationsdatei etwas, das nicht dem Standard entspricht und die Anzeige funktioniert, oder? Wenn nicht, würde ich sagen, poste es als separate Antwort bei dieser Gelegenheit, da es eine kluge Verwendung eines Sprachwechsels bei IMO ist. EDIT: Ich sehe, Sie haben es auch dort golfen :)
Jonathan Allan
1
Ja, ich erinnere mich, %pylabgibt dir auch eine Nummer und wenn du in einem Notizbuch bist, brauchst du am Ende keine Show :)
Ajasja
11

Mathematica, 41 Bytes

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

Die Ausgabe sieht genauso aus wie in der Challenge gezeigt, außer der Schriftart der Zahlen (die vermutlich mit Wolfram Alpha erstellt wurde).

Martin Ender
quelle
11

MATLAB, 35-30 Bytes

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

Dies definiert eine beliebige Funktion. Die Ausgabe erfolgt über ein neues Fenster mit einer skalierbaren Vektorgrafikausgabe. MATLAB plotignoriert automatisch den Imaginärteil der y-Koordinaten, solange Sie die entsprechenden x-Koordinaten angeben n=3. Die folgende Ausgabe ist für .

Fehler
quelle
10

R, 30 Bytes

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

n = 1

Bildbeschreibung hier eingeben

n = 2

Bildbeschreibung hier eingeben

Konrad Rudolph
quelle
3
Oooh hübsche Kreise
Beta Decay
2
Das Standard-Rendering von @BetaDecay R ist hässlich. Der Grund für die Standardeinstellung ist, dass ungefüllte Kreise überzeichnete Punkte nicht so stark verbergen wie gefüllte Kreise / Punkte.
Konrad Rudolph
5
Ich finde es nicht hässlich. Es sieht wirklich cool aus.
mbomb007
1
Die x-Achse ist falsch beschriftet. Ich denke, Sie brauchenx=seq(-3,3,.05);plot(x,Re((0i-n)^x))
user2390246
2
@ user2390246 Da die Achsen komplett optional sind, denke ich nicht, dass es wichtig ist. Wenn es auf die Achsenbeschriftung ankommt, haben andere Antworten auch skalierungsbedingte Probleme (z. B. die 30-stellige MATLAB-Antwort).
Konrad Rudolph
10

R 29 Bytes

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

nwird über stdin bereitgestellt. Ergebnis für n = 1: Bildbeschreibung hier eingeben

Und für n = 2:

Bildbeschreibung hier eingeben

Plannapus
quelle
Warum nicht eine Variable nwie die anderen Antworten verwenden und fünf Zeichen von Ihrer Antwort streichen? Wie auch immer, verrückte Antwort. Ich vergesse immer curve.
Konrad Rudolph
@KonradRudolph Danke. Tatsächlich sind die meisten anderen Antworten nicht vordefiniert n. Die Antworten matlab, matl, TI-Basic und mathematica werden als stdin eingegeben (soweit ich sie verstehe), während die Antworten python und VBA eine Funktion erstellen. Auch wenn es erlaubt ist, ist es nur eine Frage des persönlichen Geschmacks: Ich mag es einfach nicht, Variablen als Eingabemethode vorab zu definieren.
Plannapus
Entschuldigung Korrektur: Die matlab Antworten definieren auch Funktionen.
Plannapus
Gut. Dies ist ein Code Golf…
Konrad Rudolph
Ich wollte nicht pedantisch oder so sein, aber als Community sind wir der Ansicht, dass die Verwendung einer vordefinierten Variablen keine gültige Eingabemethode darstellt, sofern in der Frage nicht ausdrücklich etwas anderes angegeben ist.
Plannapus
8

Excel VBA, 168 160 147 138 Bytes (Zellen als Pixel im 100-fachen Maßstab)

8 Bytes dank KyleKanos gespeichert 22 Bytes dank Taylor Scott gespeichert

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

Formatiert sieht es so aus:

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 nicht a-in gebaut hat pivariabel , so dass wir sie als Tabellenfunktion zu bewerten, wo es tut exist.

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


Ich habe mit einer Chart-Version von 193 Bytes begonnen, aber es hat zu schöneren Ergebnissen geführt.

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 = 2
n = 1

n = 2

Ingenieur Toast
quelle
1
Ist es nicht kürzer zu verwenden, (-n)^xanstatt Pi fest zu codieren?
Beta Decay
1
@BetaDecay Es wäre , wenn Excel negative Zahlen umgehen konnte negative Nicht-Zahlen ¯ angehoben \ _ (ツ) _ / ¯
Toast Ingenieur
2
Ist es nicht kürzer atn(1)*4für Pi zu verwenden?
Kyle Kanos
2
@KyleKanos Ja, danke. Ich habe diese Identität nicht in meiner Konstanten-Nachschlagetabelle gefunden, und als Ingenieur bin ich gesetzlich dazu verpflichtet, damit aufzuhören.
Ingenieur Toast
1
@ TaylorScott Das sind drei neue Tricks, danke. Das ist wertvoller als die 7 Bytes, die sie mir dieses Mal erspart haben.
Ingenieur Toast
6

MATLAB, 35 33 Bytes

Vielen Dank an @flawr für das Entfernen von 2 Bytes!

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

Dies definiert eine anonyme Funktion. Um es mit der Eingabe aufzurufen 2, verwenden Sie ans(2)(oder weisen Sie die Funktion einer Variablen zu, z. B. fund verwenden Sie dann f(2)).

Die Ausgabe erfolgt über Vektorgrafiken (Fenstergröße ändern). Das Abtastintervall auf der x- Achse wird von der ezplotFunktion automatisch bestimmt , scheint aber mehr als ausreichend zu sein.

In STDERR wird eine Warnung ausgegeben, da die an ezplot( @(x)real((-n)^x)) übergebene Funktion nicht vektorisiert ist, sondern der Graph generiert wird.

Beispiel für n = 2:

Bildbeschreibung hier eingeben

Luis Mendo
quelle
1
ezplot = la-z-plot: D (Ich vergesse immer wieder über dieses ...)
Fehler
Huh. Habe nie gewusst, dass man die Domain ezplotso weitergeben kann. Leider kann das nicht gesagt werden fplot, so dass dort kein Byte gespeichert werden kann.
Sanchises
@sanchises wusste ich auch nicht :-) Es war Flawrs Idee
Luis Mendo
5

Jupyter-Notizbuch und Python 3; 53 Bytes

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

Drei Bytes gespart dank @Jonathan Allan.

n = 1 n = 2

Ajasja
quelle
Zwei Nebenbits: Wenn ich die Spezifikationen richtig lese, benötigen Sie mindestens 0,05 (nicht 0,1) zwischen (effektiven) Punkten, und wir sollen 3 einschließen.
DSM
Mit können Sie x=arange(-60,61)/20die von DSM hervorgehobenen Probleme zu einem Preis von 2 Byte beheben. Wenn Sie hinzufügen 0j, arangekann es verwendet werden, um zu plot(x,(-n)**x)Speichern 4 zu wechseln.
Jonathan Allan
@DSM Ops, behoben.
Ajasja
@ JonathanAllan Danke.
Ajasja
Ah, ich habe Sie insgesamt 2 gerettet, Sie haben mich gerade 1 gerettet, indem Sie zu gewechselt haben arange(121)!
Jonathan Allan
3

Gekapseltes 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

Nun, da dies ein Vektorbild selbst ist ...

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

joojaa
quelle
Oh, das ist schön
Beta Decay
3

TikZ + PGFPlots , 175 Byte

\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}

Kompilieren mit, zum Beispiel , latexmk -cd -f -pdf in.texfür eine PDF - Ausgabe. Während der Kompilierung wird der Benutzer dazu aufgefordert n.

Beispielausgaben (in png konvertiert) für n = 1 und n = 2:

n = 1 n = 2

Julian Wolf
quelle
2

Math.JS Grapher , 20 Bytes

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

Zufällig ist dieses Grafikdienstprogramm TC (Infinite-Loops stürzen es zum größten Teil einfach ab.), Und von Natur aus ist es die primäre Ausgabe von Grafiken.

Wie es funktioniert

r(n)=Weist dem Ausdruck eine Funktion zu, rdie das Argument übernimmt . Buchstabe für Buchstabe ist so ziemlich die Herausforderungsbeschreibung. Dies weist aber die Funktion zunf(x)=re((-n)^x)re((-n)^x)f(x) zu, die der Grapher implizit als Liniendiagramm ausgibt.

Wie man es testet

Sie können diese Site verwenden, die Funktion dort eingeben und sie dann mit aufrufen r(input).

Ausgabe

Ausgabe

Ein Taco
quelle
2

J , 37-36 Bytes

Vielen Dank an meinen Kollegen Marshall für die Anleitung. -2 danke an FrownyFrog.

Anonyme implizite Präfixfunktion.

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

Plot-Fenster

-(]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
Adam
quelle
Ich denke 20%~i:@60kann sein i:@3j120.
FrownyFrog
@FrownyFrog Richtig. Vielen Dank.
Adám
1

Dyalog APL, 41 Bytes

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

Wie es funktioniert:

⎕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.

Der Benutzer Befehl ]chart, in diesem Fall nimmt zwei Vektor Argumente, xund an yund zeichnet die Kurven:

n=1n = 1

n=2n = 2

J. Sallé
quelle
0

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

Die Grafik füllt den gesamten Bildschirm aus, auch wenn N kleiner als 1 ist.

Wenn N größer als 1 ist, können Sie Y durch Teilen durch auf einen Wert zwischen -1 und 1 skalieren n^3. Das mache ich schon n^xund n^x / n^3kann damit vereinfacht werden n^(x-3). Wenn jedoch N kleiner als 1 ist, muss ich n^-3stattdessen Y durch dividieren . Dies ist äquivalent zu n^(x+3).

Ich kann verwenden, um n^(x-3*sign(n-1))zu verwenden, -3wenn n>1und +3wennn<1

Bilder folgen in Kürze

12Me21
quelle
0

Excel VBA, 133 Bytes

Direktes Fensterskript, das Eingaben von [A1]einem ChartObjekt aufnimmt und an dieses ausgibt Sheet1.

[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

Vollversion der SubRoutine. I / O ist unverändert.

Sub b()
    [B:B] = "=ROW()/20-3.05"                ''  Define `x`-axis
    [C1:C121] = "=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

Ausgabe

Wo Eingang, n=1

Ausgabediagramm n = 1

Wo Eingang, n=3

Ausgangsdiagramm n = 3

Taylor Scott
quelle
0

Julia 0.6 mit Plots.jl, 46 Bytes

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

GR Grundstück

Das brauchte eine Julia-Vertretung!

Hier gibt es allerdings nicht viel zu golfen, außer (ab) das Überladen von Operatoren, um Bytes bei der Funktionsdefinition zu sparen, und das Verwenden 0im-n, um die Eingabenummer komplex zu machen, wo ich sie normalerweise verwendet habe Complex(n). Das ist notwendig , weil in Julia, für Typ Stabilitätsgründen der ^Bediener komplexe Ergebnisse liefert nur dann, wenn der Eingang Komplex selbst. Hier machen wir es also zu einer komplexen Zahl, indem wir 0imie hinzufügen . 0i.

Eine coole Sache am Plots.jl-Paket ist, dass es automatisch das zu verwendende Backend auswählt, basierend darauf, welche Plot-Pakete Sie installiert haben und von wo aus Sie den plotBefehl ausführen . Das obige Diagramm wurde mit dem GR- Backend erstellt, aber wenn ich das nicht installiert hätte (oder wenn ich explizit einen plotly()Befehl ausgeführt hätte, wie ich es getan habe), hätte es das interaktivere Plotly-Backend verwendet und diesen ausgegeben (der sieht aus wie ein winzig bisschen netter IMO):

Handlung

Es gibt sogar ein UnicodePlots- Backend, um ein Diagramm im Terminal zu drucken (oder in einer Textdatei zu speichern), wobei Unicode-Zeichen und Farbcodes verwendet werden. SE bringt die Ausrichtung der Handlung durcheinander, wenn ich versuche, sie direkt einzufügen. Hier ist also ein Terminal-Screenshot:

UnicodePlots-Plot

PS: Die alternative Formel, Re((-n)x)=nxcOs(πx), kommt auf die gleiche Länge heraus:

using Plots
~n=plot(n.^(x=-3:.05:3).*cospi(x))
Sundar - Setzen Sie Monica wieder ein
quelle
Verdammt, das ist ein kluger (ab) Gebrauch der Braillezeichen.
Zacharý