Зоряне програмування!


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

Так. Виправлено, спасибі!
— Аверрое

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

(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
Дякую за пояснення, воно починає мати більше сенсу. Я просто хочу, щоб математика не була настільки "замкненою", і в основному для освітніх цілей. Чи є у вас ресурси, які посилаються на демонстрацію IDE Mathematica або приклади, що не відповідають тим, які надає Wolfram?
— Роб

Mathematica значно розкрилася завдяки своєму обчислювальному формату документів, який дозволяє безкоштовно розповсюджувати аплети в освітніх, некомерційних цілях. Однак вихідний код до Mathematica значною мірою "заблокований". Що стосується ресурсів, то ви можете подивитися за адресою: /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

@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 droog

7
Не може бути, я ще жодного разу не бачив коду perl
— jamylak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.