明星编程!


18

挑战

编写一个可以打印星星的程序或函数!该程序将通过标准输入接收两个参数:恒星的大小和恒星的点数。星形可以是0到10之间的任何大小,并且可以具有3、4或5个点。输入参数用逗号分隔,例如:5,3表示5星3点的大小。星星由星号组成*

考虑到该程序将仅接收有效输入。

打印件必须正确间隔,以便在输出中看到漂亮的星星!

参数说明

点数

是从中央星号开始计数的武器数量。

3分

       *
       *
       *
     *   *
    *     *

它们由一个垂直臂和两个对角臂组成。斜臂之间的距离是2*size-1

4分星星

   *     *
    *   *
      *
    *   *
   *     *

它们的形式为X,由两条对角线组成。行之间的分隔是2*(size-1)+1

5分星星

     *
     *
 * * * * *
    * *
   *   *

它们由垂直线和水平线组成。水平线中的每个星号均以一个空格分隔。他们也有两条对角线,它们之间2*(size-2)+1

尺寸

大小是从中央星号(包括中心星号)开始算起的每个星臂的星号数。

1星大小由一个星号组成

*

大小2星的例子

3分

       *
       *
     *   *

4分星星

    *   *
      *
    *   *

5分星星

     *
   * * *
    * *

Points参数说明中有3星大小的示例。

获奖标准

最短的代码胜出。必须使用以下输入参数检查代码:3,2 3,3 4,2 4,3 5,2 5,3

奖金

-25%的字符可用于创建大小6(指向前面说明的标准)(6臂,大小是从中心星号开始计数的星号数)。它可以是您遵循规格时想要的任何形式。6星大小为3的示例:

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

必须使用以下输入来检查6点星6,2 6,3


1
在第一个(5,3)星的示例中,两个水平点是否应每个都长一个星号?
PhiNotPi 2012年

是的。固定,谢谢!
阿威罗伊

3
“我的上帝……星光
灿烂

那应该是问题标题!
luser droog

Answers:


36

Mathematica 80 76 67个字符

有人会怀疑这是否是ASCII艺术,但我无法抗拒。

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

用法(将字体大小设置为24以使星星显得很大。)

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

六四


以下情况的输出

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

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

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

裱星星


怎么运行的

(a)第一颗星位于坐标空间的原点。让我们显示它。

(b)之后,我们将在{1,0}处显示一个点。

(c)然后一次5分。我们将纯函数应用于其后的每对坐标。

(d)使用Cos和Sin确定坐标

(e)坐标仅在单位圆上起作用;6是光束的数量。

(f)从0到4绘制半径。

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]

说明


+1非常有趣!您能解释一下这是如何工作的吗?
罗布

1
谢谢您的解释,它开始变得更有意义了。我只是希望Mathematica不会那么“锁定”,而主要是出于教育目的。除了Wolfram提供的资源之外,您是否有其他资源可以链接到Mathematica IDE演示或示例?
罗布2012年

Mathematica凭借其可计算文档格式大大开放,该格式允许出于教育目的,非商业目的免费分发applet。但是,Mathematica的源代码很大程度上是“锁定”的。至于资源,你可能想看看在http:/demonstrations.wolfram.com也mathematica.stackexchange.com/questions/18/...
DavidC

7

Ruby,ASCII,193得分142(189个字符-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

在线测试

我认为它有资格获得6射线星奖金。

      *     *     

       *  *       


   *  *  *  *  *  


        *  *      

      *     *     







     * *    

    * * *   

     * *    





      *           *     


        *       *       



          *   *         


*   *   *   *   *   *   *


          *   *         



        *       *       


      *           *   

3

Mathematica65 64

我对David的方法的看法:

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

采用:

f @ {6,4}

在此处输入图片说明

由于使用=而不是会产生错误:=,这不是正确的定义方法,但是它确实可以在这里工作。

如果允许使用点而不是星号,则可以这样写(52个字符):

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

f @ {6, 4}

在此处输入图片说明


我喜欢使用纯函数层的想法。
DavidC

@大卫谢谢。:-)
巫师先生(Mr.Wizard)2013年

@Averroes,您应该接受此答案。
缓冲区读取

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
那是什么?Perl?
luser droog

7
不能,我很久没见过Perl代码了
jamylak 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.