Sternprogrammierung!


18

Die Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die Sterne druckt! Das Programm erhält per Standardeingabe zwei Parameter: Größe des Sterns und Anzahl der Punkte des Sterns. Ein Stern kann eine beliebige Größe zwischen 0 und 10 haben und 3, 4 oder 5 Punkte haben. Die Eingabeparameter werden durch ein Komma getrennt, zum Beispiel: 5,3bedeutet ein Stern der Größe 5 mit 3 Punkten. Die Sterne bestehen aus Sternchen*

Beachten Sie, dass das Programm nur gültige Eingaben erhält.

Die Drucke müssen richtig verteilt sein, damit wir schöne Sterne in der Ausgabe sehen können!

Parameter Erklärungen

Punkte

Zählt die Anzahl der Arme vom zentralen Stern.

3 Punkte Sterne :

       *
       *
       *
     *   *
    *     *

Sie bestehen aus einem vertikalen Arm und zwei diagonalen Armen. Die Trennung zwischen diagonalen Armen ist2*size-1

4 Punkte Sterne

   *     *
    *   *
      *
    *   *
   *     *

Sie haben die Form eines X und bestehen aus zwei diagonalen Linien. Die Trennung zwischen Zeilen ist2*(size-1)+1

5 Punkte Sterne

     *
     *
 * * * * *
    * *
   *   *

Sie setzen sich aus einer vertikalen und einer horizontalen Linie zusammen. Jedes Sternchen in der horizontalen Linie ist durch ein Leerzeichen getrennt. Auch sie haben zwei diagonale Linien, mit einem Abstand zwischen sich2*(size-2)+1

Größe

Die Größe ist die Anzahl der Sternchen, bei der jeder Arm des Sterns vom mittleren Sternchen (einschließlich) aus gezählt wird.

Sterne der Größe 1 setzen sich aus einem Sternchen zusammen

*

Größe 2 Sterne Beispiele

3 Punkte

       *
       *
     *   *

4 Punkte Sterne

    *   *
      *
    *   *

5 Punkte Sterne

     *
   * * *
    * *

Beispiele für die Größe von 3 Sternen finden Sie in der Erläuterung der Punkte-Parameter.

Gewinnkriterien

Kürzester Code gewinnt. Code muss mit folgenden Eingabeparametern überprüft werden:3,2 3,3 4,2 4,3 5,2 5,3

Bonus

-25% Zeichen zählen für die Erstellung einer Größe 6, auf die mit den zuvor erläuterten Kriterien hingewiesen wurde (6 Arme und die Größe ist die Anzahl der Sternchen, die vom zentralen Sternchen aus gezählt werden). Es kann jede Form sein, die Sie möchten, während die Spezifikationen eingehalten werden. Ein Beispiel für einen Stern der Größe 6 mit der Größe 3:

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

6 Punkte Sterne müssen mit den folgenden Eingaben überprüft werden 6,2 6,3.


1
Sollten in Ihrem ersten Beispiel eines (5,3) Sterns die beiden horizontalen Punkte jeweils ein Sternchen länger sein?
PhiNotPi

Ja ist es. Behoben, danke!
Averroes

3
"Mein Gott ... Es ist voller Sterne"
Drake Clarris

Das sollte der Fragentitel sein!
Luser Droog

Antworten:


36

Mathematica 80 76 67 Zeichen

Einige würden sich fragen, ob dies ASCII-Kunst ist, aber ich konnte nicht widerstehen.

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

Verwendung (Setzen Sie die Schriftgröße auf 24, damit die Sterne groß erscheinen.)

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

sechs vier


Ausgabe für folgende Fälle:

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

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

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

gerahmte Sterne


Wie es funktioniert

(a) Der erste Stern befindet sich am Ursprung eines Koordinatenraums. Lassen Sie es uns anzeigen.

(b) Anschließend zeigen wir einen Punkt bei {1,0} an.

(c) Dann 5 Punkte auf einmal. Wir haben auf jedes darauf folgende Koordinatenpaar eine reine Funktion angewendet.

(d) Bestimmen Sie die Koordinaten mit Cos und Sin

(e) Koordinaten funktionieren nur auf Einheitskreisen; 6 ist die Anzahl der Lichtstrahlen.

(f) Zeichnen Sie Radien von 0 bis 4 Einheiten.

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]

Erläuterung


+1 Sehr interessant! Können Sie erklären, wie das funktioniert?
Rob

1
Vielen Dank für die Erklärung, es fängt an, mehr Sinn zu machen. Ich wünschte nur, Mathematica wäre nicht so "eingesperrt" und hauptsächlich für Bildungszwecke. Haben Sie Ressourcen, die auf eine Mathematica IDE-Demo verweisen, oder Beispiele, die über die von Wolfram bereitgestellten hinausgehen?
Rob

Mathematica hat sich mit seinem Computable Document Format erheblich geöffnet, das die kostenlose Verteilung von Applets für nichtkommerzielle Bildungszwecke ermöglicht. Der Quellcode für Mathematica ist jedoch weitgehend "gesperrt". Informationen zu Ressourcen finden Sie unter http: /demonstrations.wolfram.com und unter mathematica.stackexchange.com/questions/18/…
DavidC,

7

Ruby, ASCII, 193 Punkte 142 (189 Zeichen - 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

Testen Sie es online

Ich denke, es qualifiziert sich für den 6-Strahlen-Sternebonus.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica , 65 64

Meine Einstellung zu Davids Methode:

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

Verwenden:

f @ {6,4}

Bildbeschreibung hier eingeben

Fehler entstehen =eher durch die Verwendung von als :=, und es ist nicht der richtige Weg, eine Definition zu erstellen, aber es funktioniert hier.

Wenn man Punkte anstelle von Sternchen verwenden könnte, könnte dies geschrieben werden (52 Zeichen):

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

f @ {6, 4}

Bildbeschreibung hier eingeben


Ich mag die Idee, Schichten von reinen Funktionen zu verwenden.
DavidC

@ David Danke. :-)
Mr.Wizard

@Averroes Sie sollten diese Antwort akzeptieren.
Buffer Over Read

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
Was ist das? Perl?
Luser Droog

7
Kann nicht sein, ich habe noch nie zuvor einen Perl-Code gesehen
jamylak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.