วาด Pentaflake


25

ก่อนอื่น ... ฉันอยากจะขอให้ทุกคนมีความสุขในวันคริสต์มาส (ขออภัยถ้าฉันมาช้าไปหนึ่งวันสำหรับเขตเวลาของคุณ)

เพื่อเป็นการเฉลิมฉลองโอกาสที่เราจะวาดเกล็ดหิมะ เพราะปีนี้เป็น 201 5และคริสมาสต์อยู่บน 2 5วัน (สำหรับส่วนใหญ่ของคน) เราจะวาดPentaเกล็ด Pentaflake เป็นเศษส่วนที่เรียบง่ายประกอบด้วยรูปห้าเหลี่ยม นี่คือตัวอย่างเล็ก ๆ น้อย ๆ(นำมาจากที่นี่) :ป้อนคำอธิบายรูปภาพที่นี่

Pentaflake แต่ละอันมีคำสั่ง n Pentaflake ของคำสั่ง 0 เป็นเพียงรูปห้าเหลี่ยม สำหรับคำสั่งอื่นทั้งหมด n, Pentaflake ประกอบด้วย 5 Pentaflakes ของคำสั่งก่อนหน้าซึ่งจัดขึ้นรอบที่ 6 Pentaflake ของคำสั่งก่อนหน้า ตัวอย่างเช่น Pentaflake ของคำสั่งที่ 1 ประกอบด้วย 5 รูปห้าเหลี่ยมที่จัดเรียงรอบรูปห้าเหลี่ยมกลาง

อินพุต

nการสั่งซื้อ สิ่งนี้อาจได้รับในลักษณะใด ๆ ยกเว้นของตัวแปรที่กำหนดไว้ล่วงหน้า

เอาท์พุต

รูปภาพของคำสั่งnPentaflake ต้องมีความกว้างอย่างน้อย 100px และยาว 100px มันอาจถูกบันทึกลงในไฟล์แสดงให้ผู้ใช้หรือเอาท์พุSTDOUTท ไม่อนุญาตให้ใช้เอาต์พุตรูปแบบอื่น รูปแบบภาพทั้งหมดที่มีอยู่ก่อนได้รับอนุญาตความท้าทายนี้

การชนะ

ในฐานะ codegolf บุคคลที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


3
-1 เพราะเกล็ดหิมะมีสมมาตร 6 เท่าเท่านั้น! = D
ข้อผิดพลาด

@ flawr ตามบทความนี้เพียงประมาณ 0.1% ของเกล็ดหิมะจริง ๆ มีสมมาตร 6 เท่า ... หรือสมมาตรใด ๆ เลย อย่างไรก็ตามเกล็ดหิมะที่มีความสมมาตรสามารถมีความสมมาตร 3 เท่านอกเหนือจากความสมมาตร 6 เท่า: P
TheNumberOne

4
บทความนี้ศึกษาวิธีการน้อยกว่า. 1% ของเกล็ดหิมะทั้งหมดและมันก็ไร้ความหมายเพราะพวกเขาศึกษาเกล็ดหิมะแบบอเมริกันเท่านั้น ฉันพนันว่าเกล็ดหิมะมีความสมมาตรมากกว่ากัน! (PS: ภาพสวย ๆเกล็ดหิมะ # 167 น่าสนใจเป็นพิเศษ!) (ฉันเพิ่งสังเกตเห็นว่าเกล็ดหิมะต้องมีสัดส่วน 10 เท่า)
ข้อบกพร่อง

1
มันจะไม่เป็นไรตราบใดที่เอาต์พุตโดยใช้หนึ่งในวิธีการข้างต้น อย่างไรก็ตามnไม่สามารถกำหนดไว้ล่วงหน้าในไฟล์สคริปต์ของคุณ คุณสามารถอ่านnจากSTDINพร้อมท์จากผู้ใช้รับเป็นอาร์กิวเมนต์บรรทัดฟังก์ชั่น / คอมม่า ... โดยทั่วไปสิ่งที่คุณต้องการยกเว้นการฝังโดยตรงในรหัสของคุณ
TheNumberOne

1
ไม่ต้องการ +1 สิ่งนี้เพราะมันมี 25 :(
The_Basset_Hound

คำตอบ:


14

Matlab, 226

function P(M);function c(L,X,Y,O);hold on;F=.5+5^.5/2;a=2*pi*(1:5)/5;b=a(1)/2;C=F^(2*L);x=cos(a+O*b)/C;y=sin(a+O*b)/C;if L<M;c(L+1,X,Y,~O);for k=1:5;c(L+1,X+x(k),Y+y(k),O);end;else;fill(X+x*F, Y+y*F,'k');end;end;c(0,0,0,0);end

Ungolfed:

function P(M);                
function c(L,X,Y,O);          %recursive function
hold on;
F=.5+5^.5/2;                  %golden ratio
a=2*pi*(1:5)/5;               %full circle divided in 5 parts (angles)
b=a(1)/2;
C=F^(2*L);
x=cos(a+O*b)/C;               %calculate the relative position ofnext iteration
y=sin(a+O*b)/C;
if L<M;                       %current recursion (L) < Maximum (M)? recurse
    c(L+1,X,Y,~O);            %call recursion for inner pentagon
    for k=1:5;
        c(L+1,X+x(k),Y+y(k),O)%call recursion for the outer pentagons
    end; 
else;                         %draw
    fill(X+x*F, Y+y*F,'k');  
end;
end;
c(0,0,0,0);
end

การทำซ้ำครั้งที่ห้า (ใช้เวลาค่อนข้างนานในการเรนเดอร์)

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

การเปลี่ยนแปลงเล็กน้อยของรหัส (น่าเสียดายมากขึ้นไบต์) ผลลัพธ์ในความงามนี้ =)

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

โอ้และอีกคนหนึ่ง:

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


ขอบคุณที่ชี้ให้ฉันเห็นความท้าทายนี้ฉันไปและเพิ่มโซลูชันอื่นหวังว่าคุณจะไม่สนใจ;) ฉันปลอดภัยจากการนับจำนวนไบต์ของคุณแล้วฉันเพิ่งพบว่ามันน่าสนใจเกินไปที่จะพลาด
Andras Deak

7

Mathematica, 200 ไบต์

a=RotationTransform
b=Range
r@k_:={Re[t=I^(4k/5)],Im@t}
R@k_:=a[Pi,(r@k+r[k+1])/2]
Graphics@Nest[GeometricTransformation[#,ScalingTransform[{1,1}(Sqrt@5-3)/2]@*#&/@Append[R/@b@5,a@0]]&,Polygon[r/@b@5],#]&

nบรรทัดสุดท้ายคือฟังก์ชั่นที่สามารถนำไปใช้กับจำนวนเต็ม

ชื่อฟังก์ชัน Mathematica มีความยาว ใครบางคนควรเข้ารหัสเอนโทรปีและสร้างภาษาใหม่จากมัน :)

เมื่อนำไปใช้กับ1:

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

เมื่อนำไปใช้กับ2:

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


6

MATLAB, 235 233 217 ไบต์

อัปเดต:คำแนะนำมากมายจาก@flawrช่วยให้ฉันเสีย 16 ไบต์ เนื่องจากมีเพียงสิ่งนี้อนุญาตให้ฉันเอาชนะวิธีแก้ปัญหาของข้อบกพร่องและฉันจะไม่ได้พบกับความท้าทายโดยปราศจากความช่วยเหลือจากข้อบกพร่องในตอนแรกพิจารณาข้อเสนอร่วมกันโดยเรา :)

N=input('');f=2*pi/5;c=1.5+5^.5/2;g=0:f:6;p=[cos(g);sin(g)];R=[p(:,2),[-p(2,2);p(1,2)]];for n=1:N,t=p;q=[];for l=0:4,q=[q R^l*[c-1+t(1,:);t(2,:)]/c];end,p=[q -t/c];end,p=reshape(p',5,[],2);fill(p(:,:,1),p(:,:,2),'k');

นี่เป็นอีกวิธีการแก้ปัญหา MATLAB นี้ขึ้นอยู่กับปรัชญาของระบบฟังก์ชั่นซ้ำแล้วซ้ำอีก ฉันส่วนใหญ่สนใจในการพัฒนาอัลกอริทึมและฉันไม่ได้ตีกอล์ฟมากเกินไปในการแก้ปัญหา มีที่ว่างสำหรับการปรับปรุงอย่างแน่นอน (ฉันไตร่ตรองโดยใช้การประมาณจุดตายตัวแบบตายตัวสำหรับcแต่นั่นไม่ดีเลย)

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

N=input('');                                % read order from stdin

f=2*pi/5;                                   % angle of 5-fold rotation
c=1.5+5^.5/2;                               % scaling factor for contraction

g=0:f:6;
p=[cos(g);sin(g)];                          % starting pentagon, outer radius 1
R=[p(:,2),[-p(2,2);p(1,2)]];                % 2d rotation matrix with angle f

for n=1:N,                                  % iterate the points
    t=p;
    q=[];
    for l=0:4,
       q=[q R^l*[c-1+t(1,:);t(2,:)]/c];     % add contracted-rotated points
    end,
    p=[q -t/c];                             % add contracted middle block
end,

p=reshape(p',5,[],2);                 % reshape to 5x[]x2 matrix to separate pentagons
fill(p(:,:,1),p(:,:,2),'k');          % plot pentagons

ผลลัพธ์สำหรับN=5(ด้วยaxis equal offความน่ารักที่ตามมาแต่ฉันหวังว่าจะไม่นับไบต์):

N = 5 pentaflake


1
ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์โดยใช้R=[p(:,2),[-p(2,2);p(1,2)]];(และกำจัดก่อนหน้านี้R,C,S) และคุณสามารถใช้q=[q R^l*[c-1+t(1,:);t(2,:)]/c]และฉันคิดว่าc=1.5+5^.5/2;
ข้อบกพร่อง

@ flawr เห็นได้ชัดว่าคุณพูดถูก :) 1 ขอบคุณสำหรับเมทริกซ์การหมุน, 2 ขอบคุณสำหรับใหม่qฉันยังมีวงเล็บที่ไม่มีความจำเป็น ... 3. ขอบคุณ แต่เวทมนตร์นี้คืออะไร ??: D 4. เนื่องจากวิธีการแก้ปัญหานี้สั้นกว่าต้นฉบับของคุณฉันคิดว่านี่เป็นส่วนหนึ่งของการส่งของคุณเช่นกัน
Andras Deak

6

Mathematica, 124 ไบต์

Mathematica รองรับไวยากรณ์ใหม่Tableตั้งแต่รุ่น 10: Table[expr, n]ซึ่งบันทึกไบต์อื่น เทียบเท่ากับTable[expr, n]Table[expr, {n}]

f@n_:=(p=E^Array[π.4I#&,5];Graphics@Map[Polygon,ReIm@Fold[{g,s}~Function~Join[.62(.62g#+#&/@s),{-.39g}],p,p~Table~n],{-3}])

หลักของฟังก์ชั่นนี้จะใช้ตัวเลขที่ซับซ้อนในการทำ tranformations ReImแล้วแปลงให้คะแนนโดย

กรณีทดสอบ:

f[4]

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


1
πใช้สองไบต์ใน UTF-8 ดังนั้นคุณจึงออกมาเป็น 125 ไบต์
2012rcampion

OMFG นี่คืออะไร
DumpsterDoofus

3

Mathematica, 199 196 ไบต์

พูดถึงคำตอบของ Peter Richter ด้วยผมนี่เป็นหนึ่งในตัวฉันเอง มันเน้นการใช้งานกราฟิกอย่างมากและใช้คณิตศาสตร์และ FP น้อยลง CirclePoints builtin เป็นใหม่ใน 10.1

c=CirclePoints;g=GeometricTransformation;
p@0=Polygon@c[{1,0},5];
p@n_:=GraphicsGroup@{
        p[n-1],
        g[
          p[n-1]~g~RotationTransform[Pi/5],
          TranslationTransform/@{GoldenRatio^(2n-1),n*Pi/5}~c~5
        ]
      };
f=Graphics@*p

แก้ไข: ขอบคุณ DumpsterDoofus สำหรับ GoldenRatio


คุณสามารถบันทึก 3 ไบต์โดยการแทนที่ด้วย((1+Sqrt@5)/2) GoldenRatioนอกจากนี้ในบรรทัดที่สองผมคิดว่ามันควรจะเป็นแทนp@0=Polygon@c[{1,0},5]; p@0=Polygon@cp[{1,0},5];(BTW ฉันจริง ๆ ปีเตอร์ฉันมีสองโปรไฟล์ lol)
DumpsterDoofus

ใช่ โทรดีมาก ฉันเห็นตัวพิมพ์ผิดด้วย แต่ลืมที่จะแก้ไข D'oh,
hYPotenuser

2

Mathematica, 130 ไบต์

r=Exp[Pi.4I Range@5]
p=1/GoldenRatio
f@0={r}
f@n_:=Join@@Outer[1##&,r,p(f[n-1]p+1),1]~Join~{-f[n-1]p^2}
Graphics@*Polygon@*ReIm@*f

ฉันใช้เทคนิคที่คล้ายกันกับคำตอบของ njpipeorgan (อันที่จริงฉันขโมย2Pi I/5 == Pi.4Iเล่ห์เหลี่ยมของเขา) แต่นำไปใช้เป็นฟังก์ชั่นวนซ้ำ

ตัวอย่างการใช้งาน (ใช้%เพื่อเข้าถึงฟังก์ชั่นที่ไม่ระบุชื่อที่เป็นผลลัพธ์ในบรรทัดสุดท้าย):

 %[5]

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

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