Зірки роблять зірок


17

Вступ

Ідея полягає у використанні символу зірочки (зірки) *для відображення зірки ascii-art у визначеному вимірі. Розмір - це вхідне число, що більше або дорівнює 1 яке визначає висоту в лініях верхньої точки зірки. Зірки тут мають бути шістьма загостреними зірками з більшими розмірами, які краще виглядають з точки зору зображення.

У всіх випадках уявлення про зірки в мистецтві повинно виглядати як два трикутники, які перетинаються, як показано в наступних прикладах.

Параметри

Наступне зображення та таблиця даних описують атрибути для перших семи розмірів зірки. Кожен з параметрів зростає в арифметичній прогресії , як N збільшується, за винятком того, N=1 відрізняється .

введіть тут опис зображення

введіть тут опис зображення

Приклади

Для введення 1 (випадений випадок) вихід програми повинен бути таким:

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

Введення 2:

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

(3)

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

(5)

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

Виклик

Ваше завдання - створити функцію або програму, яка прийме число N як вхідне, а потім виведе зірку відповідного розміру, використовуючи лише символи та *символ.

  • Ви можете припустити, що вхідне значення завжди є додатним цілим числом.
  • Пробіл пробілів у вихідних лініях добре.
  • Алгоритм програми повинен бути достатньо загальним для будь-якого N введення, щоб отримати вихідне зіркове мистецтво. Звичайно, існують практичні обмеження через розмір виводу на дисплей.
  • Вихід повинен надрукувати в STDOUT.
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу.

Оцінка балів

Це тому код з найменшою кількістю байтів виграє!


5
Ви також говорите, що це може бути функцією, але вона повинна "друкувати в STDOUT". Це навмисно?
Пост Рок-Гарф Хантер

5
Так, загальне правило будівництва було б чудово ... наприклад, я не впевнений у рівних введеннях, як N = 4 ...
digEmAll

7
Будь ласка, не кажіть: "Алгоритм створення зірок є частиною завдання програмування". Це не те, чим найбільше подобаються гольфісти, роблячи арт-виклик ASCII, і це звучить як спроба порушити щось, що є відповідальністю специфікаторів. Однак, я здивований, що люди тут незрозумілі щодо будівництва; це два трикутники, які перекриваються, як каже виклик. Чи допоможе це чітко сказати розмір і зміщення трикутників?
xnor

9
@TimPederick Хороший улов про те, що N = 1 відрізняється. Я вкладаю в замітку, щоб вирішувачі цього не пропустили. Я думаю, що виклик буде кращим без цього особливого випадку.
xnor

4
@xnor: оскільки n = 1 було іншим, я не міг зробити висновок про загальне правило ... і правило IMO завжди слід вказувати для мистецтва ASCII, інакше мені дозволяється друкувати все, що я хочу, за межами визначеного діапазону приклади;)
digEmAll

Відповіді:


7

05AB1E , 21 байт

3*s≠-L·<sÅ0«Âø€à'*×.C

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

3*                     # multiply input by 3
  s≠-                  # subtract 1 if the input isn't 1
     L                 # push range [1 ... (3*n-(n!=1))]
      ·<               # multiply by 2 and subtract 1 to get odd numbers
        sÅ0«           # append n zeroes
            Âø         # zip with a reversed copy
              ۈ       # get the largest number in each pair
                '*×    # repeat "*" for each number in the list
                   .C  # format centered

1
Вихідні зірки виглядають правильно.
Майкл Карась

1
Я можу знайти безліч альтернатив на 3*s≠-L·<кшталт 6*s≠·-ÅÉабо ≠3/-6*ÅÉ, але, на жаль, жодна не є коротшою .. Приємна відповідь, як завжди! :)
Кевін Крейссен

xs3*<ŸRsLì'*×.º.C.∊за 19 :). Я збрехав, це не працює на 1. Залишаючи це натхнення.
Чарівна восьминога

7

Haskell , 114 байт

Побудує функцію, gяка приймає число, і створює IOмонаду, яка друкує зірку до STDOUT. Я думаю, це нормально.

f=replicate
a%b=mapM_(\n->putStrLn$f(a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..a]++f b 0
g 1=4%1
g a=(3*a)%a

Спробуйте в Інтернеті!

Пояснення

Спочатку давайте поговоримо про лямбда.

\n->putStrLn$f(a-n)' '++f(2*n-1)'*'

Це потребує числа n, яке потрібно намалювати як зірки. Ми надрукуємо вдвічі більше зірок, а потім ще 1 і наклеїмо її праворуч на розмір зображення. Ми прокладаємо це праворуч aпробілами, щоб центрувати лінію зірок. Ми можемо використовувати цю лямбда, щоб намалювати кожну лінію.

З цієї лямбда ми створюємо (%). (%)починається з роботи mapM_з нашою лямбда, щоб перетворити профіль у форму.

Тепер все, що нам потрібно зробити, - це скласти список профілю для зірки. Ми можемо це зробити, спершу склавши трикутник [1..a], а потім проклавши його нулями ++replicate b 0. Якщо взяти профіль трикутника і повернути його, ми отримаємо іншу половину зірки. Щоб супер нав'язувати їх, ми просто робимо новий профіль, де кожен запис є максимум двох трикутників. Це zipWith max.

Потім ми називаємо це двома способами: як 3%1для введення, так 1і з (3*a-1)%aіншого.

Звідси ми трохи обмінюємось із деякими значеннями для гоління деяких байтів. Оскільки 3*a-1досить довго ми компенсуємо деякі інші наші значення на 1, так що все скасовується, і ми 3*aзамість цього отримуємо намічену поведінку . А саме ми починаємо наш список у2 замість, 1а 2*n-3замість того, 2*n-1щоб компенсувати зміни.

Альтернативна версія, 114 байт

Цей створює функцію без точок (%)<*>min 2

f=replicate
a%b=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*(n-b)+1)'*')$zipWith max<*>reverse$[b..3*a]++f a 0
(%)<*>min 2

Спробуйте в Інтернеті!

N>1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..3*a]++f a 0

Спробуйте в Інтернеті!

N=1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-1)'*')$zipWith max<*>reverse$[1..3*a]++f a 0

Спробуйте в Інтернеті!


Зараз ваш результат виглядає добре.
Майкл Карась

6

R , 125 107 101 байт

function(n,S=3*n+!n-1,P=pmax(I<-c(2:S*2-3,!1:n),rev(I)),`~`=strrep)write(paste0(' '~S-1-P/2,'*'~P),1)

Спробуйте в Інтернеті!

  • -24 завдяки @Giuseppe

Попередній (різний) підхід:

R , 150 148 136 135 130 128 байт

function(n,G=n<2,K=4*n-1+G)for(i in 1:K-1)cat(`[<-`(rep(' ',W<-3*n-2+G),1+W+c(-i:i*(i<K-n),-(j=K-i-1):j*(i>=n)),'*'),sep='','
')

Спробуйте в Інтернеті!

  • -14 спасибі @Kirill L.
  • -1 завдяки @ t-clausen.dk
  • -7 завдяки @Giuseppe

Так, я теж не люблю тих , хто повторив S [] = завдання, і виглядає як це працює
Кирило Львович

Чудово! Я думав про щось подібне ... але я вечеряв: P
digEmAll

Здається, ви можете зберегти байт: i> n-1 можна переписати на i> = n
t-clausen.dk

@ t-clausen.dk: так, дякую!
digEmAll

1
117 байт у новій версії
Джузеппе

5

Python 2 , 101 99 97 байт

n=input()
x=2*(n>1)
for i in range(1,8*n,2):print('*'*[i,8*n-i-x][i+x>n*6or i/n/2%2]).center(6*n)

Спробуйте в Інтернеті!

-2 байти, завдяки Лінні


Я впевнений, що вам не потрібні паролі в виразі селектора, тому i+x>n*6orзберігається два байти.
Лінн

@Lynn Спасибі :)
TFeld

Можна навіть зайти i+x>~i/n/2%2*6*nчи щось на кшталт i+x>3*n*(~i/n&2)(обидва 96 байт.)
Лінн

5

JavaScript (V8) ,  101  108 байт

EDIT: +7 байт для друку в STDOUT

n=>print((k=3*n+!~-n,g=y=>++y<k+n?`
`.padEnd(w=k-Math.max(y>n&&n-y+k,y<k&&y)).padEnd(2*k+~w,'*')+g(y):'')``)

Спробуйте в Інтернеті!

Прокоментував (без print)

n => (                    // n = input
  k =                     // k is half the maximum width of the star + 1.5
    3 * n + !~-n,         // k = 3n if n > 1 or 4 if n = 1
  g = y =>                // g = recursive function taking y
    ++y < k + n ?         //   increment y; if y is less than k + n:
      `\n`                //     append a line feed
      .padEnd(            //     append w - 1 leading spaces:
        w =               //       where w is defined as
          k -             //       k minus
          Math.max(       //       the maximum of:
            y > n         //         - true (coerced to 1) if y > n
            && n - y + k, //           or n - y + k otherwise (bottom triangle)
            y < k &&      //         - true (coerced to 1) if y < k
            y             //           or y otherwise (top triangle)
          )               //       end of Math.max()
      )                   //     end of padEnd()
      .padEnd(            //     append 2 * (k - w) - 1 stars
        2 * k + ~w,       //       by padding to 2 * k - w - 1
        '*'               // 
      ) +                 //     end of padEnd() 
      g(y)                //     append the result of a recursive call
    :                     //   else:
      ''                  //     stop recursion
)``                       // initial call to g with y = [''] (zero-ish)

Як видається, виклик вимагає, щоб ваш вихід був надрукований безпосередньо на консолі. Це технічно не відповідає цій вимозі.
Post Rock Garf Hunter

@ SriotchilismO'Zaic Дякую за те, що повідомили мені. Тепер це "виправлено".
Арнольд

3

Желе , 21 байт

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY

Повна програма, що приймає додатне ціле число, яке друкує на STDOUT.

Спробуйте в Інтернеті! Або подивіться тестовий набір .

Як?

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY - Main Link: integer, n   e.g. 3
 3                    - three                        3
×                     - multiply (n by)              9
  ’                   - decrement                    8
    Ị                 - insignificant (abs(n)<=1)?   0
   +                  - add                          8
     R                - range                        [1,2,3,4,5,6,7,8]
       Ṭ              - un-truth (n)                 [0,0,1]
      ;               - concatenate                  [1,2,3,4,5,6,7,8,0,0,1]
          $           - last two links as a monad:
         Ṛ            -   reverse                    [1,0,0,8,7,6,5,4,3,2,1]
        »             -   maximum (vectorises)       [1,2,3,8,7,6,7,8,3,2,1]
           ”*         - an asterisk character        '*' 
             ẋ        - repeat (vectorises)          ["*","**",...]
               ⁶      - a space character            ' '
              z       - transpose with filler        ["***********"," ********* ",...]
                Ṛ     - reverse                      ["   *   *   ","   ** **   ",...]
                 Z    - transpose                    ["       *","      **",...]
                  ŒB  - bounce (vectorises)          ["       *       ","      ***      ",...]
                    Y - join with newline characters "       *       \n      ***      \n..."
                      - implicit print


2

Желе , 21 байт

×’»ɗ3”*xⱮz⁶ɓ⁶x;»Ṛ$ŒBY

Спробуйте в Інтернеті!

Монадічна посилання, яка приймає єдине ціле число як аргумент зліва і повертає відокремлений рядком Jelly рядок із зіркою як вихід. При запуску як повна програма неявно друкує зірку в STDOUT.

Пояснення

   ɗ3                 | Last three links as a dyad with 3 as right argument:
×                     |   Multiply (by 3)
 ’                    |   Decrease by 1
  »                   |   Maximum of this (and 3)
     ”*xⱮ             | An implicit range from 1 to this many asterisks
         z⁶           | Zip with space as filler
           ɓ          | Start a new dyadic chain with the input as left argument and the list of asterisks as right argument
            ⁶x        | Input many spaces
              ;       | Concatenated to the asterisk list
                 $    | Last two links as a monad:
               »Ṛ     |   Maximum of this list and its reverse
                  ŒB  | Bounce each list (i.e. mirror it without duplicating the middle entry)
                    Y | Join with newlines

1
Я вдячний, що ви пишете початок стильним способом, хоча ×3’»3це однакова довжина ^ _ ^
Лінн

1
@Lynn в той момент я зробив це, я вважав, що буду використовувати інший швидкий шлях для об'єднання декількох посилань, і це означало, що я можу це зробити в межах максимально дозволених 4. Однак, як тільки я вирішив використати ɓце не має значення, але я зберіг його, тому що мені все одно сподобався!
Нік Кеннеді

2

Деревне вугілля , 25 байт

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*‖O¬C⁰¬⊖θ

Спробуйте в Інтернеті!Посилання на багатослівну версію коду. Пояснення:

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*

Намалюйте неправильний п’ятикутник, що представляє верхню праву чверть зірки, але зі спеціальним кожухом 1 щоб зробити рядок додатковим стовпчиком ширшим.

‖O¬

Роздум, щоб завершити зірку.

C⁰¬⊖θ

Більш спеціальний кожух зробити зірку для 1 додатковий ряд вище.

Альтернативне рішення, також 25 байт:

∧¬⊖θ*G↗↓⊖׳N*‖O‖OO↓∧⊖θ⊖⊗θ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

∧¬⊖θ*

Роздрукуйте додатковий * випадок для справи 1.

G↗↓⊖׳N*

Намалюйте ліву половину трикутника відповідного розміру.

‖O

Відбийте для завершення трикутника.

‖OO↓∧⊖θ⊖⊗θ

Перекриваємо його своїм відображенням, за винятком випадків 1 , у такому випадку просто відображаючи його.

14 байт без спеціального кожуха для 1:

G<⊖׳N*‖OO↑⊖⊗θ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

G<⊖׳N*

Намалюйте трикутник відповідного розміру.

‖OO↑⊖⊗θ

Перекрийте його своїм відображенням.


2

Perl 6 , 74 байти

{$_ Z~|[R,] $_}o{.&{|((' 'x--$+$_*3~'*'x$++*2+1)xx$_*3-($_>1)),|($ xx$_)}}

Спробуйте в Інтернеті!

Буквально створюється трикутник з правильними пропорціями і перекриває його перевернутою копією, використовуючи рядок або оператор ( ~|). Виводиться у вигляді списку рядків із пробілом провідної та кінцевої ліній.

Пояснення:

                {.&{                                                     }  # Anonymous code block
                      (                        )xx$_*3-($_>1)   # Repeat n*3-(n!=1) times
                       ' 'x--$+$_*3      # With a decreasing indentation
                                   ~'*'x$++*2+1  # Append an increasing triangle
                                       # This creates the triangle
                                                            ,|($ xx$_)  # And add some padding lines
{             }o   # Pass the triangle to the combining function
    Z~|            # Zip string bitwise or
 $_                # The list
       [R,] $_     # With its reverse

2

J , 53 50 байт

' *'{~[:(+.|.),.@#&0,~[:(|.,}.)"1*@<:>:/~@i.@-~3*]

Спробуйте в Інтернеті!

неозорий

' *' {~ [: (+. |.) ,.@#&0 ,~ [: (|. , }.)"1 *@<: >:/~@i.@-~ 3 * ]

як

Використовуйте таблицю функцій (як таблицю разів 3-го класу), щоб побудувати половину трикутника, використовуючи >:(більшу чи рівну) як функцію. Потім переверніть кожен рядок, подрібніть останній стовпець і з'єднайте дві сторони разом, щоб отримати повний трикутник (але зроблений з 1 і 0). nУ нижній частині додайте ряди нулів. Нарешті переверніть всю річ і накладіть її на оригінал, використовуючи булевий або +.для отримання результату. Потім поверніть *пробіли від 1 до 0.


Приємно! Ось моє рішення - однакова довжина, різний підхід: Спробуйте це в Інтернеті!
Гален Іванов

1
Спасибі. Це впевнене відчуття, що можна було б більше грати в гольф, але я спробував кілька інших підходів і не зміг цього зробити.
Йона

2

T-SQL, 194 байт

@ - це вхідне значення

@c обробляє ширину верхнього трикутника

@d обробляє нижній трикутник шириною

@eмістить вихід або @cабо @d- це економить кілька байт

@fобробляє спеціальний корпус 1 як вхід. @c*@=3визначає, коли використовувати @f. На 5 байт дешевше, ніж писати@c=3and @=1

DECLARE @ INT=8

,@c INT=1,@e INT=1,@d INT,@f INT=0SET @d=@*8-3r:PRINT
space(@*3-@e/2+@f/2)+replicate('*',@e-@f)SELECT
@c=nullif(@c,@*6-3)+2,@f=iif(@c*@=3,2,0),@d-=2-@f,@e=iif(@c>@d
or @c/2<@,@c,@d)IF @d>0goto r

Спробуйте в Інтернеті


1

Japt -R , 25 байт

+5 байт для n=1: \

õ cUon3*U-´UÎ)®ç* êÃê!U û

Спробуй це

õ cUon3*U-´UÎ)®ç* êÃê!U û     :Implicit input of integer U
õ                             :Range [1,U]
  c                           :Concatenate
   Uo                         :  Range [0,U)
     n                        :  Subtract each from
      3*U-                    :    Multiply U by 3 and subtract
          ´U                  :      Decrement U
            Î                 :      Get sign
             )                :End concat
              ®               :Map each Z
               ç*             :  Repeat "*" Z times
                  ê           :  Palindromise
                   Ã          :End map
                    ê!U       :If decremented U is 0, append reverse, else, palindromise
                        û     :Centre pad each line with spaces to the length of the longest
                              :Implicitly join with newlines and output
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.