Gwiazdy Twórz gwiazdy

17

Wprowadzenie

Chodzi o to, aby użyć gwiazdki (gwiazdy), *aby wyświetlić gwiazdę ascii-art w określonym wymiarze. Wymiar jest liczbą wejściową większą lub równą 1 która określa wysokość w liniach górnego punktu gwiazdy. Gwiazdy tutaj mają być sześcioramiennymi gwiazdami o większych rozmiarach, wyglądającymi lepiej z perspektywy obrazu.

We wszystkich przypadkach ascii-art reprezentacja gwiazd ma wyglądać jak dwa trójkąty, które zachodzą na siebie, jak pokazano w poniższych przykładach.

Parametry

Poniższy obrazek i tabela danych opisują atrybuty dla pierwszych siedmiu rozmiarów gwiazdy. Każdy z parametrów rośnie w postępie arytmetycznym wraz ze wzrostem , z wyjątkiem tego , że jest inny .N.N.=1

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Przykłady

Dla wejścia 1 (przypadek zdegenerowany) wyjście programu powinno wyglądać następująco:

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

Wejście 2:

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

(3)

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

(5)

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

Wyzwanie

Twoim zadaniem jest stworzenie funkcji lub programu, który zaakceptuje liczbę N jako dane wejściowe, a następnie wyśle ​​gwiazdkę o odpowiednim rozmiarze za pomocą samych znaków i *znaku.

  • Możesz założyć, że wartość wejściowa jest zawsze dodatnią liczbą całkowitą.
  • Końcowe białe znaki w liniach wyjściowych są prawidłowe.
  • Algorytm programu powinien być na tyle ogólny, aby jakikolwiek wejściowy mógł generować wyjście sztuki gwiazdy. Oczywiście istnieją praktyczne ograniczenia wynikające z wielkości wyjściowej wyświetlacza.N.
  • Dane wyjściowe powinny zostać wydrukowane do STDOUT.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa.

Punktacja

To jest więc wygrywa kod z najmniejszą liczbą bajtów!

Michael Karas
źródło
5
Mówisz również, że może to być funkcja, ale musi „drukować do STDOUT”. Czy to celowe?
Post Rock Garf Hunter
5
Tak, ogólna zasada budowy byłaby świetna ... na przykład nie jestem pewien co do nawet danych wejściowych, takich jak N = 4 ...
digEmAll 14.04.19
7
Nie mów „Algorytm do tworzenia gwiazd jest częścią wyzwania programistycznego”. To nie jest coś, co lubi większość golfistów, podejmując wyzwanie artystyczne ASCII, i brzmi jak próba zastawiania czegoś, za co odpowiedzialni są specyfikatorzy. Powiedziałem, że jestem zaskoczony, że ludzie nie są pewni co do budowy tutaj; jak mówi wyzwanie, dwa trójkąty zachodzą na siebie. Czy pomogłoby jednoznacznie określić rozmiar i przesunięcie trójkątów?
xnor
9
@TimPederick Dobry haczyk o tym, że N = 1 jest inny. Wpisałem notatkę, aby solwery tego nie przegapili. Myślę jednak, że wyzwanie byłoby lepsze bez tego specjalnego przypadku.
xnor
4
@ xnor: skoro n = 1 było inne, nie mogłem wywnioskować ogólnej reguły ... a IMO reguła powinna zawsze być określona dla grafiki ASCII, w przeciwnym razie wolno mi wydrukować cokolwiek chcę poza zakresem zdefiniowanym przykłady;)
digEmAll 14.04.19

Odpowiedzi:

7

05AB1E , 21 bajtów

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

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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
Emigna
źródło
1
Twoje gwiazdy wyjściowe wyglądają poprawnie.
Michael Karas,
1
Mogę znaleźć mnóstwo alternatyw dla 3*s≠-L·<podobnych 6*s≠·-ÅÉlub ≠3/-6*ÅÉ, ale niestety żadna z nich nie jest krótsza .. Dobra odpowiedź, jak zawsze! :)
Kevin Cruijssen
xs3*<ŸRsLì'*×.º.C.∊za 19 :). Kłamałem, to nie działa dla 1. Zostawiając to dla inspiracji.
Magic Octopus Urn
7

Haskell , 114 bajtów

Buduje funkcję, gktóra pobiera liczbę i tworzy IOmonadę, która wypisuje gwiazdę na STDOUT. Myślę, że to jest w porządku.

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

Wypróbuj online!

Wyjaśnienie

Najpierw porozmawiajmy o lambda.

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

Trzeba nnarysować liczbę jako gwiazdy. Drukujemy dwa razy tyle gwiazdek, a następnie jeszcze 1 i wkładamy go z prawej strony do rozmiaru obrazu. Wstawiamy to po prawej stronie aspacjami, aby wyśrodkować linię gwiazd. Możemy użyć tej lambda do narysowania każdej linii.

Z tej lambdy tworzymy (%). (%)zaczyna się od zrobienia mapM_z naszą lambda przekształcenia profilu w kształt.

Teraz wszystko, co musimy zrobić, to zrobić listę profilu dla gwiazdy. Możemy to zrobić, najpierw tworząc trójkąt [1..a], a następnie wypełniając go zerami ++replicate b 0. Jeśli weźmiemy profil trójkąta i odwrócimy go, otrzymamy drugą połowę gwiazdy. Aby je narzucić, po prostu tworzymy nowy profil, w którym każdy wpis to maksimum z dwóch trójkątów. Jest zipWith max.

Następnie nazywamy to na jeden z dwóch sposobów: jak 3%1dla wkładu 1i z (3*a-1)%ainaczej.

Odtąd trochę grzebiemy przy niektórych wartościach, aby ogolić niektóre bajty. Ponieważ 3*a-1jest on dość długi, wyrównaliśmy niektóre z naszych innych wartości o 1, dzięki czemu wszystko się anuluje i 3*azamiast tego otrzymamy zamierzone zachowanie . Mianowicie zaczniemy naszą listę co 2zamiast 1i zrobić 2*n-3zamiast 2*n-1nadrobić zmiany.

Alternatywna wersja, 114 bajtów

Ten buduje funkcję bez punktów (%)<*>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

Wypróbuj online!

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

Wypróbuj online!

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

Wypróbuj online!

Post Rock Garf Hunter
źródło
Twoje wyniki wyglądają teraz ładnie.
Michael Karas
6

R , 125 107 101 bajtów

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)

Wypróbuj online!

  • -24 dzięki @Giuseppe

Poprzednie (inne) podejście:

R , 150 148 136 135 130 128 bajtów

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='','
')

Wypróbuj online!

  • -14 dzięki @Kirill L.
  • -1 dzięki @ t-clausen.dk
  • -7 dzięki @Giuseppe
digEmAll
źródło
Tak, nie podobają mi się też te powtarzające się zadania S [] = i wygląda na to
Kirill L.,
Wspaniały ! Myślałem o czymś takim ... ale
jadłem
Wydaje się, że możesz zapisać bajt: i> n-1 można przepisać na i> = n
t-clausen.dk
@ t-clausen.dk: tak, dzięki!
digEmAll 15.04.19
1
117 bajtów w nowszej wersji
Giuseppe
5

Python 2 , 101 99 97 bajtów

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)

Wypróbuj online!

-2 bajty, dzięki Lynn

TFeld
źródło
Jestem dość pewien, że nie potrzebujesz parens w wyrażeniu selektora, więc i+x>n*6or oszczędzasz dwa bajty.
Lynn
@Lynn Thanks :)
TFeld
Możesz nawet iść i+x>~i/n/2%2*6*nlub coś w tym stylu i+x>3*n*(~i/n&2)(oba 96 bajtów)
Lynn
5

JavaScript (V8) ,  101  108 bajtów

EDYCJA: +7 bajtów do wydrukowania do 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):'')``)

Wypróbuj online!

Skomentowane (bez 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)
Arnauld
źródło
Jedyne wyzwanie, które wydaje się wymagać, aby Twoje wyniki były drukowane bezpośrednio na konsoli. To technicznie nie spełnia tego wymogu.
Post Rock Garf Hunter
@ SriotchilismO'Zaic Dzięki za poinformowanie mnie. Jest to teraz „naprawione”.
Arnauld
3

Galaretka , 21 lat bajtów

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

Pełny program akceptujący dodatnią liczbę całkowitą, która wypisuje do STDOUT.

Wypróbuj online!Lub zobacz zestaw testowy .

W jaki sposób?

×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
Jonathan Allan
źródło
2

Galaretka , 21 bajtów

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

Wypróbuj online!

Monadyczny link akceptujący pojedynczą liczbę całkowitą jako lewy argument i zwracający ciąg galaretki oddzielony znakiem nowej linii z gwiazdą jako wyjściem. Po uruchomieniu jako pełny program domyślnie drukuje gwiazdę na STDOUT.

Wyjaśnienie

   ɗ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
Nick Kennedy
źródło
1
Doceniam to, że piszesz początek w stylowy sposób, mimo że ×3’»3ma taką samą długość ^ _ ^
Lynn
1
@ Lynn w punkcie, w którym to zrobiłem, myślałem, że zamierzam użyć innego szybkiego do połączenia wielu linków, a to oznaczało, że mogłem to zrobić w ramach maksymalnie 4 dozwolonych. Jednak kiedy zdecydowałem się na użycie, ɓnie miało to znaczenia, ale zachowałem go, ponieważ nadal mi się podobało!
Nick Kennedy,
2

Węgiel , 25 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Narysuj nieregularny pięciokąt przedstawiający prawą górną ćwiartkę gwiazdy, ale o specjalnej obudowie, 1aby poszerzyć rząd o dodatkową kolumnę.

‖O¬

Zastanów się, aby ukończyć gwiazdę.

C⁰¬⊖θ

Bardziej specjalna obudowa sprawia, że ​​gwiazda na 1dodatkowy rząd jest wyższa.

Alternatywne rozwiązanie, również 25 bajtów:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

∧¬⊖θ*

Wydrukuj dodatkowy *przypadek 1.

G↗↓⊖׳N*

Narysuj lewą połowę trójkąta o odpowiednim rozmiarze.

‖O

Zastanów się, aby ukończyć trójkąt.

‖OO↓∧⊖θ⊖⊗θ

Nakładaj go na swoje odbicie, z wyjątkiem przypadku 1, w którym to przypadku po prostu odzwierciedlaj.

14 bajtów bez specjalnej obudowy dla 1:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

G<⊖׳N*

Narysuj trójkąt o odpowiednim rozmiarze.

‖OO↑⊖⊗θ

Nakładaj go na swoje odbicie.

Neil
źródło
2

Perl 6 , 74 bajtów

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

Wypróbuj online!

Dosłownie tworzy trójkąt o odpowiednich proporcjach i nakłada go odwróconą kopią za pomocą łańcucha lub operatora (~| ). Wyjście jako lista linii z białymi odstępami linii początkowej i końcowej.

Wyjaśnienie:

                {.&{                                                     }  # 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
Jo King
źródło
2

J , 53 50 bajtów

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

Wypróbuj online!

bez golfa

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

w jaki sposób

Użyj tabeli funkcji (np. Tabeli czasów 3 klasy), aby skonstruować połowę trójkąta, używając >:(większej lub równej) jako funkcji. Następnie odwróć każdy rząd, posiekaj ostatnią kolumnę i połącz dwa boki razem, aby uzyskać pełny trójkąt (ale złożony z 1 i 0). Dodaj nrzędy zer na dole. Na koniec odwróć całość i nałóż ją na oryginał, używając wartości logicznej lub, +.aby uzyskać wynik. Następnie obróć 1 do *i 0 do spacji.

Jonasz
źródło
Ładny! Oto moje rozwiązanie - ta sama długość, inne podejście: Wypróbuj online!
Galen Iwanow
1
Dzięki. Z pewnością wydaje się, że można by bardziej zagrać w golfa, ale spróbowałem kilku innych podejść i nie byłem w stanie tego zrobić.
Jonasz
2

T-SQL, 194 bajty

@ jest wartością wejściową

@c obsługuje szerokość górnego trójkąta

@d obsługuje szerokość dolnego trójkąta

@ezawiera dane wyjściowe albo @calbo @d- to oszczędza kilka bajtów

@fobsługuje specjalny przypadek 1 jako danych wejściowych. @c*@=3określa, kiedy użyć @f. 5 bajtów tańsze niż pisanie@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

Wypróbuj online

t-clausen.dk
źródło
1

Japt -R , 25 bajtów

+5 bajtów dla n=1: \

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

Spróbuj

õ 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
Kudłaty
źródło