Le stelle fanno le stelle


17

introduzione

L'idea è di utilizzare il carattere asterisco (stella) *per visualizzare una stella ascii-art in una dimensione specificata. La dimensione è un numero di input maggiore o uguale a che specifica l'altezza in linee del punto superiore della stella. Le stelle qui sono intese come stelle a sei punte con dimensioni maggiori che sembrano migliori dal punto di vista dell'immagine.1

In tutti i casi la rappresentazione in arte ascii delle stelle deve apparire come due triangoli che si sovrappongono come mostrato nei seguenti esempi.

Parametrico

L'immagine e la tabella di dati seguenti descrivono gli attributi per le prime sette dimensioni della stella. Ognuno dei parametri cresce in una progressione aritmetica all'aumentare di , tranne che è diverso .NN=1

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Esempi

Per un input di 1 (il caso degenerato) l'output del programma dovrebbe essere il seguente:

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

Ingresso di 2:

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

(3)

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

(5)

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

Sfida

Il tuo compito è creare una funzione o un programma che accetti il ​​numero N come input e quindi emetta la stella di dimensioni appropriate usando solo caratteri e il *carattere.

  • Si può presumere che il valore di input sia sempre un numero intero positivo.
  • Lo spazio bianco finale sulle righe di output è OK.
  • L'algoritmo del programma dovrebbe essere abbastanza generale da consentire a qualsiasi input di produrre l'output star art. Ovviamente esistono limitazioni pratiche dovute alla visualizzazione delle dimensioni dell'output.N
  • L'output deve essere stampato su STDOUT.
  • Sono vietate le scappatoie standard .
  • Questo è quindi si applicano tutte le normali regole del golf.

punteggio

Questo è quindi vince il codice con il minor numero di byte!


5
Dici anche che può essere una funzione ma deve "stampare su STDOUT". È intenzionale?
Post Rock Garf Hunter,

5
Sì, una regola generale di costruzione sarebbe ottima ... per esempio non sono sicuro nemmeno degli input, come N = 4 ...
digEmAll

7
Per favore, non dire "L'algoritmo per produrre le stelle è parte della sfida di programmazione". Questo non è qualcosa che la maggior parte dei golfisti ama quando fa una sfida all'arte ASCII e sembra un tentativo di impegnare qualcosa che è la responsabilità degli specificatori. Detto questo, sono sorpreso che le persone non siano chiare sulla costruzione qui; sono due triangoli sovrapposti come dice la sfida. Aiuterebbe a dire esplicitamente la dimensione e l'offset dei triangoli?
xnor

9
@TimPederick Buona cattura di N = 1 diverso. Ho inserito una nota in modo che i solutori non lo perdano. Penso che la sfida sarebbe migliore senza questo caso speciale.
xnor

4
@xnor: poiché n = 1 era diverso, non potevo dedurre una regola generale ... e IMO la regola dovrebbe essere sempre specificata per l'arte ASCII, altrimenti sono autorizzato a stampare tutto ciò che voglio al di fuori dell'intervallo definito esempi;)
digEmAll

Risposte:


7

05AB1E , 21 byte

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

Provalo online! o come una suite di test

Spiegazione

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
Le stelle di output sembrano corrette.
Michael Karas,

1
Riesco a trovare un sacco di alternative per 3*s≠-L·<like 6*s≠·-ÅÉo ≠3/-6*ÅÉ, ma purtroppo nessuna è più breve .. Bella risposta, come sempre! :)
Kevin Cruijssen,

xs3*<ŸRsLì'*×.º.C.∊per 19 :). Ho mentito, non funziona per 1. Lasciandolo per ispirazione.
Magic Octopus Urn

7

Haskell , 114 byte

Costruisce una funzione gche accetta un numero e produce una IOmonade che stampa la stella su STDOUT. Penso che sia ok

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

Provalo online!

Spiegazione

Per prima cosa parliamo della lambda.

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

Questo richiede un numero, nda disegnare come stelle. Stampiamo il doppio di tante stelle e poi 1 in più e lo imbottiamo a destra fino alla dimensione dell'immagine. Lo riempiamo a destra di aspazi per centrare la linea di stelle. Possiamo usare questo lambda per disegnare ogni linea.

Da questo lambda creiamo (%). (%)inizia facendo mapM_con la nostra lambda per trasformare un profilo nella forma.

Ora tutto ciò che dobbiamo fare è creare un elenco del profilo per la stella. Possiamo farlo creando prima un triangolo [1..a], quindi riempendolo con alcuni zeri ++replicate b 0. Se prendiamo il profilo del triangolo e lo invertiamo otteniamo l'altra metà della stella. Per superarli, creiamo un nuovo profilo in cui ogni voce è il massimo dei due triangoli. Questo è zipWith max.

Quindi lo chiamiamo in due modi: come 3%1per input di 1e con (3*a-1)%aaltrimenti.

Da qui facciamo un po 'di armeggiare con alcuni dei valori per radere alcuni byte. Poiché 3*a-1è piuttosto lungo, compensiamo alcuni dei nostri altri valori di 1 in modo che tutto si annulli e otteniamo invece il comportamento previsto 3*a. Vale a dire che iniziamo la nostra lista 2invece di 1e facciamo 2*n-3invece di 2*n-1compensare il cambiamento.

Versione alternativa, 114 byte

Questo crea una funzione senza punti (%)<*>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

Provalo 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

Provalo 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

Provalo online!


Il tuo output ora sembra carino.
Michael Karas,

6

R , 125 107 101 byte

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)

Provalo online!

  • -24 grazie a @Giuseppe

Approccio precedente (diverso):

R , 150 148 136 135 130 128 byte

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

Provalo online!

  • -14 grazie a @Kirill L.
  • -1 grazie a @ t-clausen.dk
  • -7 grazie a @Giuseppe

Sì, anche io non come quelli ripetuti S [] = assegnazioni, e si presenta come funziona questo
Kirill L.

Grande ! Stavo pensando a qualcosa del genere ... ma stavo cenando: P
digEmAll

Sembra che puoi salvare un byte: i> n-1 può essere riscritto in i> = n
t-clausen.dk

@ t-clausen.dk: sì, grazie!
digEmAll

1
117 byte nella versione più recente
Giuseppe

5

Python 2 , 101 99 97 byte

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)

Provalo online!

-2 byte, grazie a Lynn


Sono ragionevolmente sicuro che non hai bisogno delle parentesi nell'espressione del selettore, quindi i+x>n*6orsalva due byte.
Lynn,

@Lynn Thanks :)
TFeld,

Puoi persino andare i+x>~i/n/2%2*6*no qualcosa del genere i+x>3*n*(~i/n&2)(entrambi 96 byte.)
Lynn,

5

JavaScript (V8) ,  101  108 byte

MODIFICA: +7 byte per stampare su 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):'')``)

Provalo online!

Commentato (senza 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)

Solo un avvertimento la sfida sembra richiedere che l'output sia stampato direttamente sulla console. Questo tecnicamente non soddisfa tale requisito.
Post Rock Garf Hunter,

@ SriotchilismO'Zaic Grazie per avermelo fatto notare. Questo è ora 'riparato'.
Arnauld,

3

Gelatina , 21 byte

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

Un programma completo che accetta un numero intero positivo che stampa su STDOUT.

Provalo online! O vedi una suite di test .

Come?

×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

Gelatina , 21 byte

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

Provalo online!

Un collegamento monadico che accetta un singolo intero come argomento sinistro e restituisce una stringa Jelly separata da una nuova riga con la stella come output. Se eseguito come programma completo, stampa implicitamente la stella su STDOUT.

Spiegazione

   ɗ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
Apprezzo che tu scriva l'inizio in modo elegante anche se ×3’»3è della stessa lunghezza ^ _ ^
Lynn,

1
@Lynn nel momento in cui l'ho fatto pensavo che avrei usato un altro veloce per unire più collegamenti, e ciò significava che avrei potuto farlo entro il massimo di 4 consentito. Tuttavia, una volta che ho deciso di usarlo ɓnon importava, ma l'ho tenuto perché mi piaceva ancora!
Nick Kennedy,

2

Carbone , 25 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Disegna un pentagono irregolare che rappresenta il quarto in alto a destra della stella, ma un involucro speciale 1per allargare la fila di una colonna in più.

‖O¬

Rifletti per completare la stella.

C⁰¬⊖θ

Più involucro speciale per rendere più alta la stella per 1una fila in più.

Soluzione alternativa, anche 25 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

∧¬⊖θ*

Stampa un extra *per il caso di 1.

G↗↓⊖׳N*

Disegna la metà sinistra di un triangolo della dimensione appropriata.

‖O

Rifletti per completare il triangolo.

‖OO↓∧⊖θ⊖⊗θ

Sovrapponilo con il suo riflesso, tranne nel caso di 1, nel qual caso riflettilo e basta.

14 byte senza involucro speciale per 1:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

G<⊖׳N*

Disegna un triangolo della dimensione appropriata.

‖OO↑⊖⊗θ

Sovrapponilo con il suo riflesso.


2

Perl 6 , 74 byte

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

Provalo online!

Crea letteralmente un triangolo con le giuste proporzioni e lo sovrappone con una copia capovolta usando la stringa o l'operatore ( ~|). Emette come un elenco di linee con uno spazio bianco iniziale e finale.

Spiegazione:

                {.&{                                                     }  # 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 byte

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

Provalo online!

ungolfed

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

Come

Utilizzare una tabella delle funzioni (come una tabella dei tempi di 3 ° grado) per costruire metà del triangolo utilizzando >:(maggiore o uguale) come funzione. Quindi invertire ogni riga, tagliare l'ultima colonna e unire i due lati per ottenere il triangolo completo (ma composto da 1 e 0). Aggiungi nrighe di zeri in fondo. Alla fine inverti il ​​tutto e sovrapponilo sull'originale, usando booleano o +.per ottenere il risultato. Quindi ruota 1 su *e 0 su spazi.


Bello! Ecco la mia soluzione: stessa lunghezza, approccio diverso: provalo online!
Galen Ivanov,

1
Grazie. Mi sembra di poter giocare a golf di più, ma ho provato una manciata di altri approcci e non sono stato in grado di farlo.
Giona

2

T-SQL, 194 byte

@ è il valore di input

@c gestisce la larghezza del triangolo superiore

@d gestisce il triangolo inferiore della larghezza

@econtiene l'output o @coppure @d- questo consente di risparmiare qualche byte

@fgestisce il caso speciale di 1 come input. @c*@=3determina quando usare @f. 5 byte in meno rispetto alla scrittura@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

Provalo online


1

Japt -R , 25 byte

+5 byte per n=1 : \

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

Provalo

õ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.