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


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.