Programmation vedette!

18

Le défi

Écrivez un programme ou une fonction qui imprime des étoiles! Le programme recevra deux paramètres par entrée standard: la taille de l'étoile et le nombre de points de l'étoile. Une étoile peut avoir n'importe quelle taille entre 0 et 10 et avoir 3, 4 ou 5 points. Les paramètres d'entrée sont séparés par une virgule, par exemple: 5,3signifie une étoile de taille 5 avec 3 points. Les étoiles sont composées d'astérisques*

Considérez que le programme ne recevra que des entrées valides.

Les impressions doivent être correctement espacées afin que nous puissions voir de jolies étoiles dans la sortie!

Explications des paramètres

Points

Est le nombre d'armes comptées à partir de l'astérisque central.

3 points étoiles :

       *
       *
       *
     *   *
    *     *

Ils sont composés d'un bras vertical et de deux bras diagonaux. La séparation entre les bras diagonaux est2*size-1

4 points étoiles

   *     *
    *   *
      *
    *   *
   *     *

Ils ont la forme d'un X et sont composés de deux lignes diagonales. La séparation entre les lignes est2*(size-1)+1

5 points étoiles

     *
     *
 * * * * *
    * *
   *   *

Ils sont composés d'une ligne verticale et d'une ligne horizontale. Chaque astérisque sur la ligne horizontale est séparé par un espace. Ils ont aussi deux lignes diagonales, avec une séparation entre eux de2*(size-2)+1

Taille

La taille est le nombre d'astérisques dont chaque bras de l'étoile compte à partir de l'astérisque central (inclus).

Les étoiles de taille 1 sont composées d'un seul astérisque

*

Exemples de taille 2 étoiles

3 points

       *
       *
     *   *

4 points étoiles

    *   *
      *
    *   *

5 points étoiles

     *
   * * *
    * *

Vous avez des exemples de la taille 3 étoiles dans l'explication du paramètre Points.

Critères gagnants

Le code le plus court gagne. Le code doit être vérifié avec les paramètres d'entrée suivants:3,2 3,3 4,2 4,3 5,2 5,3

Prime

-25% de caractères comptent pour créer une taille 6 pointée avec les critères expliqués précédemment (6 bras et la taille est le nombre d'astérisques à compter de l'astérisque central). Il peut s'agir de n'importe quelle forme souhaitée tout en respectant les spécifications. Un exemple d'une étoile de taille 6 avec une taille 3:

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

Les étoiles à 6 points doivent être vérifiées avec les entrées suivantes 6,2 6,3.

Averroes
la source
1
Dans votre premier exemple d'étoile (5,3), les deux points horizontaux devraient-ils être chacun un astérisque plus long?
PhiNotPi
Oui, ça l'est. Fixé, merci!
Averroes
3
"Mon Dieu ... c'est plein d'étoiles"
Drake Clarris
Ça devrait être le titre de la question!
luser droog

Réponses:

36

Mathematica 80 76 67 caractères

Certains se demandent si c'est de l'art ASCII, mais je n'ai pas pu résister.

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

Utilisation (en définissant la taille de police à 24 pour que les étoiles paraissent grandes.)

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

six quatre


Sortie pour les cas suivants:

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

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

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

étoiles encadrées


Comment ça fonctionne

(a) La première étoile est à l'origine d'un espace de coordonnées. Affichons-le.

(b) Ensuite, nous afficherons un point à {1,0}.

(c) Puis 5 points à la fois. Nous avons appliqué une fonction pure sur chaque paire de coordonnées qui la suit.

(d) Utiliser Cos et Sin pour déterminer les coordonnées

(e) Les coordonnées fonctionnent uniquement sur le cercle unitaire; 6 est le nombre de faisceaux lumineux.

(f) Tracer des rayons de 0 à 4 unités.

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]

explication

DavidC
la source
+1 Très intéressant! Pourriez-vous expliquer comment cela fonctionne?
Rob
1
Merci pour l'explication, ça commence à avoir plus de sens. Je souhaite juste que Mathematica ne soit pas aussi "enfermé" et surtout à des fins éducatives. Avez-vous des ressources liées à une démonstration de Mathematica IDE ou à des exemples autres que ceux fournis par Wolfram?
Rob
Mathematica s'est considérablement ouvert avec son format de document calculable, qui permet la distribution gratuite d'applets à des fins éducatives et non commerciales. Cependant, le code source de Mathematica est largement "verrouillé". En ce qui concerne les ressources, vous voudrez peut-être consulter http: /demonstrations.wolfram.com ainsi que mathematica.stackexchange.com/questions/18/…
DavidC
7

Rubis, ASCII, 193 score 142 (189 caractères - 25% de 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

Testez-le en ligne

Je pense qu'il se qualifie pour le bonus étoile à 6 rayons.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   
defhlt
la source
3

Mathematica , 65 64

Mon point de vue sur la méthode de David:

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

Utilisation:

f @ {6,4}

entrez la description de l'image ici

Des erreurs sont produites en raison de l'utilisation de =plutôt que :=, et ce n'est pas la bonne façon de faire une définition, mais cela fonctionne ici.

Si l'on était autorisé à utiliser des points au lieu d'astérisques, cela pourrait être écrit (52 caractères):

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

f @ {6, 4}

entrez la description de l'image ici

Mr.Wizard
la source
J'aime l'idée d'utiliser des couches de fonctions pures.
DavidC
@David Merci. :-)
Mr.Wizard
@Averroes, vous devez accepter cette réponse.
Mémoire tampon
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__;
débutantProg
la source
5
Qu'est-ce que c'est? Perl?
luser droog
7
Impossible, je n'ai jamais vu de code Perl aussi longtemps auparavant
Jamylak