Programação em estrela!


18

O desafio

Escreva um programa ou função que imprima estrelas! O programa receberá dois parâmetros por entrada padrão: tamanho da estrela e número de pontos da estrela. Uma estrela pode ter qualquer tamanho entre 0 e 10 e ter 3, 4 ou 5 pontos. Os parâmetros de entrada são separados por vírgula, por exemplo: 5,3significa uma estrela de tamanho 5 com 3 pontos. As estrelas são compostas por asteriscos*

Considere que o programa receberá apenas entradas válidas.

As impressões devem estar espaçadas corretamente para que possamos ver estrelas bonitas na saída!

Explicações dos parâmetros

Pontos

É o número de armas contadas no asterisco central.

3 pontos estrelas :

       *
       *
       *
     *   *
    *     *

Eles são compostos por um braço vertical e dois braços diagonais. A separação entre os braços diagonais é2*size-1

4 pontos estrelas

   *     *
    *   *
      *
    *   *
   *     *

Eles têm a forma de um X e são compostos por duas linhas diagonais. A separação entre linhas é2*(size-1)+1

5 pontos estrelas

     *
     *
 * * * * *
    * *
   *   *

Eles são compostos por uma linha vertical e uma linha horizontal. Cada asterisco na linha horizontal é separado por um espaço. Eles também têm duas linhas diagonais, com uma separação entre si de2*(size-2)+1

Tamanho

Tamanho é o número de asteriscos que têm cada braço da estrela contando a partir do asterisco central (inclusive).

Estrelas tamanho 1 são compostas por um único asterisco

*

Exemplos de tamanho 2 estrelas

3 pontos

       *
       *
     *   *

4 pontos estrelas

    *   *
      *
    *   *

5 pontos estrelas

     *
   * * *
    * *

Você tem exemplos do tamanho 3 estrelas na explicação do parâmetro Points.

Critérios de vitória

O menor código vence. O código deve ser verificado com os seguintes parâmetros de entrada:3,2 3,3 4,2 4,3 5,2 5,3

Bônus

-25% de caracteres contam para a criação de um tamanho 6 apontado com os critérios explicados anteriormente (6 braços e o tamanho é o número de asteriscos contados no asterisco central). Pode ser qualquer formato que você quiser, respeitando as especificações. Um exemplo de uma estrela de tamanho 6 com tamanho 3:

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

As estrelas de 6 pontos devem ser verificadas com as seguintes entradas 6,2 6,3.


1
No seu primeiro exemplo de uma estrela (5,3), os dois pontos horizontais devem ter um asterisco cada um?
PhiNotPi 28/08/2012

Sim, ele é. Corrigido, obrigado!
Averroes

3
"Meu Deus ... Está cheio de estrelas"
Drake Clarris em 29/08/12

Esse deve ser o título da pergunta!
Luser droog

Respostas:


36

Mathematica 80 76 67 caracteres

Alguns questionariam se isso é arte ASCII, mas não pude resistir.

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

Uso (definir o tamanho da fonte em 24 para fazer as estrelas parecerem grandes.)

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

seis quatro


Saída para os seguintes casos:

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

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

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

estrelas emolduradas


Como funciona

(a) A primeira estrela está na origem de um espaço de coordenadas. Vamos exibi-lo.

(b) Depois, mostraremos um ponto em {1,0}.

(c) Então 5 pontos de uma vez. Aplicamos uma função pura em cada par de coordenadas que a segue.

(d) Use Cos e Sin para determinar as coordenadas

(e) Coordenadas funcionam apenas no círculo unitário; 6 é o número de feixes de luz.

(f) Desenhe raios de 0 a 4 unidades.

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]

explicação


+1 Muito interessante! Você poderia explicar como isso funciona?
Rob

1
Obrigado pela explicação, está começando a fazer mais sentido. Eu só queria que o Mathematica não fosse tão "trancado" e principalmente para fins educacionais. Você tem algum recurso vinculado a uma demonstração do IDE do Mathematica ou exemplos além daqueles fornecidos pela Wolfram?
Rob

O Mathematica abriu bastante com o seu Computable Document Format, que permite a distribuição gratuita de applets para fins educacionais e não comerciais. O código fonte para o Mathematica é amplamente "bloqueado", no entanto. Quanto aos recursos, você pode consultar http: /demonstrations.wolfram.com e também mathematica.stackexchange.com/questions/18/…
DavidC

7

Ruby, ASCII, 193 pontos 142 (189 caracteres - bônus de 25%)

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

Teste on-line

Eu acho que se qualifica para o bônus de estrela de 6 raios.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica , 65 64

Minha opinião sobre o método de David:

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

Usar:

f @ {6,4}

insira a descrição da imagem aqui

Os erros são produzidos por causa do uso de =e não :=, e não é a maneira correta de fazer uma definição, mas funciona aqui.

Se alguém pudesse usar pontos em vez de asteriscos, isso poderia ser escrito (52 caracteres):

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

f @ {6, 4}

insira a descrição da imagem aqui


Eu gosto da ideia de usar camadas de funções puras.
21413

@ David Obrigado. :-)
Mr.Wizard

@Averroes, você deve aceitar esta resposta.
Buffer Over Leia

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 que é isso? Perl?
Luser droog

7
Não pode ser, eu nunca vi perl código que muito antes
jamylak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.