Programowanie gwiazd!

18

Wyzwanie

Napisz program lub funkcję, która drukuje gwiazdki! Program otrzyma dwa parametry przez standardowe wejście: Rozmiar gwiazdy i liczbę punktów gwiazdy. Gwiazda może mieć dowolny rozmiar od 0 do 10 i mieć 3, 4 lub 5 punktów. Parametry wejściowe są oddzielone przecinkiem, na przykład: 5,3oznacza gwiazdkę o rozmiarze 5 z 3 punktami. Gwiazdy składają się z gwiazdek*

Weź pod uwagę, że program otrzyma tylko prawidłowe dane wejściowe.

Wydruki muszą być odpowiednio rozmieszczone, abyśmy mogli zobaczyć ładne gwiazdy na wydruku!

Objaśnienia parametrów

Zwrotnica

Jest liczbą ramion liczoną od centralnej gwiazdki.

3 punkty gwiazdek :

       *
       *
       *
     *   *
    *     *

Składają się z ramion pionowych i dwóch ramion ukośnych. Odstęp między ramionami ukośnymi wynosi2*size-1

4 punkty gwiazdek

   *     *
    *   *
      *
    *   *
   *     *

Mają postać X i składają się z dwóch ukośnych linii. Separacja między liniami jest2*(size-1)+1

5 punktów gwiazdek

     *
     *
 * * * * *
    * *
   *   *

Składają się z linii pionowej i linii poziomej. Każda gwiazdka w linii poziomej jest oddzielona jedną spacją. Mają też dwie ukośne linie, z odstępem między sobą2*(size-2)+1

Rozmiar

Rozmiar to liczba gwiazdek, które mają każde ramię gwiazdy licząc od centralnej gwiazdki (włącznie).

Gwiazdy o rozmiarze 1 składają się z jednej gwiazdki

*

Przykłady rozmiaru 2 gwiazdek

3 punkty

       *
       *
     *   *

4 punkty gwiazdek

    *   *
      *
    *   *

5 punktów gwiazdek

     *
   * * *
    * *

W opisie parametru Punkty masz przykłady gwiazd o rozmiarze 3.

Kryteria wygranej

Najkrótszy kod wygrywa. Kod należy sprawdzić przy użyciu następujących parametrów wejściowych:3,2 3,3 4,2 4,3 5,2 5,3

Premia

-25% znaków liczy się do utworzenia rozmiaru 6 wskazanego wcześniej kryteriami (6 ramion, a rozmiar to liczba gwiazdek liczona od centralnej gwiazdki). Może to być dowolna forma, zgodna ze specyfikacjami. Przykład gwiazdy o rozmiarze 6 i rozmiarze 3:

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

Gwiazdki 6 punktów należy sprawdzić przy pomocy następujących danych wejściowych 6,2 6,3.

Averroes
źródło
1
Czy w twoim pierwszym przykładzie gwiazdy (5,3) oba dwa poziome punkty powinny być o jedną gwiazdkę dłuższe?
PhiNotPi
Tak to jest. Naprawiono, dziękuję!
Averroes
3
„Mój Boże ... Jest pełen gwiazd”
Drake Clarris
To powinien być tytuł pytania!
luser droog

Odpowiedzi:

36

Mathematica 80 76 67 znaków

Niektórzy kwestionują, czy to sztuka ASCII, ale nie mogłem się oprzeć.

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

Zastosowanie (ustawienie rozmiaru czcionki na 24, aby gwiazdy wyglądały na duże).

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

sześć cztery


Dane wyjściowe dla następujących przypadków:

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

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

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

oprawione gwiazdy


Jak to działa

(a) Pierwsza gwiazda znajduje się na początku współrzędnej. Pokażmy to.

(b) Następnie wyświetlimy punkt w {1,0}.

(c) Następnie 5 punktów jednocześnie. Zastosowaliśmy czystą funkcję do każdej pary współrzędnych po niej.

(d) Użyj Cos i Sin, aby określić współrzędne

(e) Współrzędne działają tylko na okręgu jednostkowym; 6 to liczba wiązek światła.

(f) Narysuj promienie od 0 do 4 jednostek.

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]

wyjaśnienie

DavidC
źródło
+1 Bardzo interesujące! Czy możesz wyjaśnić, jak to działa?
Rob
1
Dziękuję za wyjaśnienie, zaczyna mieć więcej sensu. Chciałbym tylko, żeby Mathematica nie była tak „zamknięta” i głównie w celach edukacyjnych. Czy masz jakieś zasoby, które prowadzą do demo Mathematica IDE lub przykładów poza tymi, które zapewnia Wolfram?
Rob
Mathematica znacznie się otworzyła dzięki Computable Document Format, który pozwala na bezpłatną dystrybucję apletów do celów edukacyjnych, niekomercyjnych. Jednak kod źródłowy Mathematica jest w dużej mierze „zablokowany”. Jeśli chodzi o zasoby, możesz zajrzeć na http: /demonstrations.wolfram.com, a także mathematica.stackexchange.com/questions/18/…
DavidC
7

Ruby, ASCII, wynik 193 142 (189 znaków - 25% bonusu)

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

Przetestuj online

Myślę, że kwalifikuje się do premii za 6 promieni.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   
defhlt
źródło
3

Mathematica , 65 64

Moje podejście do metody Davida:

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

Posługiwać się:

f @ {6,4}

wprowadź opis zdjęcia tutaj

Błędy powstają z powodu użycia =zamiast :=, i nie jest to właściwy sposób na zdefiniowanie definicji, ale tutaj działa.

Gdyby wolno było używać kropek zamiast gwiazdek, można by to zapisać (52 znaki):

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

f @ {6, 4}

wprowadź opis zdjęcia tutaj

Mr.Wizard
źródło
Podoba mi się pomysł użycia warstw czystych funkcji.
DavidC,
@David Thanks. :-)
Mr.Wizard
@Averroes powinieneś zaakceptować tę odpowiedź.
Bufor
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__;
początkujący
źródło
5
Co to jest? Perl?
luser droog
7
Nie może być, nigdy wcześniej nie widziałem kodu perla
jamylak