Programación en estrella!

18

El reto

¡Escriba un programa o función que imprima estrellas! El programa recibirá dos parámetros por entrada estándar: tamaño de la estrella y número de puntos de la estrella. Una estrella puede tener cualquier tamaño entre 0 y 10 y tener 3, 4 o 5 puntos. Los parámetros de entrada están separados por una coma, por ejemplo: 5,3significa un tamaño de 5 estrellas con 3 puntos. Las estrellas están compuestas por asteriscos.*

Considere que el programa solo recibirá entradas válidas.

¡Las impresiones deben estar correctamente espaciadas para que podamos ver bonitas estrellas en la salida!

Explicaciones de los parámetros

Puntos

Es el número de brazos contando desde el asterisco central.

Estrellas de 3 puntos :

       *
       *
       *
     *   *
    *     *

Están compuestos por brazos verticales y dos brazos diagonales. La separación entre brazos diagonales es2*size-1

Estrellas de 4 puntos

   *     *
    *   *
      *
    *   *
   *     *

Tienen la forma de una X y se componen de dos líneas diagonales. La separación entre líneas es2*(size-1)+1

5 puntos estrellas

     *
     *
 * * * * *
    * *
   *   *

Están compuestos por una línea vertical y una línea horizontal. Cada asterisco en la línea horizontal está separado por un espacio. También tienen dos líneas diagonales, con una separación entre sí de2*(size-2)+1

Talla

El tamaño es el número de asteriscos que tiene cada brazo de la estrella contando desde el asterisco central (inclusive).

Las estrellas de tamaño 1 están compuestas por un solo asterisco

*

Tamaño 2 estrellas ejemplos

3 puntos

       *
       *
     *   *

Estrellas de 4 puntos

    *   *
      *
    *   *

5 puntos estrellas

     *
   * * *
    * *

Tienes ejemplos del tamaño 3 estrellas en la explicación del parámetro Puntos.

Criterios ganadores

El código más corto gana. El código debe verificarse con los siguientes parámetros de entrada:3,2 3,3 4,2 4,3 5,2 5,3

Prima

-25% de caracteres cuentan para crear un tamaño de 6 puntos con los criterios explicados anteriormente (6 brazos y el tamaño es el número de asteriscos contando desde el asterisco central). Puede ser cualquier forma que desee mientras respeta las especificaciones. Un ejemplo de una estrella de talla 6 con talla 3:

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

Las estrellas de 6 puntos deben verificarse con las siguientes entradas 6,2 6,3.

Averroes
fuente
1
En su primer ejemplo de una estrella (5,3), ¿deberían los dos puntos horizontales ser un asterisco cada uno más?
PhiNotPi
Sí lo es. Fijo, gracias!
Averroes
3
"Dios mío ... está lleno de estrellas"
Drake Clarris
¡Ese debería ser el título de la pregunta!
luser droog

Respuestas:

36

Mathematica 80 76 67 caracteres

Algunos cuestionarían si esto es arte ASCII, pero no pude resistirme.

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

Uso (establecer el tamaño de fuente en 24 para que las estrellas parezcan grandes).

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

seis cuatro


Salida para los siguientes 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}}

estrellas enmarcadas


Cómo funciona

(a) La primera estrella está en el origen de un espacio de coordenadas. Vamos a mostrarlo.

(b) Después, mostraremos un punto en {1,0}.

(c) Luego 5 puntos a la vez. Aplicamos una función pura en cada par de coordenadas que le siguen.

(d) Use Cos y Sin para determinar las coordenadas

(e) Coordina el trabajo solo en el círculo unitario; 6 es el número de haces de luz.

(f) Dibuje radios 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]

explicación

DavidC
fuente
+1 Muy interesante! ¿Podría explicar cómo funciona esto?
Rob
1
Gracias por la explicación, está empezando a tener más sentido. Solo desearía que Mathematica no estuviera tan "bloqueado" y principalmente con fines educativos. ¿Tiene algún recurso que se vincule a una demostración de Mathematica IDE o ejemplos más allá de los que proporciona Wolfram?
Rob
Mathematica se abrió considerablemente con su formato de documento computable, que permite la distribución gratuita de applets con fines educativos y no comerciales. Sin embargo, el código fuente de Mathematica está en gran parte "bloqueado". En cuanto a los recursos, es posible que desee ver en http: /demonstrations.wolfram.com y también mathematica.stackexchange.com/questions/18/...
davidc
7

Rubí, ASCII, 193 puntaje 142 (189 caracteres - 25% de bonificación)

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

Pruébelo en línea

Creo que califica para el bono de estrella de 6 rayos.

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   
defhlt
fuente
3

Mathematica , 65 64

Mi opinión sobre el método de David:

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

Utilizar:

f @ {6,4}

ingrese la descripción de la imagen aquí

Los errores se producen por el uso de, en =lugar de :=, y no es la forma correcta de hacer una definición, pero funciona aquí.

Si a uno se le permitiera usar puntos en lugar de asteriscos, esto podría escribirse (52 caracteres):

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

f @ {6, 4}

ingrese la descripción de la imagen aquí

Señor mago
fuente
Me gusta la idea de usar capas de funciones puras.
DavidC
@David Gracias. :-)
Mr.Wizard
@Averroes deberías aceptar esta respuesta.
Buffer Over Leer el
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__;
principianteProg
fuente
55
¿Que es eso? Perl?
luser droog
77
No puede ser, nunca he visto Perl código que mucho antes
jamylak