スタープログラミング!


18

チャレンジ

星を印刷するプログラムまたは関数を作成してください!プログラムは、標準入力によって、星のサイズと星のポイント数の2つのパラメーターを受け取ります。星は0〜10の任意のサイズで、3、4、または5ポイントを持つことができます。入力パラメーターはコンマで区切られます。たとえば5,3、3ポイントのサイズ5の星を意味します。星はアスタリスクで構成されています*

プログラムが有効な入力のみを受け取ることを考慮してください。

出力にきれいな星が見えるように、プリントは正しく間隔をあける必要があります!

パラメータの説明

ポイント

中央のアスタリスクから数える腕の数です。

3ポイントの星

       *
       *
       *
     *   *
    *     *

それらは、垂直アームと2本の斜めアームで構成されます。対角線の間隔は2*size-1

星4つ

   *     *
    *   *
      *
    *   *
   *     *

それらはXの形をしており、2本の対角線で構成されています。行間の分離は2*(size-1)+1

5ポイント星

     *
     *
 * * * * *
    * *
   *   *

それらは、垂直線と水平線で構成されます。水平線の各アスタリスクは、1つのスペースで区切られます。また、2つの対角線があり、それらの間には2*(size-2)+1

サイズ

サイズは、星の各腕が中央のアスタリスクから数える(含む)アスタリスクの数です。

サイズ1の星は単一のアスタリスクで構成されています

*

サイズ2の星の例

3点

       *
       *
     *   *

星4つ

    *   *
      *
    *   *

5ポイント星

     *
   * * *
    * *

ポイントパラメータの説明には、サイズ3の星の例があります。

受賞基準

最短のコードが優先されます。コードは次の入力パラメーターで確認する必要があります。3,2 3,3 4,2 4,3 5,2 5,3

ボーナス

-25%の文字は、前に説明した基準でポイントされたサイズ6を作成するためにカウントされます(6アームおよびサイズは、中央のアスタリスクからカウントされるアスタリスクの数です)。仕様を尊重しながら、任意の形式にすることができます。サイズ3のサイズ6の星の例:

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

次の入力で6点の星を確認する必要があります6,2 6,3


1
(5,3)星の最初の例では、2つの水平ポイントはそれぞれ1アスタリスクより長くする必要がありますか?
PhiNotPi

はい、そうです。修正、ありがとう!
アベロス

3
「私の神...それは星でいっぱいです」
ドレイククラリス

それが質問のタイトルになるはずです!
luser droog

回答:


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デモまたは例にリンクするリソースはありますか?
ロブ

Mathematicaは、Computable Document Formatでかなり開かれました。これにより、教育目的、非営利目的でアプレットを無料で配布できます。ただし、Mathematicaのソースコードはほとんど「ロックダウン」されています。リソースについては、http:/demonstrations.wolfram.comおよびmathematica.stackexchange.com/questions/18/…を
ご覧ください。

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

デビッドの方法に関する私の見解:

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

@Davidありがとう。:-)
Mr.Wizard

@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はドローグ

7
できません、ずっと前にperlコードを見たことがありません
-jamylak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.