Narysuj wykres

31

Wyzwanie

Biorąc pod uwagę dane wejściowe całkowite, n (gdzie 0<n<50 ), wyjście wykres y=Re((n)x) z x=3 z x=3 włącznie.

Gdzie Re(p) to część rzeczywista liczby zespolonej p .

Należy zauważyć, że Re((n)x)=nxcos(πx)

Wydajność

Dane wyjściowe mogą być w dowolnej formie (np. Obraz lub okno itp.). Sztuka ASCII jest niedozwolona.

Wykres nie musi mieć osi (aby umożliwić konkurowanie językom bez wbudowanych funkcji graficznych).

Jeśli obraz jest wyprowadzany, każda ze stron musi być dłuższa niż 500 pikseli. Podobnie fabuła musi wypełniać obraz najlepiej, jak to możliwe.

Minimalny odstęp między wykresami wynosi 0,05.

Grafika wektorowa jest dozwolona.

Przykłady

Dla danych wejściowych 2:

Dla danych wejściowych 1:


Musisz podać odpowiednie wyniki w swojej odpowiedzi (n = 1 in = 2).

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło
37
ASCII art is disallowed.(ಥ﹏ಥ)
Albert Renshaw,
1
Czy osie mogą znajdować się na lewej i dolnej krawędzi wykresu? zamiast w centrum?
Kritixi Lithos
2
„Jeśli obraz jest wyprowadzany, każda ze stron musi być dłuższa niż 500 pikseli”. Czy grafika wektorowa jest dozwolona?
Martin Ender,
1
@MartinEnder Tak, tak sądzę
Beta
4
Dlaczego nie dziwię się, że MATLAB, MATL i Mathematica to jedne z pierwszych odpowiedzi. :)
Kevin Cruijssen

Odpowiedzi:

12

MATL, 22 18 16 bajtów

Dzięki @LuisMendo za dodatkowe -2 bajty!

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

Wypróbuj na matl.suever.net

wada
źródło
21

TI-Basic, 26 21 bajtów

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

Dane wyjściowe dla N = 2:

WYKRES WYKRESU TI84SE

Timtech
źródło
1
W twoim kodzie liczę 47 znaków, a nie 26.
Konrad Rudolph
11
@KonradRudolph Zobacz: Wytyczne TI-Basic dotyczące punktacji.
Addison Crump,
5
„Jeśli obraz jest wyprowadzany, każda ze stron musi być dłuższa niż 500 pikseli”. Nie wydaje się, aby działała tu wbudowana funkcja graficzna.
user5090812
7
@ user5090812 „Dane wyjściowe mogą być w dowolnej formie (np. obraz lub okno itp.)” - Przesyłam dane przez okno wykresu, a nie obraz, więc to ograniczenie nie ma zastosowania.
Timtech,
1
Kto by pomyślał, że kalkulator graficzny może przedstawiać rzeczy!
PyRulez
15

Bash + Gnuplot, 56 45 bajtów

(-11 bajtów dzięki Noiralef!)

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

Zapisuje wynikowy wykres jako pngobraz o nazwie Aw bieżącym katalogu roboczym.

Przykładowe wyniki

Dla n = 1 :

Dla n = 2 :

R. Kap
źródło
1
+1 za używanie języka, którego używam codziennie. (bez „zniekształconych binarnych bzdur” jak w golfowych językach ^^). Można to ponownie wykorzystać w codziennych sytuacjach.
Olivier Dulac
5
Możesz zapisać 11 bajtów, używając skrótów:gnuplot -e "se t png;p[-3:3]real((-2)**x)">A
Noiralef 14.04.17
@Noiralef Thanks! :)
R. Kap
13

Python 3 z matplotlib , 103 72 bajty

-12 bajtów dzięki DSM (moduł jest instalowany wraz z matplotlibwywoływaną pylabz niezbędną funkcjonalnością „czyniąc Pythona w replice bardziej podobnym do Matlaba” - dziwne, ale prawdziwe!)
-18 więcej w rezultacie (pylab ma również wiele funkcji numpy!)
- 1 bajt dzięki Ajasja (zamiast arange(-60,61)/20+0jz 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
źródło
2
Czy możesz się go pozbyć, from matplotlib.pyplot import*jeśli uruchomisz ipython z flagą --pylab --matplotlib?
Ajasja
Czy masz iPython; Czy to działa? Podejrzewam, że byłoby to do przyjęcia, ale musiałbym zadać sobie pytanie. Nie mam iPython i nigdy nie musiałem z niego korzystać.
Jonathan Allan
tak, działa z --pylab (testowany z python 2)
Ajasja 14.04.17
W żadnym pliku konfiguracyjnym nie ma nic niestandardowego, co sprawia, że ​​ekran działa, prawda? Jeśli nie, powiedziałbym, że opublikuj to jako osobną odpowiedź na tę okazję, ponieważ jest to sprytne użycie zmiany języka IMO. EDYCJA: Widzę, że też tam grałeś :)
Jonathan Allan
1
Tak, pamiętam, że %pylabdaje ci też odrętwienie, a jeśli jesteś w zeszycie, nie potrzebujesz programu na końcu :)
Ajasja
11

Mathematica, 41 bajtów

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

Dane wyjściowe wyglądają dokładnie tak, jak pokazano w wyzwaniu, z wyjątkiem czcionki liczb (która, jak podejrzewam, została stworzona za pomocą Wolfram Alpha).

Martin Ender
źródło
11

MATLAB, 35 30 bajtów

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

To określa dowolną funkcję. Dane wyjściowe są w nowym oknie ze skalowalnym wyjściem grafiki wektorowej. MATLAB plotautomatycznie ignoruje urojoną część współrzędnych y, pod warunkiem, że podasz odpowiednie współrzędne x. Poniższy wynik jest dla n=3.

wada
źródło
10

R, 30 bajtów

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

n = 1

wprowadź opis zdjęcia tutaj

n = 2

wprowadź opis zdjęcia tutaj

Konrad Rudolph
źródło
3
Oooh, piękne kręgi
rozpad bety,
2
Domyślne renderowanie @BetaDecay R jest brzydkie. Uzasadnieniem dla ustawienia domyślnego jest to, że niewypełnione koła nie ukrywają wypukłych punktów tak bardzo, jak by to zrobiły wypełnione koła / kropki.
Konrad Rudolph
5
Nie sądzę, że to brzydkie. Wygląda naprawdę fajnie.
mbomb007
1
Oś x jest nieprawidłowo oznaczona. Myślę, że potrzebujeszx=seq(-3,3,.05);plot(x,Re((0i-n)^x))
2390246,
2
@ user2390246 Biorąc pod uwagę, że osie są całkowicie opcjonalne, nie sądzę, żeby to miało znaczenie. Jeśli etykietowanie osi ma znaczenie, inne odpowiedzi również mają problemy ze skalowaniem (np. 30-znakowa odpowiedź MATLAB).
Konrad Rudolph
10

R, 29 bajtów

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

njest zapewniany przez stdin. Wynik dla n = 1: wprowadź opis zdjęcia tutaj

A dla n = 2:

wprowadź opis zdjęcia tutaj

plannapus
źródło
Dlaczego nie użyć zmiennej ntakiej jak inne odpowiedzi i zgolić pięć znaków z odpowiedzi? W każdym razie szalona odpowiedź. Zawsze o tym zapominam curve.
Konrad Rudolph
@KonradRudolph Thanks. W rzeczywistości większość innych odpowiedzi nie jest predefiniowana n. Odpowiedzi na matlab, matl, TI-Basic i mathematica przyjmują dane wejściowe jako standardowe (o ile je rozumiem), podczas gdy odpowiedzi na python i VBA tworzą funkcję. Nawet jeśli jest to dozwolone, to tylko kwestia osobistego gustu: po prostu nie lubię predefiniować zmiennych jako sposobu wprowadzania danych.
plannapus
Przepraszamy korekta: odpowiedzi Matlaba również definiują funkcje.
plannapus
Dobrze. To jest golf golfowy…
Konrad Rudolph
Nie chciałem być pedantyczny ani nic, ale tak naprawdę jako społeczność uważamy, że użycie predefiniowanej zmiennej nie jest uważane za prawidłową metodę wprowadzania danych, chyba że w pytaniu wyraźnie zaznaczono inaczej.
plannapus
8

Excel VBA, 168 160 147 138 bajtów (komórki jako piksele w skali 100x)

Zaoszczędzono 8 bajtów dzięki KyleKanos
Zaoszczędzono 22 bajtów dzięki 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

Sformatowane wygląda to tak:

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

Ciekawostka: VBA nie posiada wbudowanej pizmiennej więc musimy ocenić go jako funkcji arkusza gdzie robi istnieje.

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


Zacząłem z wersji wykresu na 193 bajtów, ale nie dostać ładniejsze efekty.

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

Inżynier Toast
źródło
1
Czy nie jest krótszy w użyciu (-n)^xzamiast twardego kodu pi?
Beta Decay
1
@BetaDecay Byłoby, gdyby Excel mógł obsługiwać liczby ujemne podniesione do ujemnych liczb całkowitych ¯ \ _ (ツ) _ / ¯
Inżynier Toast
2
Czy użycie atn(1)*4pi nie jest krótsze ?
Kyle Kanos
2
@KyleKanos Rzeczywiście, dzięki. Nie znalazłem tej tożsamości w tabeli stałych i jako inżynier jestem prawnie zobowiązany do zatrzymania się.
Inżynier Toast
1
@TaylorScott To trzy nowe sztuczki, dzięki. To jest cenniejsze niż 7 bajtów, które mi tym razem zaoszczędzili.
Inżynier Toast
6

MATLAB, 35 33 bajtów

Dzięki za @flawr za usunięcie 2 bajtów!

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

Definiuje to anonimową funkcję. Aby wywołać go z wejściem 2, użyj ans(2)(lub przypisz funkcję do zmiennej, takiej jak, fa następnie użyj f(2)).

Wyjście to grafika wektorowa (okno o zmiennym rozmiarze). Interwał próbkowania na osi x jest określany automatycznie przez ezplotfunkcję, ale wydaje się, że to więcej niż wystarcza.

Ostrzeżenie jest generowane w STDERR, ponieważ funkcja przekazana do ezplot( @(x)real((-n)^x)) nie jest wektoryzowana, ale generowany jest wykres.

Przykład dla n = 2:

wprowadź opis zdjęcia tutaj

Luis Mendo
źródło
1
ezplot = la-z-plot: D (ciągle o tym zapominam ...)
wada
Huh Nigdy nie wiedziałem, że możesz przekazać domenę w ezplotten sposób. Niestety nie można tego samego powiedzieć fplot, więc nie można tam zapisać żadnego bajtu.
Sanchises
@sanchises Też nie wiedziałem :-) To był pomysł flawr
Luis Mendo
5

Notatnik Jupyter i Python 3; 53 bajty

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

Trzy bajty zaoszczędzone dzięki @Jonathan Allan.

n = 1 n = 2

Ajasja
źródło
Dwa drobne bity: jeśli dobrze przeczytam specyfikację, potrzebujesz minimum 0,05 (nie 0,1) między (skutecznymi) punktami, a my powinniśmy uwzględniać 3
DSM
Możesz użyć x=arange(-60,61)/20do rozwiązania problemów wyróżnionych przez DSM kosztem 2 bajtów. Jeśli dodasz 0jdo tego arange, możesz go użyć do przejścia na plot(x,(-n)**x)oszczędzanie 4.
Jonathan Allan
Operacje @DSM, naprawione.
Ajasja
@JonathanAllan Thanks.
Ajasja
Ach, w sumie uratowałem ci 2, właśnie uratowałeś mnie 1, zmieniając na arange(121)!
Jonathan Allan
3

Encapsulated PostScript; 232 bajty

%!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

Teraz, ponieważ jest to sam obraz wektorowy ...

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

joojaa
źródło
Oo, co jest miłe
rozpad bety
3

TikZ + PGFPlots , 175 bajtów

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

Skompilować z, na przykład , latexmk -cd -f -pdf in.texdo formatu PDF. Podczas kompilacji użytkownik jest monitowany n.

Przykładowe dane wyjściowe (przekonwertowane na png) dla n = 1 in = 2:

n = 1 n = 2

Julian Wolf
źródło
2

Math.JS Grapher , 20 bajtów

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

Według zwykłego fluke, tym narzędziem graficznym jest TC (w większości przypadków pętle Infinite po prostu powodują awarię.), A z natury jego głównym wyjściem są wykresy.

Jak to działa

r(n)=przypisuje funkcję, rktóra przenosi argument ndo wyrażenia f(x)=re((-n)^x). re((-n)^x)jest dosłownie litera po literze opis wyzwania. Ale przypisuje to funkcję f(x), którą grapher domyślnie wyprowadza jako wykres liniowy.

Jak to przetestować

Możesz skorzystać z tej witryny, wcisnąć tam tę funkcję, a następnie wywołać ją za pomocą r(input).

Wydajność

Wydajność

ATaco
źródło
2

J , 37 36 bajtów

Dziękuję mojemu koledze Marshallowi za wskazówki. -2 dzięki FrownyFrog.

Anonimowa ukryta funkcja prefiksu.

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

Okno wydruku

-(]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
Adám
źródło
Myślę, że 20%~i:@60może być i:@3j120.
FrownyFrog,
@FrownyFrog Prawidłowe. Dzięki.
Adám
1

Dyalog APL, 41 bajtów

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

Jak to działa:

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

Polecenie użytkownika ]chart, w tym przypadku przyjmuje dwa argumenty wektorowej, xa yi działki wykresy:

n=1n = 1

n=2n = 2

J. Sallé
źródło
0

SmileBASIC, 82 bajty

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

Wykres wypełnia cały ekran, nawet gdy N jest mniejsze niż 1.

Gdy N jest większe niż 1, można przeskalować Y, aby zawierało się między -1 a 1, dzieląc je przez n^3. Już robię n^xi n^x / n^3można to uprościć n^(x-3). Jednak gdy N jest mniejsze niż 1, muszę n^-3zamiast tego podzielić Y. Jest to równoważne z n^(x+3).

Mogę użyć n^(x-3*sign(n-1))do użycia -3jeśli n>1i +3jeślin<1

Zdjęcia już wkrótce

12Me21
źródło
0

Excel VBA, 133 bajty

Natychmiastowy skrypt okna, który pobiera dane wejściowe [A1]i wysyła Chartobiekt do Sheet1obiektu.

[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

Bez golfa

Pełna Subrutynowa wersja. I / O jest niezmieniony.

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

Wydajność

n=1

Wykres wyjściowy n = 1

n=3

Wykres wyjściowy n = 3

Taylor Scott
źródło
0

Julia 0.6 z Plots.jl, 46 bajtów

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

Działka GR

To wymagało reprezentacji Julii!

Nie ma tu wiele do golfa, z wyjątkiem (ab) użycia przeciążenia operatora, aby zaoszczędzić bajty na definicji funkcji, i użycia, 0im-naby skomplikować liczbę wejściową tam, gdzie zwykle mogłem jej użyć Complex(n). To konieczne, ponieważ w Julii, dla stabilności typu powodów ^operator zwraca Complex wyniki tylko wtedy, gdy wejście jest złożona sama. Więc tutaj robimy liczbę zespoloną, dodając 0imnp. 0i.

Jedną fajną rzeczą w pakiecie Plots.jl jest to, że automatycznie wybiera backend do użycia na podstawie zainstalowanych pakietów wydruku i miejsca, w którym uruchamiasz plotpolecenie. Powyższy wykres został utworzony za pomocą backendu GR , ale gdybym go nie zainstalował (lub gdybym wyraźnie uruchomił plotly()polecenie tak jak w tym przypadku), użyłby bardziej interaktywnego backendu Plotly i wypuściłby to (co wygląda na odrobinę ładniejszy IMO):

Działka fabularna

Istnieje nawet zaplecze UnicodePlots , aby wydrukować wykres w terminalu (lub zapisać do pliku tekstowego) przy użyciu znaków Unicode i kodów kolorów. SE ciągle psuje wyrównanie fabuły, jeśli spróbuję go bezpośrednio wkleić, więc oto zrzut ekranu terminala:

Wykres UnicodePlots

PS: Alternatywna formuła, , ma tę samą długość:Re((n)x)=nxcos(πx)

using Plots
~n=plot(n.^(x=-3:.05:3).*cospi(x))
sundar - Przywróć Monikę
źródło
Dang, to sprytne (ab) użycie znaków brajlowskich.
Zacharý