Estrelas fazem estrelas


17

Introdução

A idéia é usar o caractere asterisco (estrela) *para exibir uma estrela ascii-art em uma dimensão especificada. A cota é um número de entrada maior ou igual a que especifica a altura em linhas do ponto superior da estrela. As estrelas aqui devem ser seis estrelas pontiagudas, com tamanhos maiores, com melhor aparência da perspectiva da imagem.1

Em todos os casos, a representação artística das estrelas deve aparecer como dois triângulos que se sobrepõem, como mostrado nos exemplos a seguir.

Parametrics

A figura a seguir e a tabela de dados descrevem atributos para os sete primeiros tamanhos da estrela. Cada um dos parâmetros cresce em uma progressão aritmética à medida que aumenta, exceto que é diferente .NN=1

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Exemplos

Para uma entrada de 1 (o caso degenerado), a saída do programa deve ser a seguinte:

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

Entrada de 2:

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

(3)

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

(5)

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

Desafio

Sua tarefa é criar uma função ou programa que aceite o número N como entrada e, em seguida, produza a estrela de tamanho apropriado usando apenas caracteres e o *caractere.

  • Você pode assumir que o valor de entrada é sempre um número inteiro positivo.
  • O espaço em branco à direita nas linhas de saída está OK.
  • O algoritmo do programa deve ser geral o suficiente para qualquer entrada produzir a saída de arte em estrela. Obviamente, existem limitações práticas devido ao tamanho da saída de exibição.N
  • A saída deve ser impressa em STDOUT.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam.

Pontuação

Isso é então o código com o menor número de bytes vence!


5
Você também diz que pode ser uma função, mas deve "imprimir em STDOUT". Isso é intencional?
Wheat Wizard

5
Sim, uma regra geral de construção seria ótima ... por exemplo, não tenho certeza sobre entradas iguais, como N = 4 ...
digEmAll 14/04

7
Por favor, não diga "O algoritmo para produzir as estrelas faz parte do desafio de programação". Isso não é algo que a maioria dos golfistas gosta ao fazer um desafio de arte ASCII e parece uma tentativa de criar algo que é da responsabilidade dos especificadores. Dito isto, estou surpreso que as pessoas não estejam claras sobre a construção aqui; são dois triângulos sobrepostos como o desafio diz. Ajudaria dizer explicitamente o tamanho e o deslocamento dos triângulos?
xnor 14/04

9
@ TimPederick Boa captura sobre N = 1 ser diferente. Coloquei uma nota para que os solucionadores não percam isso. Eu acho que o desafio seria melhor sem esse caso especial.
xnor 14/04

4
@xnor: como n = 1 era diferente, não era possível inferir uma regra geral ... e na IMO a regra sempre deve ser especificada para a arte ASCII, caso contrário, posso imprimir o que quiser fora do intervalo definido exemplos;)
digEmAll 14/04

Respostas:


7

05AB1E , 21 bytes

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

Experimente online! ou como um conjunto de testes

Explicação

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
Suas estrelas de saída parecem corretas.
Michael Karas

1
Posso encontrar muitas alternativas para 3*s≠-L·<curtir 6*s≠·-ÅÉou curtir ≠3/-6*ÅÉ, mas infelizmente nenhuma é mais curta .. Ótima resposta, como sempre! :)
Kevin Cruijssen 14/04

xs3*<ŸRsLì'*×.º.C.∊para 19 :). Eu menti, não funciona para 1. Deixando para inspiração.
Magic Octopus Urn

7

Haskell , 114 bytes

Cria uma função gque pega um número e produz uma IOmônada que imprime a estrela em STDOUT. Eu acho que está tudo bem.

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

Experimente online!

Explicação

Primeiro vamos falar sobre o lambda.

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

Isso leva um número n, para ser desenhado como estrelas. Imprimimos o dobro de estrelas e, em seguida, mais 1 e colocamos à direita no tamanho da imagem. Colocamos isso à direita por aespaços para centralizar a linha de estrelas. Podemos usar esse lambda para desenhar cada linha.

A partir deste lambda, criamos (%). (%)começa com mapM_o lambda para transformar um perfil na forma.

Agora tudo o que precisamos fazer é fazer uma lista do perfil da estrela. Podemos fazer isso criando primeiro um triângulo [1..a]e preenchendo-o com alguns zeros ++replicate b 0. Se pegarmos o perfil do triângulo e o invertermos, obteremos a outra metade da estrela. Para superimpor, basta criar um novo perfil, onde cada entrada é o máximo dos dois triângulos. Isto é zipWith max.

Em seguida, chamamos isso de uma de duas maneiras: quanto 3%1à entrada de 1e com o (3*a-1)%acontrário.

A partir daqui, brincamos um pouco com alguns dos valores para raspar alguns bytes. Como 3*a-1é bastante longo, compensamos alguns de nossos outros valores por 1, para que tudo seja cancelado e, em 3*avez disso, tenhamos o comportamento pretendido . Ou seja, começamos nossa lista em 2vez de 1e fazemos em 2*n-3vez de 2*n-1compensar a mudança.

Versão alternativa, 114 bytes

Este cria uma função sem ponto (%)<*>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

Experimente 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

Experimente 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

Experimente online!


Sua saída parece boa agora.
Michael Karas

6

R , 125 107 101 bytes

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)

Experimente online!

  • -24 graças a @Giuseppe

Abordagem anterior (diferente):

R , 150 148 136 135 130 128 bytes

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

Experimente online!

  • -14 graças a @Kirill L.
  • -1 graças a @ t-clausen.dk
  • -7 graças a @Giuseppe

Sim, eu também não gosto das repetidas tarefas S [] =, e parece que isso funciona
Kirill L.

Ótimo ! Eu estava pensando em algo assim ... mas eu estava jantando: P
digEmAll

Parece que você pode salvar um byte: i> n-1 pode ser reescrito para i> = n
t-clausen.dk

@ t-clausen.dk: sim, obrigado!
digEmAll 15/04

1
117 bytes na versão mais recente
Giuseppe

5

Python 2 , 101 99 97 bytes

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)

Experimente online!

-2 bytes, graças a Lynn


Estou razoavelmente certo de que você não precisa dos parênteses na expressão do seletor, portanto, i+x>n*6orsalva dois bytes.
Lynn

@Lynn Thanks :)
TFeld

Você pode até ir i+x>~i/n/2%2*6*nou algo assim i+x>3*n*(~i/n&2)(ambos os 96 bytes).
Lynn

5

JavaScript (V8) ,  101  108 bytes

EDIT: +7 bytes para imprimir em 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):'')``)

Experimente online!

Comentado (sem 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)

Apenas um heads-up o desafio parece exigir que sua saída seja impressa diretamente no console. Tecnicamente, isso não atende a esse requisito.
Wheat Wizard

@ SriotchilismO'Zaic Obrigado por me avisar. Agora está 'fixo'.
Arnauld

3

Gelatina , 21 bytes

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

Um programa completo que aceita um número inteiro positivo que imprime em STDOUT.

Experimente online! Ou veja uma suíte de testes .

Quão?

×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 bytes

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

Experimente online!

Um link monádico que aceita um único número inteiro como argumento à esquerda e retorna uma sequência Jelly separada por nova linha com a estrela como saída. Quando executado como um programa completo, imprime implicitamente a estrela em STDOUT.

Explicação

   ɗ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
Agradeço que você tenha escrito o início da maneira elegante, mesmo tendo ×3’»3o mesmo comprimento ^ _ ^
Lynn

1
@Lynn no momento em que fiz isso, pensei que usaria outro rápido para mesclar vários links, e isso significava que eu poderia fazê-lo dentro do máximo de 4 permitido. No entanto, uma vez que decidi usá- ɓlo, não importava, mas o mantive porque ainda gostei!
Nick Kennedy

2

Carvão , 25 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Desenhe um pentágono irregular representando o quarto superior direito da estrela, mas com revestimento especial 1para tornar a linha uma coluna extra mais larga.

‖O¬

Reflita para completar a estrela.

C⁰¬⊖θ

Invólucro mais especial para tornar a estrela 1mais alta.

Solução alternativa, também 25 bytes:

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

Experimente online! Link é a versão detalhada do código. Explicação:

∧¬⊖θ*

Imprima um extra *para o caso de 1.

G↗↓⊖׳N*

Desenhe a metade esquerda de um triângulo do tamanho apropriado.

‖O

Reflita para completar o triângulo.

‖OO↓∧⊖θ⊖⊗θ

Sobreponha-o ao seu reflexo, exceto no caso de 1, caso em que apenas o reflita.

14 bytes sem revestimento especial para 1:

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

Experimente online! Link é a versão detalhada do código. Explicação:

G<⊖׳N*

Desenhe um triângulo do tamanho apropriado.

‖OO↑⊖⊗θ

Sobreponha-o ao seu reflexo.


2

Perl 6 , 74 bytes

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

Experimente online!

Cria literalmente um triângulo com as proporções corretas e o sobrepõe a uma cópia invertida usando a sequência ou o operador ( ~|). Saída como uma lista de linhas com um espaço em branco à esquerda e à direita.

Explicação:

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

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

Experimente online!

destroçado

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

como

Use uma tabela de funções (como uma tabela de tempos da 3ª série) para construir metade do triângulo usando >:(maior ou igual) como a função. Em seguida, inverta cada linha, corte a última coluna e costure os dois lados para obter o triângulo completo (mas composto por 1 e 0). Adicione nlinhas de zeros na parte inferior. Finalmente, inverta a coisa toda e sobreponha-a ao original, usando boolean ou +.para obter o resultado. Em seguida, gire 1 para *e 0 para espaços.


Agradável! Aqui está a minha solução - mesmo comprimento, abordagem diferente: Experimente online!
Galen Ivanov

1
Obrigado. Parece que poderia ser mais jogado de golfe, mas tentei várias outras abordagens e não consegui.
Jonah

2

T-SQL, 194 bytes

@ é o valor de entrada

@c lida com a largura do triângulo superior

@d lida com o triângulo inferior de largura

@econtém a saída @cou @d- isso economiza alguns bytes

@flida com o caso especial de 1 como entrada. @c*@=3determina quando usar @f. 5 bytes mais barato que escrever@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

Experimente online


1

Japt -R , 25 bytes

+5 bytes para n=1: \

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

Tente

õ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.