วาดรูปหลายเหลี่ยมปกติ


21

เป้าหมายของการเล่นกอล์ฟรหัสนี้คือการวาดรูปหลายเหลี่ยมปกติ (หนึ่งที่มีความยาวด้านเท่ากัน) กำหนดจำนวนของด้านและรัศมี (ระยะทางจากศูนย์ถึงจุดสุดยอด)

  • จำนวนของด้านและรัศมีสามารถป้อนผ่านไฟล์, STDIN หรือเพียงแค่ตัวแปรเก่าธรรมดา ใช้สิ่งที่สั้นกว่าในภาษาของคุณ
  • -25% ของจำนวนอักขระ / ไบต์ทั้งหมดหากวาดภาพจริง ๆ แล้วแทนที่จะเป็น ASCII art

3
รัศมีของรูปหลายเหลี่ยมคืออะไร รัศมีของ incircle หรือไม่? มันรอบนอก?
Peter Taylor

ที่นั่น ฉันซ่อมมัน. ขออภัยเกี่ยวกับที่: P
Taconut

2
@PeterTaylor รัศมีของรูปเหลี่ยมปกติเป็นระยะทางถึงจุดสุดยอดใด ๆ (รัศมี outcircle หรือcircumradius ) รัศมีวงกลมแนบ (หรือระยะทางไปยังด้านข้าง) เรียกว่าapothem สิ่งนี้ไม่ควร "ไม่ชัดเจนสิ่งที่คุณถาม" เนื่องจากมีคำจำกัดความที่พบได้ง่าย (# 1 ผลการค้นหา "รัศมีของรูปหลายเหลี่ยม" บน google)
Geobits

@Geobits ฉันเห็นด้วย แต่ฉันยังคงแก้ไขอยู่ดี
Taconut

@PeterTaylor ฉันจะแท็กเป็นทั้งคู่แล้ว: I
Taconut

คำตอบ:


20

โลโก้ 37 - 25% = 27.75 (พร้อมตัวแปร)

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

โลโก้ 49 - 25% = 36.75 (เป็นฟังก์ชั่น)

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

สามเหลี่ยม

เรียกว่าตัวแปร

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

ใช้เป็นฟังก์ชั่น P 100 3

ป้อนคำอธิบายรูปภาพที่นี่

สี่เหลี่ยม

เรียกว่าตัวแปร

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

ใช้เป็นฟังก์ชั่น P 100 4

ป้อนคำอธิบายรูปภาพที่นี่

รูปห้าเหลี่ยม

เรียกว่าตัวแปร

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

ใช้เป็นฟังก์ชั่น P 100 5

ป้อนคำอธิบายรูปภาพที่นี่

รูปสิบเหลี่ยม

เรียกว่าตัวแปร

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

ใช้เป็นฟังก์ชั่น P 100 10

ป้อนคำอธิบายรูปภาพที่นี่

วงกลม

เรียกว่าตัวแปร

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

ใช้เป็นฟังก์ชั่น P 100 360

ป้อนคำอธิบายรูปภาพที่นี่


2
คุณสามารถโพสต์ภาพหน้าจอได้ไหม
Gabe

ในสายตาของฉันรูปหลายเหลี่ยมมีด้านเดียวกันไม่ใช่รัศมี
Ross Millikan

@RossMillikan: ภาพไม่ได้ปรับขนาด ฉันเพิ่งอัปเดตภาพ
Abhijit

17

Mathematica, 40 - 25% = 30

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

ป้อนคำอธิบายรูปภาพที่นี่


ยิ่งใหญ่ Graphicsตีว่าสิ่งที่ฉันพยายามกับ
DavidC

2
ไม่ยุติธรรม! ง่ายเกินไป!
Robbie Wxyz

เสร็จแล้วอย่างนี้จะไม่เกิดขึ้นกับฉัน
Michael Stern

คือGraphics@RegularPolygonไม่ได้รับอนุญาต?
Greg Martin

@GregMartin ได้รับอนุญาต แต่มันยากกว่ามากในการระบุรัศมีด้วย
ASCII เท่านั้น

12

Java 8: 533 322 - 25% = 241.5

มันคือ Java: / เพียงแค่ลากเส้นชี้ไปที่จุดหนึ่ง ควรทำงานกับรูปหลายเหลี่ยมที่มีขนาดใดก็ได้ ลดขนาดลงเล็กน้อยจากขนาดดั้งเดิม เครดิตขนาดใหญ่ให้กับวัลแคน (ในความคิดเห็น) สำหรับบทเรียนกอล์ฟ

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();}}

ตัวแบ่งบรรทัด:

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();
    }
}

อินพุตคืออาร์กิวเมนต์ [รัศมี] [ข้าง]:

java D 300 7

เอาท์พุท:

รูปหลายเหลี่ยม!


2
กำจัด 12 ไบต์โดยนำเข้าjava.awt.image.*แทนjava.awt.image.BufferedImage
FThompson

1
ฉันลดให้เหลือ 500 ไบต์โดยใช้ลูกเล่นบางอย่าง 1) ใช้Short.valueOfแทนInteger.valueOfการบันทึกสี่ไบต์เนื่องจากอินพุตไม่ควรเกินช่วงของกางเกงขาสั้น 2) ช่วยประหยัดมากกว่าหนึ่งไบต์y[]=x.clone() y[]=new int[s]3) ใช้การคัดค้านf.show();แทนf.setVisible(1>0);การบันทึกการเพิ่มเก้าไบต์ 4) ใช้6.28แทนMath.PI*2เนื่องจากการประเมินมีความถูกต้องเพียงพอสำหรับจุดประสงค์นี้ทำให้ประหยัดได้สามไบต์ 5) ประกาศGraphics gแทนที่จะGraphics2D gสร้างกราฟิกอินสแตนซ์เพื่อบันทึกสองไบต์
FThompson

1
@Vulcan ผมได้รับมันลงอีก 120 (ส่วนใหญ่โดย trashing BufferedImageและGraphicsทั้งหมดและเพียงการขว้างปาทุกอย่างในpaint()) มันเปลี่ยนสีของภาพแม้ว่ามันจะยังดูดีอยู่ก็ตาม ขอบคุณที่ทำให้ฉันลองดูที่นี่อีก :) :)
Geobits

1
@Geobits การปรับปรุงที่ยอดเยี่ยม เมื่อทำงานกับเวอร์ชั่นที่ลดลงของฉันฉันได้ลดขนาดมันลงเหลือ 349 ไบต์โดยกำจัดFrameตัวแปรท้องถิ่นลบdจำนวนเต็มและใช้ / เหยียดหยาม for-loop เพื่อบันทึกอักขระสองสามตัวส่วนใหญ่เป็นเครื่องหมายอัฒภาค นี่คือเวอร์ชันที่มีช่องว่างเช่นกัน
FThompson

1
ลดลงไป 325 ไบต์โดยใช้แทน drawPolygon รุ่นช่องว่าง drawLine
FThompson

11

TeX / TikZ (60 - 80.25)

ไฟล์polygon.tex:

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

(80 ไบต์)

รัศมีและจำนวนของด้านที่มีให้เป็นตัวแปร / แมโครและ\r \nสามารถกำหนดหน่วย TeX ใด ๆ สำหรับรัศมี หากไม่มีหน่วยcmจะใช้หน่วยเริ่มต้น ตัวอย่าง:

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

(16 ไบต์โดยไม่มีค่า)

หากหมายเลขหน้าควรถูกระงับก็สามารถทำได้โดย

\footline{}

(11 ไบต์)

ตัวอย่างการสร้างไฟล์ PDF:

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

สามเหลี่ยม

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

รูปหลายเหลี่ยม

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

แปดเหลี่ยม

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

สิบสองเหลี่ยม

คะแนน:

ไม่ชัดเจนว่าต้องนับอะไร ช่วงสำหรับคะแนนจะเป็น:

  • รหัสฐานคือ 80 ไบต์ลบ 25% = 60

  • หรือรวมทั้งหมด (คำจำกัดความตัวแปรอินพุตไม่มีหมายเลขหน้า): (80 + 16 + 11) ลบ 25% = 80.25

  • หากการเชื่อมต่อระหว่างจุดแรกและจุดสุดท้ายไม่จำเป็นต้องราบรื่นคุณ--cycleสามารถลบออกได้ซึ่งจะช่วยประหยัด 7 ไบต์


8

Geogebra , 42 - 25% = 31.5 ไบต์

หากคุณนับเป็นตัวอักษรแทนที่จะเป็นไบต์นี่จะเป็น 41 - 25% = 30.75 ตัวอักษร

(นั่นคือถ้าคุณพิจารณา Geogebra ภาษา ... )

ถือว่ารัศมีจะถูกเก็บไว้ในตัวแปรและจำนวนของด้านข้างเก็บไว้ในตัวแปรrs

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

นี่ใช้ทฤษฎีโคไซน์c 2 = a 2 + b 2 - 2 ab cos Cเพื่อคำนวณความยาวด้านจากรัศมีที่กำหนด

เอาต์พุตตัวอย่างสำหรับs= 7, r= 5

ป้อนคำอธิบายรูปภาพที่นี่


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 คือรัศมีของวงกลม)

กรุณาเรียกใช้ใน terminal ANSI

แก้ไข:

  • รับข้อเสนอแนะของเอซ
  • ใช้ตัวแปรเก่า (หรือ #define) เป็นอินพุต
  • ใช้รัศมีวงเวียน
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);}

รวบรวม:

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

เมื่อคุณใช้ gcc คุณสามารถละเว้น#includes นอกจากนี้คุณสามารถประกาศvเป็นโลกภายนอกmainและประกาศuเป็นพารามิเตอร์จากmainนั้นคุณไม่จำเป็นต้องint(เช่นv;main(u){//...) ในที่สุดคุณสามารถเปลี่ยนการforวนซ้ำล่าสุดเป็นfor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205

5

C, 359 Chars

ความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ อย่างน้อยก็เต้นโซลูชั่น 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);}

ungolfed:

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);
}

และเป็นโปรแกรมเดียวที่ส่งออกรูปหลายเหลี่ยมใน ASCII แทนที่จะวาดมัน เนื่องจากสิ่งนี้และบางประเด็นการปัดเศษทศนิยมทำให้ผลลัพธ์ไม่ได้ดูสวยโดยเฉพาะ (ASCII Chars ไม่สูงเท่ากว้าง)

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

ครั้งแรกintสามารถลบออกได้เนื่องจากพวกเขาจะถือว่าเป็นintคอมไพเลอร์ นอกจากนี้ยังforสามารถเปลี่ยนลูปสุดท้ายเป็นfor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
user12205

อาจมีการเปลี่ยนแปลงไปif(i<0) if(i)ซึ่งยังคงต้องการเพียงการทำซ้ำครั้งเดียว แต่ไม่สามารถหาวิธีที่มีประสิทธิภาพเพื่อนำออกมา :(
Allbeert

4

Mathematica, 54 * 75% = 40.5

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

ฉันไม่คิดว่ามันจะมีประเด็นสำหรับเวอร์ชั่นที่ไม่ดี มันจะมีช่องว่างมากขึ้นเท่านั้น

คาดว่ารัศมีในตัวแปรและจำนวนของด้านในตัวแปรr nรัศมีมีความหมายเล็กน้อยโดยไม่แสดงแกนเนื่องจาก Mathematica ปรับขนาดภาพทั้งหมดให้พอดี

ตัวอย่างการใช้งาน:

ป้อนคำอธิบายรูปภาพที่นี่


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

@chyaong ah, 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>

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

บันทึก 4 ตัวอักษรโดยและi=S=5; for(;i-->0;)
Matt

@ แมทขอบคุณ! ฉันไม่รู้จักไวยากรณ์นี้และไม่สามารถหาข้อมูลเกี่ยวกับมันได้ มันเรียกว่าอย่างไร
sebcap26

@ sebcap26 คุณหมายถึงi-->0ส่วนนี้หรือไม่? i-- > 0มันเป็นเช่นเดียวกับ บางคนเรียกมันว่าโอเปอเรเตอร์
Arrow

ไม่ต้องกังวล :) อย่างที่ @ sebcap26 กล่าวว่ามันลดลงทุกครั้งที่ลูปจะประเมินสภาพ
แมตต์

ฉันคิดว่าคุณสามารถบันทึกการลบc=document.currentScript.parentNode;และแทนที่ตัวอักษรได้<canvas>โดย<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

ผ่านรัศมีจำนวนข้างและจุดศูนย์กลางบนบรรทัดคำสั่ง

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

หรือเติมลงในแหล่งที่มา

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

แปลไปที่ศูนย์ไต่ขึ้นไปยังรัศมีย้ายไปที่ (1,0); จากนั้นทำซ้ำ n ครั้ง: หมุนโดย 360 / n, ลากเส้นไปที่ (1,0); วาดเส้นสุดท้ายลากเส้นแล้วปล่อยหน้า


3

Sage , 44 - 25% = 33

สมมติว่าจำนวนข้างถูกเก็บไว้ในsตัวแปรและรัศมีถูกเก็บไว้ในrตัวแปร

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

ตัวอย่างผลลัพธ์:

s= 5, r= 3

ป้อนคำอธิบายรูปภาพที่นี่

s= 5, r= 6

ป้อนคำอธิบายรูปภาพที่นี่

s= 12, r= 5

ป้อนคำอธิบายรูปภาพที่นี่


การปรับขนาดของแกนกำลังทำให้เข้าใจผิด เป็นที่แน่นอน? (เช่นจุดแรกที่ (0,3) เมื่อรัศมี = 3, แทนที่จะเป็น (0,1))
บาดเจ็บทางดิจิตอล

1
@DigitalTrauma โปรแกรมของฉันสร้างรูปหลายเหลี่ยมปกติ "มาตรฐาน" จากนั้นขยายภาพด้วยตัวคูณสเกล เท่าที่ฉันรู้regular_polygonฟังก์ชั่นจะสร้างรูปหลายเหลี่ยมด้วยจุดยอดแรกที่ (0,1) การแก้ไขจะไม่แสดงแกนที่มี 7 ไบต์เพิ่มเติม ( ,axes=0หลังfigsize=r)
12205

3

bc + ImageMagick + xview + bash, 104.25 (139 ไบต์ - 25%)

ความท้าทายนี้จะไม่สมบูรณ์หากไม่มีคำตอบของ 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

ตัวอย่างเช่น./polygon.sh 8 100สร้างภาพนี้:

ป้อนคำอธิบายรูปภาพที่นี่


2

JavaScript 584 (867 ungolfed)

รหัสนี้ใช้ N Complex Roots of unity และแปลงมุมเป็น X, Y points จากนั้นต้นกำเนิดจะถูกย้ายไปที่กึ่งกลางผืนผ้าใบ

แข็งแรงเล่นกอล์ฟ

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

ตัวอย่างผลลัพธ์:

ผลผลิตใน Chrome

Ungolfed

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

รหัสนี้ต้องใช้องค์ประกอบผ้าใบ HTML5, c คือวัตถุผ้าใบ, r คือรัศมีและ n คือ # ของด้าน


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);

ถือว่าตัวแปรสองตัวที่กำหนดไว้ล่วงหน้า: $pจำนวนคะแนนและ$rรัศมีเป็นพิกเซล อีกวิธีหนึ่งสามารถเติมlist(,$r,$p)=$argv;และใช้อาร์กิวเมนต์บรรทัดคำสั่งแทน เอาต์พุตจะเป็น png ซึ่งควรถูกไพพ์ไปยังไฟล์


เอาท์พุต

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;


1

พื้นฐาน TI-80, 25 ไบต์ - 25% = 18.75

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

ถือว่าการตั้งค่าทั้งหมดถูกตั้งค่าเป็นค่าเริ่มต้น เรียกใช้โปรแกรมเช่น5:PRGM_POLYGON(สำหรับรูปห้าเหลี่ยม)

มันทำงานได้โดยการวาดวงกลมด้วยจำนวนก้าวที่น้อยมาก ตัวอย่างเช่นรูปห้าเหลี่ยมจะมีขั้นตอนของ2π / 5 เรเดียน

การตั้งค่าหน้าต่างที่ดีพอโดยค่าเริ่มต้นและTMINและTMAXมีการตั้งค่า0และดังนั้นสิ่งที่เราจำเป็นต้องเปลี่ยนเป็นTSTEP


1

SmileBASIC 3, 183 159 - 25% = 119.25 ไบต์

ยิงด้านข้างและรัศมีจากคำนวณและร้านค้าจุดแล้วจับพวกเขาโดยใช้INPUT ฉันรู้สึกว่าสิ่งนี้อาจสั้นกว่านี้ แต่มันก็เหมือนกับ 1 น. อะไรก็ตาม ถือว่าหน้าจอสะอาดและเป็นค่าเริ่มต้น env ดังนั้นคุณอาจต้องใช้เมื่อเรียกใช้จาก DIRECTGLINEACLS

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

ภาพหน้าจอ


1
ไบต์เป็นไบต์คุณไม่สามารถบอกได้ว่ามันเป็นเพียงครึ่งเดียว
12Me21

ลบกฎ 25%
Matthew Roh

1

OpenSCAD: 31 น้อยกว่า 25% = 23.25

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

โพสต์แรกที่นี่! ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่มันก็เป็นคำถามที่ดีพอ ๆ กับการเริ่มต้น p(n,r)เรียกใช้


ยินดีต้อนรับสู่เว็บไซต์!
ข้าวสาลีตัวช่วยสร้าง


0

C # ใน LINQPAD

เครดิตสำหรับส่วนคณิตศาสตร์ไปที่ Geobits (ฉันหวังว่าคุณจะไม่สนใจ!) พร้อมคำตอบ Java ฉันสิ้นหวังในวิชาคณิตศาสตร์ :)

ฉันทำสิ่งนี้ใน LINQPAD เนื่องจากมีหน้าต่างเอาต์พุตในตัว โดยพื้นฐานแล้วคุณสามารถลากและวางสิ่งต่อไปนี้ลงไปและมันจะวาดรูปหลายเหลี่ยม เพียงสลับไปที่ 'C # Program' และนำเข้า System.Drawing lib ลงในคุณสมบัติการสืบค้น

//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);
}

ป้อนคำอธิบายรูปภาพที่นี่


0

Matlab 58 ไบต์ - 25% = 43.5

เห็นโซลูชัน Matlab ไม่ได้ดังนั้นต่อไปนี้เป็นวิธีที่ตรงไปตรงมา:

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

คุณสามารถโกนไบต์บางส่วนได้ถ้าrและnอยู่ในพื้นที่ทำงานแล้ว

ตัวอย่างการโทร:

f(7,8)

7-gon ด้วยรัศมี 8


0

Python 2, 222 ไบต์

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)

ตรวจสอบว่าพิกเซลอยู่ที่ด้านในของไฮเปอร์เพลนทั้งหมด (เส้น) ของรูปหลายเหลี่ยม สัมผัสรัศมีเพราะจริงๆแล้วใช้ apothem

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


0

Mathematica 27 (= 36 - 25%)

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

เมื่อเราส่งรหัสเรามักจะลืมเกี่ยวกับฟังก์ชั่นใหม่ที่ได้รับการสร้างขึ้นให้เป็นภาษาที่มีการรวมเป็นก้อนคำศัพท์ภาษาปัจจุบัน Mathematica รอบ5000 หน้าที่หลัก คำศัพท์ภาษาที่มีขนาดใหญ่และขยายตัวมีประโยชน์มากสำหรับการเขียนโค้ดกอล์ฟ มีการแนะนำCirclePointsในรุ่นปัจจุบัน 11.X ตัวอย่างเฉพาะของรัศมี 7 ด้าน 5 คือ:

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณเพียงแค่ต้องป้อนพารามิเตอร์มุมเพื่อควบคุมการวางแนวของรูปหลายเหลี่ยมของคุณ:

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

ป้อนคำอธิบายรูปภาพที่นี่


0

Python 2, 74 ไบต์ - 25% = 55.5

r,nการป้อนข้อมูลที่อยู่ในตัวแปร หากรวมอยู่ในการนับจะมีr,n=input()ขนาด 12 ไบต์ขึ้นไป

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

ลองใช้ออนไลน์ - (ใช้รหัสอื่นเนื่องจากexecไม่ได้ใช้งานในล่ามออนไลน์)


0

SmileBASIC, 85 75 - 25% = 56.25 ไบต์

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

ตัวแปร S และ R ใช้สำหรับอินพุต

อธิบาย:

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

ด้านถูกวาดโดยใช้สี-Iซึ่งโดยปกติจะใกล้กับ -1 (& HFFFFFFFF สีขาว) (ยกเว้นเมื่อIเป็น 0 เมื่อโปร่งใส)

คุณยังสามารถวาดรูปหลายเหลี่ยมที่เติมได้โดยใช้GTRI N,M,X,Y,R,R,-IแทนGLINE...


0

ติค, 199 ไบต์

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

shapes.geometricการแก้ปัญหานี้ใช้ไลบรารี tikz

นี่คือสิ่งที่หลายเหลี่ยมที่มี5ด้านข้างและรัศมี8inดูเหมือนว่าเมื่อดูในEvince

รูปภาพหน้าที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.