Yıldız programlama!


18

Meydan okuma

Yıldızları basan bir program veya işlev yazın! Program, standart girdi ile iki parametre alacaktır: Yıldızın boyutu ve yıldızın nokta sayısı. Bir yıldız 0 ile 10 arasında herhangi bir boyutta olabilir ve 3, 4 veya 5 puana sahip olabilir. Giriş parametreleri bir virgülle ayrılır, örneğin: 5,33 noktalı bir 5 yıldız boyutu anlamına gelir. Yıldızlar yıldızlardan oluşur*

Programın yalnızca geçerli girişler alacağını düşünün.

Çıktıda güzel yıldızlar görebilmemiz için baskıların doğru aralıklarla yerleştirilmesi gerekir!

Parametre açıklamaları

makas

Merkezi yıldızdan sayan silah sayısıdır.

3 puan yıldız :

       *
       *
       *
     *   *
    *     *

Dikey bir kol ve iki çapraz koldan oluşurlar. Çapraz kollar arasındaki ayrım2*size-1

4 puan yıldız

   *     *
    *   *
      *
    *   *
   *     *

Bir X formuna sahiptirler ve iki çapraz çizgiden oluşurlar. Çizgiler arasındaki ayrım2*(size-1)+1

5 puan yıldız

     *
     *
 * * * * *
    * *
   *   *

Dikey bir çizgi ve yatay bir çizgiden oluşurlar. Yatay çizgideki her yıldız bir boşlukla ayrılır. Ayrıca, aralarında bir ayrım bulunan iki çapraz çizgi vardır.2*(size-2)+1

Boyut

Boyut, yıldızın her bir kolunun merkezi yıldız işaretinden (dahil) saydığı yıldızların sayısıdır.

Boyut 1 yıldız tek bir yıldız işaretinden oluşur

*

Boyut 2 yıldız örnekleri

3 puan

       *
       *
     *   *

4 puan yıldız

    *   *
      *
    *   *

5 puan yıldız

     *
   * * *
    * *

Points parametresi açıklamasında 3 yıldız boyutuyla ilgili örnekleriniz var.

Kazanma kriterleri

En kısa kod kazanır. Kodun aşağıdaki giriş parametreleriyle kontrol edilmesi gerekir:3,2 3,3 4,2 4,3 5,2 5,3

Bonus

% -25 karakter , daha önce açıklanan ölçütlere işaret eden 6 beden oluşturmak için sayılır (6 kol ve boyut, merkezi yıldızdan sayılan yıldız sayısıdır). Spesifikasyonlara uyurken istediğiniz herhangi bir form olabilir. 3 boyutlu 6 yıldızlı bir yıldız örneği:

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

6 puanlı yıldız aşağıdaki girişlerle kontrol edilmelidir 6,2 6,3.


1
İlk (5,3) yıldız örneğinizde, iki yatay noktanın birer yıldız daha uzun olması gerekir mi?
PhiNotPi

Evet öyle. Düzeltildi, teşekkürler!
Averroes

3
"Tanrım ...
Yıldızlarla

Soru başlığı bu olmalı!
luser droog

Yanıtlar:


36

Mathematica 80 76 67 karakter

Bazıları bunun ASCII sanatı olup olmadığını sorgulayacaktı, ama dayanamadım.

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

Kullanım (yıldızların büyük görünmesi için yazı tipi boyutunu 24 olarak ayarlamak.)

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

altı dört


Aşağıdaki durumlar için çıktı :

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

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

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

çerçeveli yıldızlar


Nasıl çalışır

(a) İlk yıldız bir koordinat boşluğunun kökenindedir. Gösterelim.

(b) Daha sonra {1,0} konumunda bir nokta görüntüleriz.

(c) Daha sonra aynı anda 5 puan. Her bir koordinat çiftine saf bir fonksiyon uyguladık.

(d) Koordinatları belirlemek için Cos ve Sin kullanın

(e) Koordinatlar yalnızca birim çember üzerinde çalışır; 6 ışık huzmesi sayısıdır.

(f) 0 ila 4 birim arası yarıçapları çizin.

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]

açıklama


+1 Çok ilginç! Bunun nasıl çalıştığını açıklayabilir misiniz?
Rob

1
Açıklama için teşekkürler, daha anlamlı olmaya başlıyor. Keşke Mathematica o kadar "kilitli" olmasaydı ve çoğunlukla eğitim amaçlıydı. Mathematica IDE demosuna veya Wolfram'ın sağladığı örneklerin ötesinde örneklere bağlantı veren kaynaklarınız var mı?
Rob

Mathematica, uygulamaların eğitim amaçlı, ticari olmayan amaçlarla ücretsiz dağıtılmasını sağlayan Hesaplanabilir Belge Biçimi ile önemli ölçüde açıldı. Ancak Mathematica'nın kaynak kodu büyük ölçüde "kilitlidir". Kaynaklara gelince, http bakmak isteyebilirsiniz: /demonstrations.wolfram.com ve ayrıca mathematica.stackexchange.com/questions/18/...
DavidC

7

Ruby, ASCII, 193 skor 142 (189 karakter -% 25 bonus)

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

Çevrimiçi test edin

Bence bu 6 ışınlı yıldız bonusu için uygun.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica , 65 64

David'in yöntemini benim almam:

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

kullanın:

f @ {6,4}

resim açıklamasını buraya girin

Hatalar =yerine kullanımı nedeniyle üretilir :=ve bir tanım yapmanın doğru yolu değildir, ancak burada işe yarar .

Yıldız işareti yerine nokta kullanılmasına izin verilirse, bu yazılabilir (52 karakter):

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

f @ {6, 4}

resim açıklamasını buraya girin


Saf fonksiyon katmanları kullanma fikrini seviyorum.
DavidC

@David Teşekkürler. :-)
Mr.Wizard

@Averroes bu yanıtı kabul etmelisiniz.
Tampon Üzerine

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
O nedir? Perl?
luser droog

7
Olamaz, perl kodunu daha önce hiç görmedim
jamylak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.