ติดตั้งโปรแกรมดาว!


18

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่พิมพ์ดาว! โปรแกรมจะรับพารามิเตอร์สองตัวโดยอินพุตมาตรฐาน: ขนาดของดาวและจำนวนจุดของดาว ดาวสามารถมีขนาดใดก็ได้ระหว่าง 0 ถึง 10 และมี 3, 4 หรือ 5 คะแนน พารามิเตอร์อินพุตถูกคั่นด้วยเครื่องหมายจุลภาคตัวอย่างเช่น: 5,3หมายถึงขนาด 5 ดาวที่มี 3 คะแนน ดาวเหล่านี้ประกอบด้วยเครื่องหมายดอกจัน*

พิจารณาว่าโปรแกรมจะได้รับอินพุตที่ถูกต้องเท่านั้น

การพิมพ์จะต้องเว้นระยะห่างอย่างถูกต้องเพื่อให้เราสามารถมองเห็นดาวสวยในผลลัพธ์!

คำอธิบายพารามิเตอร์

จุด

คือจำนวนแขนที่นับจากเครื่องหมายดอกจันส่วนกลาง

3 คะแนนดาว :

       *
       *
       *
     *   *
    *     *

พวกมันประกอบไปด้วยแขนแนวตั้งและแขนสองเส้นทแยงมุม ระยะห่างระหว่างแขนในแนวทแยงคือ2*size-1

4 คะแนนดาว

   *     *
    *   *
      *
    *   *
   *     *

พวกเขามีรูปแบบของ X และประกอบด้วยสองเส้นทแยงมุม การแยกระหว่างเส้นคือ2*(size-1)+1

5 คะแนนดาว

     *
     *
 * * * * *
    * *
   *   *

พวกเขาประกอบด้วยเส้นแนวตั้งและเส้นแนวนอน เครื่องหมายดอกจันแต่ละอันในบรรทัดแนวนอนคั่นด้วยช่องว่างหนึ่งช่อง นอกจากนี้พวกเขายังมีเส้นทแยงมุมสองเส้นแยกจากกัน2*(size-2)+1

ขนาด

ขนาดคือจำนวนของเครื่องหมายดอกจันที่มีแต่ละแขนของดาวนับจากเครื่องหมายดอกจันกลาง (รวม)

ดาวขนาด 1 นั้นประกอบด้วยเครื่องหมายดอกจันเดี่ยว

*

ตัวอย่างดาวขนาด 2

3 คะแนน

       *
       *
     *   *

4 คะแนนดาว

    *   *
      *
    *   *

5 คะแนนดาว

     *
   * * *
    * *

คุณมีตัวอย่างขนาด 3 ดาวในคำอธิบายพารามิเตอร์ Points

เกณฑ์การชนะ

รหัสที่สั้นที่สุดชนะ ต้องตรวจสอบรหัสด้วยพารามิเตอร์อินพุตต่อไปนี้:3,2 3,3 4,2 4,3 5,2 5,3

โบนัส

ตัวอักษร -25% จะถูกนับสำหรับการสร้างขนาด 6 ที่ชี้ไปตามเกณฑ์ที่อธิบายไว้ก่อนหน้านี้ (6 แขนและขนาดคือจำนวนของเครื่องหมายดอกจันที่นับจากเครื่องหมายดอกจันส่วนกลาง) มันสามารถเป็นรูปแบบใด ๆ ที่คุณต้องการในขณะที่มันเคารพข้อกำหนด ตัวอย่างของดาวขนาด 6 ที่มีขนาด 3:

      *
      *
  * * * * *
    * * *
   *  *  *

6 6,2 6,3คะแนนดาวจะต้องตรวจสอบกับปัจจัยดังต่อไปนี้


1
ในตัวอย่างแรกของดาว (5,3) ของคุณจุดสองจุดในแนวนอนควรเป็นเครื่องหมายดอกจันอีกอันหนึ่งหรือไม่
PhiNotPi

ใช่แล้ว. แก้ไขขอบคุณ!
เฉลี่ย

3
"พระเจ้าของฉัน ... มันเต็มไปด้วยดวงดาว"
Drake Clarris

นั่นควรเป็นชื่อคำถาม!
luser droog

คำตอบ:


36

Mathematica 80 76 67 ตัวอักษร

บางคนถามว่านี่คือศิลปะ ASCII แต่ฉันไม่สามารถต้านทานได้

Graphics@Table[Text["*", r {Cos@t, Sin@t}], {t,0,2π,2π/#1}, {r,0,#2-1}]&

การใช้งาน (การตั้งค่าขนาดตัวอักษรที่ 24 เพื่อทำให้ดาวดูใหญ่ขึ้น)

Graphics@Table[Text["*"~Style~24, r {Cos@t, Sin@t}], {t,0,2π,2π/#1}, {r,0,#2-1}] &[6,4]

หกสี่


เอาต์พุตสำหรับกรณีต่อไปนี้:

{{3, 2}, {3, 3}, {4, 2}, {4, 3},

{5, 2}, {5, 3}, {6, 2}, {6, 3},

{7, 4}, {8, 3}, {9, 2}, {12, 4}}

ดาวกรอบ


มันทำงานอย่างไร

(a) ดาวดวงแรกอยู่ที่จุดกำเนิดของพื้นที่พิกัด มาแสดงกันเถอะ

(b) หลังจากนั้นเราจะแสดงจุดที่ {1,0}

(c) 5 คะแนนในครั้งเดียว เราใช้ฟังก์ชั่นแท้กับแต่ละคู่ของพิกัดที่ตามมา

(d) ใช้ Cos และ Sin เพื่อกำหนดพิกัด

(e) พิกัดทำงานเฉพาะกับหน่วยวงกลม 6 คือจำนวนลำแสง

(f) วาดรัศมีจาก 0 ถึง 4 หน่วย

options = Sequence[Axes -> True, ImageSize -> 225, BaseStyle -> 14];
a = Graphics[Text["*"~Style~{28, Blue}, {0, 0}], PlotLabel -> Style["a", 20], options];

b = Graphics[Text["*"~Style~{28, Blue}, {1, 0}], PlotLabel -> Style["b", 20], options];

c = Graphics[Text["*"~Style~{28, Blue}, {#1, #2}] & @@@ {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}}, PlotLabel -> Style["c", 20], options];

d = Graphics[Text["*"~Style~{28, Blue}, {Cos@#, Sin@#}] & /@ {0, \[Pi]/3, 2 \[Pi]/3, \[Pi], 4 \[Pi]/3, 5 \[Pi]/3}, PlotLabel -> Style["d", 20], options];

e = Graphics@Table[Text["*"~Style~24, {Cos@t, Sin@t}], {t, 0, 2 \[Pi],  2 \[Pi]/#1}] &[6];

f = Graphics@Table[Text["*"~Style~24, r {Cos@t, Sin@t}], {t, 0, 2 \[Pi], 2 \[Pi]/#1}, {r, 0, #2 - 1}] &[6, 4];

GraphicsGrid[{{a, b, c}, {d, e, f}}, Dividers -> All]

คำอธิบาย


+1 น่าสนใจมาก! คุณอธิบายได้ไหมว่ามันทำงานอย่างไร
Rob

1
ขอบคุณสำหรับคำอธิบายมันเริ่มมีเหตุผลมากขึ้นแล้ว ฉันแค่หวังว่า Mathematica ไม่ได้ "ถูกล็อค" และส่วนใหญ่ใช้เพื่อการศึกษา คุณมีทรัพยากรใด ๆ ที่เชื่อมโยงไปยัง Mathematica IDE หรือตัวอย่างนอกเหนือจากที่ Wolfram มีให้หรือไม่?
Rob

Mathematica เปิดขึ้นอย่างมากด้วยรูปแบบเอกสารที่คำนวณได้ซึ่งช่วยให้แจก applets ฟรีเพื่อวัตถุประสงค์ทางการศึกษาและไม่ใช่เชิงพาณิชย์ อย่างไรก็ตามซอร์สโค้ดของ Mathematica นั้นส่วนใหญ่จะ "ถูกล็อค" สำหรับทรัพยากรคุณอาจต้องการดู http: /demonstrations.wolfram.com และmathematica.stackexchange.com/questions/18/…
DavidC

7

Ruby, ASCII, 193คะแนน 142 (189 ตัวอักษร - โบนัส 25%)

def s r,d
f=->a,n{[n*Math.sin(a),n*Math.cos(a)]}
s=d*6
p=[]
s.times{|k|p<<" "*s}
c=s/2
p[c][c]=?*
r.times{|a|d.times{|l|x,y=f[6.28/r*a,d*l]
p[c+x.round][c+y.round]=?*}}
p.map{|j|puts j}
end

ทดสอบออนไลน์

ฉันคิดว่ามันมีคุณสมบัติเพียงพอสำหรับโบนัส 6 ดาว

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica , 65 64

วิธีการของฉันใน David:

f@p_=Graphics@Array[Text["*",{Cos@#,Sin@#}&[2π/p[[1]]#]#2]&,p,0]

ใช้:

f @ {6,4}

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

ข้อผิดพลาดเกิดขึ้นเนื่องจากการใช้งาน=มากกว่า:=และไม่ใช่วิธีที่เหมาะสมในการกำหนด แต่มันทำงานได้ที่นี่

หากได้รับอนุญาตให้ใช้จุดแทนเครื่องหมายดอกจันสิ่งนี้สามารถเขียนได้ (52 ตัวอักษร):

f@p_:=Most@ListPolarPlot@Array[{2π/p[[1]]#,#2}&,p,0]

f @ {6, 4}

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


ฉันชอบความคิดในการใช้เลเยอร์ของฟังก์ชั่นบริสุทธิ์
DavidC

@ David ขอบคุณ :-)
Mr.Wizard

@ เฉลี่ยคุณควรยอมรับคำตอบนี้
Buffer Over อ่าน

0
use subs qw /N W E S NW NE SE SW Circler Printer/;
($size,$points)=split(/\,/,$ARGV[0]);
my $arrsize = $size>$points ? $size : $points;
for $my (0...2*$arrsize-2) {
    $starArray[$my]=(); 
}
if($size == 3) {
    @armlist=('N','SW','SE');
}
elsif($size == 4) {
    @armlist=('NE','NW','SW','SE');
}
elsif($size == 5) {
    @armlist=('E','N','W','SW','SE');
}
elsif($size == 6) {
    @armlist=('E','N','W','SW','S','SE');
}
elsif($size == 7) {
    @armlist=('E','N','W','SW','S','SE','NE');
}
elsif($size == 8) {
    @armlist=('E','N','W','SW','S','SE','NE','NW');
}
Circler;
Printer;
sub Circler{
    for (@armlist) {
        &{$_};
    }
}
sub Printer{
    for $my1 (0...2*$arrsize-2) {
        for $my2 (0...2*$arrsize-2) {
            print "$starArray[$my1]->[$my2]"."\t"; 
        }
        print "\n\n";
    }
}
sub N {
    for $my (0...$points-1) {
        $starArray[$arrsize-1-$my]->[$arrsize-1]="*"; 
    }
}
sub E {
    for $my (0...$points-1) {
        $starArray[$arrsize-1]->[$arrsize-1+$my]="*"; 
    }
}
sub W {
    for $my (0...$points-1) {
        $starArray[$arrsize-1]->[$arrsize-1-$my]="*"; 
    }
}
sub S {
    for $my (0...$points-1) {
        $starArray[$arrsize-1+$my]->[$arrsize-1]="*"; 
    }
}
sub NW {
    for $my (0...$points-1) {
        $starArray[$arrsize-1-$my]->[$arrsize-1-$my]="*"; 
    }
}
sub NE {
    for $my (0...$points-1) {
        $starArray[$arrsize-1-$my]->[$arrsize-1+$my]="*"; 
    }
}
sub SE {
    for $my (0...$points-1) {
        $starArray[$arrsize-1+$my]->[$arrsize-1+$my]="*"; 
    }
}
sub SW {
    for $my (0...$points-1) {
        $starArray[$arrsize-1+$my]->[$arrsize-1-$my]="*"; 
    }
}
__END__;

5
นั่นคืออะไร? Perl?
luser droog

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