Звездное программирование!


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 баллов звезды

     *
   * * *
    * *

У вас есть примеры размера 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

Да, это так. Исправлено, спасибо!
Аверроэс

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}}

обрамленные звезды


Как это устроено

(а) Первая звезда находится в начале координатного пространства. Давайте покажем это.

(b) После этого мы отобразим точку в {1,0}.

(с) Тогда 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 не была так "заперта" и в основном для образовательных целей. Есть ли у вас какие-либо ресурсы, которые ссылаются на демоверсию Mathematica IDE или примеры, помимо тех, которые предоставляет Wolfram?
Роб

Mathematica значительно расширилась благодаря своему формату вычислимых документов, который позволяет бесплатно распространять апплеты в образовательных, некоммерческих целях. Однако исходный код 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

Математика , 65 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

@ Дэвид Спасибо. :-)
Mr.Wizard

@ Аверроэс, ты должен принять этот ответ.
Чтение буфера

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?
Люсер Дрог

7
Не может быть, я никогда не видел Perl-код задолго до этого
jamylak
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.