스타 프로그래밍!


18

도전

별을 인쇄하는 프로그램이나 기능을 작성하십시오! 프로그램은 표준 입력에 의해 별의 크기와 별의 수의 두 가지 매개 변수를받습니다. 별은 0에서 10 사이의 크기 일 수 있으며 3, 4 또는 5 개의 점이 있습니다. 입력 매개 변수는 쉼표로 구분됩니다. 예를 들면 다음과 같습니다 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 개의 팔 및 크기는 중앙 별표에서 계산 된 별표 수). 사양을 준수하면서 원하는 형식이 될 수 있습니다. 크기가 3 인 스타 6의 예 :

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

6 점의 별은 다음 입력으로 점검해야합니다 6,2 6,3.


1
(5,3) 별의 첫 번째 예에서 두 개의 수평 점이 각각 별표 1 개 이상이어야합니까?
PhiNotPi

그렇습니다. 고마워요!
Averroes

3
"나의 신 ... 별이 가득하다"
Drake Clarris

질문 제목이어야합니다!
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 매우 흥미 롭습니다! 이것이 어떻게 작동하는지 설명해 주시겠습니까?
Rob

1
설명해 주셔서 감사합니다. 더 이해하기 시작했습니다. 나는 단지 Mathematica가 그렇게 "고정되지"않았고 대부분 교육 목적으로 사용되기를 바랍니다. Wolfram이 제공하는 것 이외의 Mathematica IDE 데모 또는 예제에 링크 된 자료가 있습니까?
Rob

Mathematica는 Computable Document Format으로 상당히 개방되어 교육용, 비상업적 목적으로 애플릿을 무료로 배포 할 수 있습니다. 그러나 Mathematica의 소스 코드는 대체로 "잠금"상태입니다. 리소스에 대해서는 http : /demonstrations.wolfram.com 및 mathematica.stackexchange.com/questions/18/…을 참조하십시오.
DavidC

7

루비, 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

매스 매 티카 , 65 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

@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
그게 뭐야? 펄?
luser droog

7
펄 코드를 본 적이 없다.
jamylak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.