Programmazione a stelle!


18

La sfida

Scrivi un programma o una funzione che stampa le stelle! Il programma riceverà due parametri mediante input standard: dimensione della stella e numero di punti della stella. Una stella può avere qualsiasi dimensione compresa tra 0 e 10 e avere 3, 4 o 5 punti. I parametri di input sono separati da una virgola, ad esempio: 5,3indica una stella di dimensioni 5 con 3 punti. Le stelle sono composte da asterischi*

Considera che il programma riceverà solo input validi.

Le stampe devono essere spaziate correttamente in modo da poter vedere belle stelle nell'output!

Spiegazione dei parametri

Punti

È il numero di armi contate dall'asterisco centrale.

3 punti stelle :

       *
       *
       *
     *   *
    *     *

Sono composti da un braccio verticale e due bracci diagonali. La separazione tra le braccia diagonali è2*size-1

4 punti stelle

   *     *
    *   *
      *
    *   *
   *     *

Hanno la forma di una X e sono composte da due linee diagonali. La separazione tra le linee è2*(size-1)+1

5 punti stelle

     *
     *
 * * * * *
    * *
   *   *

Sono composti da una linea verticale e una linea orizzontale. Ogni asterisco nella linea orizzontale è separato da uno spazio. Inoltre hanno due linee diagonali, con una separazione tra di loro2*(size-2)+1

Taglia

La dimensione è il numero di asterischi che hanno ciascun braccio della stella contando dall'asterisco centrale (incluso).

Le stelle di taglia 1 sono composte da un singolo asterisco

*

Esempi di dimensioni 2 stelle

3 punti

       *
       *
     *   *

4 punti stelle

    *   *
      *
    *   *

5 punti stelle

     *
   * * *
    * *

Hai esempi della dimensione 3 stelle nella spiegazione del parametro Punti.

Criteri vincenti

Il codice più corto vince. Il codice deve essere verificato con i seguenti parametri di input:3,2 3,3 4,2 4,3 5,2 5,3

indennità

-25% i caratteri contano per la creazione di una dimensione 6 indicata con i criteri spiegati in precedenza (6 bracci e la dimensione è il numero di asterischi che contano dall'asterisco centrale). Può essere qualsiasi forma tu voglia mentre rispetta le specifiche. Un esempio di una stella di taglia 6 con taglia 3:

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

Le stelle a 6 punti devono essere controllate con i seguenti input 6,2 6,3.


1
Nel tuo primo esempio di stella (5,3), i due punti orizzontali dovrebbero avere ciascuno un asterisco più lungo?
PhiNotPi,

Sì. Risolto, grazie!
Averroè,

3
"Mio Dio ... è pieno di stelle"
Drake Clarris,

Questo dovrebbe essere il titolo della domanda!
Luser droog

Risposte:


36

Mathematica 80 76 67 caratteri

Qualcuno potrebbe chiedersi se questa è l'arte ASCII, ma non ho potuto resistere.

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

Utilizzo (impostando la dimensione del carattere su 24 per far apparire grandi le stelle).

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

sei quattro


Output per i seguenti casi:

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

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

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

stelle incorniciate


Come funziona

(a) La prima stella è all'origine di uno spazio di coordinate. Visualizziamolo.

(b) Successivamente, visualizzeremo un punto in {1,0}.

(c) Quindi 5 punti contemporaneamente. Abbiamo applicato una funzione pura su ogni coppia di coordinate che la segue.

(d) Usa Cos e Sin per determinare le coordinate

(e) Le coordinate funzionano solo sul cerchio unitario; 6 è il numero di raggi luminosi.

(f) Disegna raggi da 0 a 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]

spiegazione


+1 Molto interessante! Potresti spiegare come funziona?
Rob,

1
Grazie per la spiegazione, sta iniziando a dare più senso. Vorrei solo che Mathematica non fosse così "bloccata" e principalmente per scopi educativi. Avete delle risorse che si collegano a una demo IDE di Mathematica o esempi oltre a quelli forniti da Wolfram?
Rob

Mathematica si è aperta notevolmente con il suo formato di documento calcolabile, che consente la distribuzione gratuita di applet per scopi didattici e non commerciali. Il codice sorgente per Mathematica è in gran parte "bloccato", tuttavia. Per quanto riguarda le risorse, potresti voler consultare http: /demonstrations.wolfram.com e anche matematica.stackexchange.com/questions/18/…
DavidC

7

Rubino, ASCII, 193 punti 142 (189 caratteri - 25% di 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

Provalo online

Penso che si qualifichi per il bonus stella a 6 raggi.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica , 65 64

La mia opinione sul metodo di David:

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

Uso:

f @ {6,4}

inserisci qui la descrizione dell'immagine

Gli errori vengono generati a causa dell'utilizzo di =piuttosto che :=, e non è il modo corretto di fare una definizione, ma qui funziona.

Se fosse permesso usare punti anziché asterischi, questo potrebbe essere scritto (52 caratteri):

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

f @ {6, 4}

inserisci qui la descrizione dell'immagine


Mi piace l'idea di usare strati di funzioni pure.
DavidC

@ Grazie David. :-)
Mr.Wizard

@Averroes dovresti accettare questa risposta.
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
Cos'è quello? Perl?
Luser droog

7
Non posso essere, non ho mai visto il codice perl così tanto tempo prima
jamylak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.