Pemrograman bintang!

18

Tantangan

Tulis program atau fungsi yang mencetak bintang! Program akan menerima dua parameter dengan input standar: Ukuran bintang dan jumlah titik bintang. Bintang dapat memiliki ukuran antara 0 dan 10 dan memiliki 3, 4 atau 5 poin. Parameter input dipisahkan oleh koma, misalnya: 5,3berarti ukuran bintang 5 dengan 3 poin. Bintang-bintang disusun oleh tanda bintang*

Pertimbangkan program hanya akan menerima input yang valid.

Cetakan harus ditempatkan dengan benar agar kita dapat melihat bintang cantik di output!

Penjelasan parameter

Poin

Apakah jumlah senjata dihitung dari tanda bintang pusat?

Bintang 3 poin :

       *
       *
       *
     *   *
    *     *

Mereka tersusun oleh lengan vertikal dan dua lengan diagonal. Pemisahan antara lengan diagonal adalah2*size-1

Bintang 4 poin

   *     *
    *   *
      *
    *   *
   *     *

Mereka memiliki bentuk X dan disusun oleh dua garis diagonal. Pemisahan antara garis adalah2*(size-1)+1

5 poin bintang

     *
     *
 * * * * *
    * *
   *   *

Mereka disusun oleh garis vertikal dan garis horizontal. Setiap tanda bintang di garis horizontal dipisahkan oleh satu spasi. Mereka juga memiliki dua garis diagonal, dengan pemisahan di antara mereka sendiri2*(size-2)+1

Ukuran

Ukuran adalah jumlah tanda bintang yang memiliki setiap lengan bintang yang dihitung dari tanda bintang pusat (inklusif).

Ukuran 1 bintang disusun oleh tanda bintang tunggal

*

Contoh ukuran 2 bintang

3 poin

       *
       *
     *   *

Bintang 4 poin

    *   *
      *
    *   *

5 poin bintang

     *
   * * *
    * *

Anda memiliki contoh ukuran 3 bintang di penjelasan parameter Poin.

Kriteria menang

Kode terpendek menang. Kode harus diperiksa dengan parameter input berikut:3,2 3,3 4,2 4,3 5,2 5,3

Bonus

-25% karakter dihitung untuk membuat ukuran 6 menunjuk dengan kriteria yang dijelaskan sebelumnya (6 lengan dan ukurannya adalah jumlah tanda bintang yang dihitung dari tanda bintang pusat). Itu bisa berupa bentuk apa pun yang Anda inginkan sambil tetap menghormati spesifikasinya. Contoh bintang ukuran 6 dengan ukuran 3:

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

Bintang 6 poin harus diperiksa dengan input berikut 6,2 6,3.

Averroes
sumber
1
Dalam contoh pertama Anda dari bintang (5,3), haruskah kedua titik horizontal masing-masing menjadi satu tanda bintang lebih lama?
PhiNotPi
Ya itu. Tetap, Terima kasih!
Averroes
3
"Ya Tuhan ... Penuh bintang"
Drake Clarris
Itu seharusnya menjadi judul pertanyaan!
luser droog

Jawaban:

36

Mathematica 80 76 67 karakter

Beberapa orang akan mempertanyakan apakah ini seni ASCII, tetapi saya tidak tahan.

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

Penggunaan (mengatur ukuran font pada 24 untuk membuat bintang-bintang tampak besar.)

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

enam empat


Output untuk kasus-kasus berikut:

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

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

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

bintang berbingkai


Bagaimana itu bekerja

(A) Bintang pertama adalah pada asal ruang koordinat. Mari kita tampilkan.

(B) Setelah itu, kami akan menampilkan titik di {1,0}.

(c) Kemudian 5 poin sekaligus. Kami menerapkan fungsi murni ke setiap pasangan koordinat yang mengikutinya.

(d) Gunakan Cos dan Sin untuk menentukan koordinat

(e) Koordinat hanya berfungsi pada lingkaran unit; 6 adalah jumlah balok cahaya.

(f) Gambarlah jari-jari dari 0 hingga 4 unit.

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]

penjelasan

DavidC
sumber
+1 Sangat menarik! Bisakah Anda menjelaskan cara kerjanya?
Rob
1
Terima kasih atas penjelasannya, mulai masuk akal. Saya hanya berharap Mathematica tidak begitu "dikunci" dan kebanyakan untuk tujuan pendidikan. Apakah Anda memiliki sumber daya yang terhubung ke demo IDE Mathematica atau contoh di luar yang disediakan Wolfram?
Rob
Mathematica sangat terbuka dengan Format Dokumen yang Dapat Dihitung, yang memungkinkan distribusi applet gratis untuk tujuan pendidikan, non-komersial. Namun, kode sumber untuk Mathematica sebagian besar "dikunci". Adapun sumber daya, Anda mungkin ingin melihat http: /demonstrations.wolfram.com dan juga mathematica.stackexchange.com/questions/18/…
DavidC
7

Ruby, ASCII, 193 skor 142 (189 karakter - bonus 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

Uji secara online

Saya pikir itu memenuhi syarat untuk bonus bintang 6-ray.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   
defhlt
sumber
3

Mathematica , 65 64

Pandangan saya tentang metode David:

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

Menggunakan:

f @ {6,4}

masukkan deskripsi gambar di sini

Kesalahan dihasilkan karena penggunaan =bukan :=, dan itu bukan cara yang tepat untuk membuat definisi, tetapi itu berfungsi di sini.

Jika seseorang diizinkan menggunakan titik alih-alih tanda bintang, ini dapat ditulis (52 karakter):

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

f @ {6, 4}

masukkan deskripsi gambar di sini

Tuan Wisaya
sumber
Saya suka gagasan menggunakan lapisan fungsi murni.
DavidC
@ David Terima kasih. :-)
Mr.Wizard
@Averroes Anda harus menerima jawaban ini.
Buffer Over Baca
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__;
beginnerProg
sumber
5
Apa itu? Perl?
luser droog
7
Tidak bisa, saya belum pernah melihat kode perl yang lama sebelumnya
jamylak