Звезды делают звезды


17

Вступление

Идея состоит в том, чтобы использовать символ звездочки (звездочка), *чтобы отобразить звезду ascii-art в указанном измерении. Измерение - это входное число, большее или равное 1 которое определяет высоту в линиях верхней точки звезды. Звезды здесь должны быть шестиконечными звездами с большими размерами, которые выглядят лучше с точки зрения изображения.

Во всех случаях ascii-art представление звезд должно появиться в виде двух треугольников, которые перекрываются, как показано в следующих примерах.

параметрика

На следующем рисунке и в таблице данных описаны атрибуты первых семи размеров звезды. Каждый из параметров растет в арифметической прогрессии N увеличением 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 байт на новой версии
Giuseppe

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экономит два байта.
Линн

@ Линн Спасибо :)
TFeld

Вы даже можете пойти i+x>~i/n/2%2*6*nили что-то вроде i+x>3*n*(~i/n&2)(оба 96 байтов.)
Линн

5

JavaScript (V8) ,  101  108 байт

РЕДАКТИРОВАТЬ: +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)

Кажется, для решения проблемы требуется, чтобы ваш вывод выводился непосредственно на консоль. Технически это не соответствует этому требованию.
Пост Рок Гарф Хантер

@ 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
@ Линн в тот момент, когда я сделал это, подумал, что собираюсь использовать другой быстрый для объединения нескольких ссылок, и это означало, что я мог сделать это в пределах максимально разрешенных 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*]

Попробуйте онлайн!

ungolfed

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

как

Используйте таблицу функций (например, таблицу времен 3-го класса), чтобы построить половину треугольника, используя >:(больше или равно) в качестве функции. Затем переверните каждую строку, отрежьте последний столбец и соедините две стороны вместе, чтобы получить полный треугольник (но состоящий из 1 и 0). Добавьте nряды нулей внизу. Наконец, полностью измените все это и наложите его на оригинал, используя boolean или, +.чтобы получить результат. Затем поверните 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.