Narysuj regularny wielokąt


21

Celem tego kodu golfa jest narysowanie regularnego wielokąta (o tej samej długości boków), biorąc pod uwagę liczbę boków i promień (odległość od środka do wierzchołka).

  • Liczbę boków i promień można wprowadzić za pomocą pliku, STDIN lub zwykłej starej zmiennej. Używaj tego, co jest krótsze w twoim języku.
  • -25% wszystkich znaków / bajtów, jeśli obraz jest rysowany zamiast grafiki ASCII.

3
Jaki jest promień wielokąta? Promień jego koła? Jego wychylenie?
Peter Taylor

Tam. Naprawiłem to. Przepraszam za to: P.
Taconut

2
@PeterTaylor Promień zwykłego wielokąta jest odległością do dowolnego wierzchołka (promień outcircle lub circumradius ). Promień koła (lub odległość od boków) nazywa się apothemem . Nie powinno to być „niejasne, o co pytasz”, ponieważ ma łatwą do znalezienia definicję (wynik nr 1 dla „promienia wielokąta” w Google).
Geobits

@Geobits Zgadzam się, ale i tak to edytowałem.
Taconut

@PeterTaylor Oznaczę to jako oba wtedy: I
Taconut

Odpowiedzi:


20

LOGO 37 - 25% = 27,75 (ze zmiennymi)

REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

LOGO 49 - 25% = 36,75 (jako funkcja)

TO P:R:S REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]END

Trójkąt

Wywoływany ze zmiennymi

Make "R 100
Make "S 3
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Używany jako funkcja P 100 3

wprowadź opis zdjęcia tutaj

Plac

Wywoływany ze zmiennymi

Make "R 100
Make "S 4
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Używany jako funkcja P 100 4

wprowadź opis zdjęcia tutaj

Pięciokąt

Wywoływany ze zmiennymi

Make "R 100
Make "S 5
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Używany jako funkcja P 100 5

wprowadź opis zdjęcia tutaj

Dekagon

Wywoływany ze zmiennymi

Make "R 100
Make "S 10
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Używany jako funkcja P 100 10

wprowadź opis zdjęcia tutaj

okrąg

Wywoływany ze zmiennymi

Make "R 100
Make "S 360
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Używany jako funkcja P 100 360

wprowadź opis zdjęcia tutaj


2
Czy możesz opublikować zrzut ekranu?
Gabe

Moim zdaniem wielokąty mają tę samą stronę, a nie promień.
Ross Millikan

@RossMillikan: Obrazy nie były skalowane. Właśnie zaktualizowałem zdjęcia
Abhijit

17

Mathematica, 40–25% = 30

ListPolarPlot[r&~Array~n]/.PointPolygon

wprowadź opis zdjęcia tutaj


Świetny. To pokonało to, czego próbowałem Graphics.
DavidC

2
Nie fair! Zbyt łatwe!
Robbie Wxyz

Dobrze zrobione, nigdy by mi to nie przyszło do głowy.
Michael Stern

Jest Graphics@RegularPolygonniedozwolone?
Greg Martin

@GregMartin Jest to dozwolone, ale znacznie trudniej jest określić za jego pomocą promień.
Tylko ASCII,

12

Java 8: 533 322 - 25% = 241,5

Cóż, to Java: / Po prostu rysuje linie, punkt do punktu. Powinien działać dla dowolnego wielokąta o dowolnym rozmiarze. Wytnij trochę z oryginalnego rozmiaru. Ogromne uznanie dla Vulcan (w komentarzach) za lekcję golfa.

import java.awt.*;class D{public static void main(String[]v){new Frame(){public void paint(Graphics g){int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));g.drawPolygon(x,y,s);}}.show();}}

Podziały wierszy:

import java.awt.*;
class D{
    public static void main(String[]v){
        new Frame(){
            public void paint(Graphics g){
                int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();
                for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));
                g.drawPolygon(x,y,s);
            }
        }.show();
    }
}

Dane wejściowe to argumenty [promień] [strony]:

java D 300 7

Wydajność:

wielokąt!


2
Wyeliminuj 12 bajtów, importując java.awt.image.*zamiastjava.awt.image.BufferedImage
FThompson

1
Mam obniżyła ją do 500 bajtów za pomocą kilku sztuczek. 1) Użyj Short.valueOfzamiast, Integer.valueOfaby zapisać cztery bajty, ponieważ dane wejściowe nigdy nie powinny przekraczać zakresu zwarć. 2) y[]=x.clone()oszczędza jeden bajt y[]=new int[s]. 3) Użyj przestarzałego f.show();zamiast, f.setVisible(1>0);aby zapisać dodatkowe dziewięć bajtów. 4) Użyj 6.28zamiast Math.PI*2, ponieważ oszacowanie jest wystarczająco dokładne do tego celu, oszczędzając trzy bajty. 5) Zadeklaruj Graphics gzamiast Graphics2D gprzy tworzeniu wystąpienia grafiki, aby zapisać dwa bajty.
FThompson

1
@Vulcan mam go następne 120 (głównie przez trashing BufferedImagei Graphicscałkowicie i po prostu rzuca wszystko paint()). Zmieniło kolor obrazu, choć nadal wygląda dobrze IMO. Dzięki, że
kazałem

1
@Geobits Świetne ulepszenia. Pracując nad zredukowaną wersją, zmniejszyłem ją do 349 bajtów , eliminując Framezmienną lokalną, usuwając dliczbę całkowitą i używając / nadużywając pętli for do zapisania kilku znaków, głównie średników. Oto wersja z białymi spacjami .
FThompson

1
Zmniejszony do 325 bajtów przy użyciu drawPolygonzamiast drawLine. Wersja spacji .
FThompson

11

TeX / TikZ (60 - 80,25)

Plik polygon.tex:

\input tikz \tikz\draw(0:\r)\foreach\!in{1,...,\n}{--(\!*360/\n:\r)}--cycle;\bye

(80 bajtów)

Promień i liczba boków są podane jako zmienne / makra \ri \n. Dla promienia można podać dowolną jednostkę TeX. Bez jednostki cmużywana jest jednostka domyślna . Przykłady:

\def\r{1}\def\n{5}    % pentagon with radius 1cm
\def\r{10mm}\def\n{8} % octagon with radius 10mm

(16 bajtów bez wartości)

Jeśli numer strony powinien zostać pominięty, można to zrobić przez

\footline{}

(11 bajtów)

Przykłady generowania plików PDF:

pdftex "\def\r{1}\def\n{3}\input polygon"

Trójkąt

pdftex "\def\r{1}\def\n{5}\input polygon"

Wielokąt

pdftex "\def\r{1}\def\n{8}\input polygon"

Ośmiokąt

pdftex "\def\r{1}\def\n{12}\input polygon"

Dodekagon

Wynik:

Nie jest jasne, co trzeba liczyć. Zakres punktacji wynosiłby:

  • Kod podstawowy to 80 bajtów minus 25% = 60

  • Lub wszystkie włącznie (definicje zmiennych wejściowych, brak numeru strony): (80 + 16 + 11) minus 25% = 80,25

  • Jeśli połączenie między pierwszym a ostatnim punktem nie musi być gładkie, --cyclemożna je usunąć, oszczędzając 7 bajtów.


8

Geogebra , 42–25 % = 31,5 bajtów

Jeśli policzysz znaki zamiast bajtów, będzie to 41 - 25% = 30,75 znaków.

(To znaczy, jeśli uważasz Geogebra za język ...)

Zakłada, że ​​promień jest przechowywany w zmiennej, ra liczba stron jest przechowywana w zmiennej s.

Polygon[(0,0),(sqrt(2-2cos(2π/s))r,0),s]

Wykorzystuje to twierdzenie cosinus c 2 = a 2 + b 2 - 2 ab cos C do obliczenia długości boku z podanego promienia.

Przykładowe dane wyjściowe dla s= 7, r= 5

wprowadź opis zdjęcia tutaj


6

C: 229 180

#include<stdio.h>
#include<math.h>
main(){float n=5,r=10,s=tan(1.57*(1.-(n-2.)/n))*r*2.,i=0,j,x,c,t;int u,v;for(;i<n;i++)for(j=0;j<s;j++)x=i*6.28/n,c=cos(x),t=sin(x),x=j-s/2.,u=c*r+t*x+r*2.,v=-t*r+c*x+r*2,printf("\e[%d;%dH*",v,u);}

(r jest promieniem koła)

Uruchom w terminalu ANSI

Edytować:

  • weź sugestię asa
  • użyj starych zmiennych (lub #define) jako danych wejściowych
  • użyj teraz promienia okręgu
u;main(v){float p=3.14,r=R*cos(p/n),s=tan(p/n)*r*2,i=0,j,x,c,t;for(;i++<n;)for(j=0;j<s;)x=i*p/n*2,c=cos(x),t=sin(x),x=j++-s/2,u=c*r+t*x+r*2,v=c*x-t*r+r*2,printf("\e[%d;%dH*",v,u);}

skompilować:

gcc -opoly poly.c -Dn=sides -DR=radius -lm

Kiedy używasz gcc, możesz faktycznie pominąć #includes. Ponadto możesz zadeklarować vjako globalny na zewnątrz maini zadeklarować ujako parametr main, wtedy nie potrzebujesz int(tj v;main(u){//....). Na koniec możesz zmienić ostatnią forpętlę nafor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205

5

C, 359 znaków

Moja pierwsza próba gry w golfa. Przynajmniej wyprzedza rozwiązanie Java ;-)

int r,n,l,g,i,j,x,y;char* b;float a,c,u,z,p,q,s,t;main(int j,char**v){r=atoi(v[1]);b=malloc(g=(l=r*2+1)*r*2+1);memset(b,32,g);for(j=g-2;j>0;j-=l){b[j]='\n';}b[g-1]=0;a=2*3.14/(n=atoi(v[2]));for(;i<=n;i++,p=s,q=t){c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;if(i>0){u=(s-p)/r,z=(t-q)/r;for(j=0;j<r;j++){x=p+u*j;y=q+z*j;if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';}}}puts(b);}

bez golfa:

int r,n,l,g,i,j,x,y;
char* b;
float a,c,u,z,p,q,s,t;
main(int j,char**v){
    r=atoi(v[1]);
    b=malloc(g=(l=r*2+1)*r*2+1);
    memset(b,32,g);
    for(j=g-2;j>0;j-=l){b[j]='\n';} 
    b[g-1]=0;
    a=2*3.14/(n=atoi(v[2]));
    for(;i<=n;i++,p=s,q=t){
        c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;
        if(i>0){
            u=(s-p)/r,z=(t-q)/r;
            for(j=0;j<r;j++){
                x=p+u*j;y=q+z*j;
                if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';
            }
        }
    }
    puts(b);
}

Jest to jedyny program, który wyświetla wielokąt w ASCII zamiast go rysować. Z powodu tego i niektórych problemów z zaokrąglaniem zmiennoprzecinkowym wynik nie wygląda szczególnie ładnie (znaki ASCII nie są tak wysokie jak szerokość).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######

Pierwszy intmożna usunąć, ponieważ zakłada się, że intjest to kompilator. Ponadto ostatnia forpętla może zostać zmieniona nafor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
użytkownik12205

if(i<0)Można zmienić na if(i). Co jest nadal potrzebne tylko w jednej iteracji, ale nie udało się znaleźć skutecznego sposobu na usunięcie go :(
Allbeert

4

Mathematica, 54 * 75% = 40,5

Graphics@Polygon@Table[r{Cos@t,Sin@t},{t,0,2Pi,2Pi/n}]

Nie sądzę nawet, żeby istniała wersja bez golfisty. Zawierałby tylko więcej białych znaków.

Oczekuje promienia w zmiennej ri liczby boków w zmiennej n. Promień jest nieco pozbawiony znaczenia bez wyświetlania osi, ponieważ Mathematica skaluje wszystkie obrazy, aby pasowały.

Przykładowe użycie:

wprowadź opis zdjęcia tutaj


Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
chyanog

@chyaong ah, mam tendencję do zapominania o Array .
Martin Ender

4

HTML / JavaScript: 215–25% = 161,25 , 212–25 % = 159

<canvas><script>R=100;i=S=10;c=document.currentScript.parentNode;c.width=c.height=R*2;M=Math;with(c.getContext("2d")){moveTo(R*2,R);for(;i-->0;){a=M.PI*2*(i/S);lineTo(R+M.cos(a)*R,R+M.sin(a)*R)}stroke()}</script>

Wersja bez golfa:

<canvas><script>
    var RADIUS = 100;
    var SIDES_COUNT = 10;
    var canvas = document.currentScript.parentNode;
    canvas.width = canvas.height = RADIUS * 2;
    var context = canvas.getContext("2d");
    context.moveTo(RADIUS * 2, RADIUS);
    for(i = 1 ; i <= SIDES_COUNT ; i++) {
        var angle = Math.PI * 2 * (i / SIDES_COUNT);
        context.lineTo(
            RADIUS + Math.cos(angle) * RADIUS,
            RADIUS + Math.sin(angle) * RADIUS
        );
    }
    context.stroke();
</script>

Zaoszczędź 4 znaki przez i=S=5;i for(;i-->0;).
Matt

@Matt Dziękujemy! Nie znałem tej składni i nie mogę znaleźć żadnych informacji na jej temat. Jak to sie nazywa ?
sebcap26

@ sebcap26 Czy masz na myśli tę i-->0część? To jest tak samo jak i-- > 0. Niektórzy nazywają to również operatorem strzałek lub idzie do operatora ;)
ComFreek

Bez obaw :) Jak powiedział @ sebcap26, po prostu zmniejsza się za każdym razem, gdy pętla for ocenia warunek.
Matt

Myślę, że można zapisać znaki usunięcie c=document.currentScript.parentNode;i zastąpienie <canvas>przez<canvas id="c">
Hedi

3

Postscript 156 - 25% = 117

translate exch 1 exch dup dup scale div currentlinewidth mul setlinewidth
1 0 moveto dup{360 1 index div rotate 1 0 lineto}repeat closepath stroke showpage

Podaj promień, liczbę boków i punkt środkowy linii poleceń

gs -c "100 9 300 200" -- polyg.ps

lub dołącz do źródła

echo 100 9 300 200 | cat - polyg.ps | gs -

Przetłumacz na środek, skaluj do promienia, przejdź do (1,0); następnie powtórz n razy: obróć o 360 / n, narysuj linię do (1,0); narysuj ostatnią linię, obrysuj i wyślij stronę.


3

Szałwia , 44 - 25% = 33

Zakłada, że ​​liczba stron jest przechowywana w szmiennej, a promień jest przechowywany w rzmiennej.

polytopes.regular_polygon(s).show(figsize=r)

Przykładowe dane wyjściowe:

s= 5, r= 3

wprowadź opis zdjęcia tutaj

s= 5, r= 6

wprowadź opis zdjęcia tutaj

s= 12, r= 5

wprowadź opis zdjęcia tutaj


Skalowanie osi jest mylące. Czy to da się naprawić? (np. pierwszy punkt w (0,3), gdy promień = 3, zamiast (0,1))
uraz cyfrowy

1
@DigitalTrauma Mój program zasadniczo generuje „standardowy” regularny wielokąt, a następnie powiększa obraz o współczynnik skali. O ile mi wiadomo, regular_polygonfunkcja zawsze generuje wielokąty z pierwszym wierzchołkiem przy (0,1). Rozwiązaniem byłoby nie pokazywanie osi z dodatkowymi 7 bajtami ( ,axes=0po figsize=r)
użytkownik12205

3

bc + ImageMagick + xview + bash, 104,25 (139 bajtów - 25%)

To wyzwanie byłoby niepełne bez odpowiedzi ImageMagick ...

convert -size $[$2*2]x$[$2*2] xc: -draw "polygon `bc -l<<Q
for(;i++<$1;){t=6.28*i/$1;print s(t)*$2+$2,",";c(t)*$2+$2}
Q`" png:-|xview stdin

Na przykład ./polygon.sh 8 100tworzy ten obraz:

wprowadź opis zdjęcia tutaj


2

JavaScript 584 (867 bez golfa)

Ten kod używa N złożonych pierwiastków jedności i tłumaczy kąty na punkty X, Y. Następnie początek jest przenoszony na środek płótna.

Grał w golfa

function createPolygon(c,r,n){
c.width=3*r;
c.height=3*r;
var t=c.getContext("2d");
var m=c.width/2;
t.beginPath(); 
t.lineWidth="5";
t.strokeStyle="green";
var q=C(r, n);
var p=pts[0];
var a=p.X+m;
var b=p.Y+m;
t.moveTo(a,b);
for(var i=1;i<q.length;i++)
{
p=q[i];
t.lineTo(p.X+m,p.Y+m);
t.stroke();
}
t.lineTo(a,b);
t.stroke();
}
function P(x,y){
this.X=x;
this.Y=y;
}
function C(r,n){
var p=Math.PI;
var x,y,i;
var z=[];
var k=n;
var a;
for(i=0;i<k;i++)
{
a = 2*i*p/n;
x = r*Math.cos(a);
y = r*Math.sin(a);
z.push(new P(x,y));
}
return z;
}

Przykładowe dane wyjściowe:

Wyjście w Chrome

Nie golfił

function createPolygon(c,r,n) {
c.width = 3*r;
c.height = 3*r;
var ctx=c.getContext("2d");
var mid = c.width/2;
ctx.beginPath(); 
ctx.lineWidth="5";
ctx.strokeStyle="green";
var pts = ComplexRootsN(r, n);
if(null===pts || pts.length===0)
{
alert("no roots!");
return;
}
var p=pts[0];
var x0 = p.X + mid;
var y0 = p.Y + mid;
ctx.moveTo(x0,y0);
for(var i=1;i<pts.length;i++)
{
p=pts[i];
console.log(p.X +"," + p.Y);
ctx.lineTo(p.X + mid, p.Y + mid);
ctx.stroke();
}
ctx.lineTo(x0,y0);
ctx.stroke();
}

function Point(x,y){
this.X=x;
this.Y=y;
}

function ComplexRootsN(r, n){
var pi = Math.PI;
var x,y,i;
var arr = [];
var k=n;
var theta;
for(i=0;i<k;i++)
{
theta = 2*i*pi/n;
console.log('theta: ' + theta);
x = r*Math.cos(theta);
y = r*Math.sin(theta);
console.log(x+","+y);
arr.push(new Point(x,y));
}
return arr;
}

Ten kod wymaga elementu płótna HTML5, c jest obiektem płótna, r jest promieniem, a n jest liczbą boków.


2

PHP 140-25% = 105

<?
for(;$i++<$p;$a[]=$r-cos($x)*$r)$a[]=$r-sin($x+=2*M_PI/$p)*$r;
imagepolygon($m=imagecreatetruecolor($r*=2,$r),$a,$p,0xFFFFFF);
imagepng($m);

Zakłada dwie predefiniowane zmienne: $pliczbę punktów i $rpromień w pikselach. Alternatywnie można list(,$r,$p)=$argv;zamiast tego użyć argumentów wiersza poleceń i użyć ich. Wyjście będzie png, które powinno być potokowane do pliku.


Wydajność

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;


1

TI-80 BASIC, 25 bajtów - 25% = 18,75

PARAM
2π/ANS->TSTEP
"COS T->X1ᴛ
"SIN T->Y1ᴛ
DISPGRAPH

Zakłada, że ​​wszystkie ustawienia są ustawione na wartości domyślne. Uruchom program jak 5:PRGM_POLYGON(dla pięciokąta)

Działa poprzez narysowanie koła z bardzo małą liczbą kroków. Na przykład pięciokąt ma stopnie 2π / 5 radianów.

Ustawienia okna są wystarczająco dobre TMINi TMAXsą ustawione na 0i , więc wszystko, co musimy zmienić, to TSTEP.


1

SmileBASIC 3, 183 159 - 25% = 119,25 bajtów

Bierze boki i promień INPUT, oblicza i przechowuje punkty, a następnie rysuje je za pomocą GLINE. Wydaje mi się, że może to być krótsze, ale jest jak pierwsza w nocy, cokolwiek. Zakłada czyste i domyślne środowisko wyświetlania, więc może być konieczne ACLSpodczas uruchamiania go z DIRECT.

INPUT S,R
DIM P[S,2]FOR I=0TO S-1
A=RAD(I/S*360)P[I,0]=COS(A)*R+200P[I,1]=SIN(A)*R+120NEXT
FOR I=0TO S-1GLINE P[I,0],P[I,1],P[(I+1)MOD S,0],P[(I+1)MOD S,1]NEXT

zrzut ekranu


1
Bajt to bajt, nie można powiedzieć, że to tylko połowa.
12Me21

Odejmowanie reguły 25%.
Matthew Roh

1

OpenSCAD: 31 mniej 25% = 23,25

module p(n,r){circle(r,$fn=n);}

Pierwszy post tutaj! Wiem, że spóźniłem się na przyjęcie, ale na początku wydawało mi się, że to równie dobre pytanie. Zadzwoń za pomocą p(n,r).


Witamy na stronie!
Wheat Wizard

0

ActionScript 1, Flash Player 6: 92 - 25% = 69

n=6
r=100
M=Math
P=M.PI*2
lineStyle(1)
moveTo(r,0)
while((t+=P/n)<=P)lineTo(M.cos(t)*r,M.sin(t)*r)

0

C # w LINQPAD

Podziękowania dla części matematycznej należą do Geobits (mam nadzieję, że nie masz nic przeciwko!) Z odpowiedzią Java. Jestem beznadziejna z matematyki :)

Zrobiłem to w LINQPAD, ponieważ ma wbudowane okno wyjściowe. W zasadzie możesz przeciągnąć i upuścić w nim następujące elementy, a to narysuje wielokąt. Po prostu zmień go na „Program C #” i zaimportuj bibliotekę System.Drawing do właściwości zapytania.

//using System.Drawing;

void Main()
{
// Usage: (sides, radius)
    DrawSomething(4, 50);
}

void DrawSomething(int sides, int radius)
{
    var points = new Point[sides];
    var bmpSize = radius*sides;
    var bmp = new Bitmap(bmpSize,bmpSize);
    using (Graphics g = Graphics.FromImage(bmp))
    {   
        var o = radius+30;
        for(var i=0; i < points.Length; i++)
        {
            // math thanks to Geobits
            double w = Math.PI*2*i/sides;
            points[i].X = (int)(Math.Cos(w)*radius+o);
            points[i].Y = (int)(Math.Sin(w)*radius+o);
        }
        g.DrawPolygon(new Pen(Color.Red), points);
    }
    Console.Write(bmp);
}

wprowadź opis zdjęcia tutaj


0

Matlab 58 bajtów - 25% = 43,5

Nie widziałem rozwiązania Matlab, więc oto jedno, które jest dość proste:

f=@(n,r) plot(r*cos(0:2*pi/n:2*pi),r*sin(0:2*pi/n:2*pi));

Możesz zgolić niektóre bajty, jeśli r i n są już w obszarze roboczym.

Przykładowe wywołanie:

f(7,8)

7-gon o promieniu 8


0

Python 2, 222 bajty

from math import*
def f(s,r):
 r*=cos(pi/s)
 v,R=2*pi/s,[(2*t)/98.-1for t in range(99)]
 print"P1 99 99 "+" ".join(["0","1"][all(w*(w-x)+z*(z-y)>0for w,z in[(r*cos(a*v),r*sin(a*v))for a in range(s)])]for x in R for y in R)

Sprawdza, czy piksel znajduje się po wewnętrznej stronie wszystkich hiperpłaszczyzn (linii) wielokąta. Promień jest dotknięty, ponieważ faktycznie używany jest apothem.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


0

Mathematica 27 (= 36 - 25%)

Graphics[Polygon[CirclePoints[r, n]]]

Kiedy przesyłamy kod Mathematica, często zapominamy o nowych funkcjach, które wciąż są wbudowywane w język, a obecne słownictwo językowe gromadzi około 5000 podstawowych funkcji . Duże i rozwijające się słownictwo językowe jest bardzo przydatne podczas gry w golfa. CirclePoints zostały wprowadzone w aktualnej wersji 11.X. Konkretnym przykładem 7-stronnego promienia 5 jest:

wprowadź opis zdjęcia tutaj

Musisz także wprowadzić parametr kąta, aby kontrolować orientację wielokąta:

Graphics[Polygon[CirclePoints[{1, 2}, 5]]]

wprowadź opis zdjęcia tutaj


0

Python 2, 74 bajty - 25% = 55,5

Dane wejściowe są w zmiennych r,n. Jeśli zostanie uwzględniony w liczniku, będzie to r,n=input()o 12 bajtów więcej.

import math,turtle as t
exec"t.fd(2*r*math.sin(180/n));t.rt(360/n);"*n

Wypróbuj online - (używa innego kodu, ponieważ execnie jest zaimplementowany w tłumaczu online)


0

SmileBASIC, 85 75–25 % = 56,25 bajtów

FOR I=0TO S
A=I/S*6.28N=X
M=Y
X=R+R*COS(A)Y=R+R*SIN(A)GLINE N,M,X,Y,-I
NEXT

Zmienne S i R są używane jako dane wejściowe.

Wyjaśnił:

FOR I=0 TO Sides        'Draw n+1 sides (since 0 is skip)
 Angle=I/Sides*6.28     'Get angle in radians
 OldX=X:OldY=Y          'Store previous x/y values
 X=Radius+Radius*COS(A) 'Calculate x and y
 Y=Radius+Radius*SIN(A)
 GLINE OldX,OldY,X,Y,-I 'Draw line. Skip if I is 0 (since old x and y aren't set then)
NEXT

Boki są rysowane przy użyciu koloru -I, który zwykle jest bliski -1 (i biały HFFFFFFFF) (z wyjątkiem sytuacji, gdy Ima wartość 0, gdy jest przezroczysty).

Możesz również narysować wypełniony wielokąt za pomocą GTRI N,M,X,Y,R,R,-IzamiastGLINE...


0

Tikz, 199 bajtów

\documentclass[tikz]{standalone}\usetikzlibrary{shapes.geometric}\begin{document}\tikz{\def\p{regular polygo}\typein[\n]{}\typein[\r]{}\node[draw,minimum size=\r,\p n,\p n sides=\n]{}}\end{document}

To rozwiązanie wykorzystuje bibliotekę tikz shapes.geometric.

Oto jak wygląda wielokąt o 5bokach i promieniu, 8ingdy oglądany jest w evince .

Obowiązkowe zdjęcie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.