Construir uma escada para o meu filho


25

Outro dia, meu filho me pediu para construir uma escada usando blocos de Lego. E eu vim com algo assim:

Escadaria

Então meu filho me pediu um programa usando o menor número de bytes que gerasse uma escada semelhante na tela do computador. Eu não sou tão bom em , então preciso da sua ajuda. Eu preciso de um programa que:

  • Recebe um número inteiro positivo com o número de níveis que a escada precisa ter.
  • Produz um desenho de uma escada, com o padrão que você vê na imagem.

A saída estará no formato de texto, mas os tijolos podem ser distinguidos um do outro. Por exemplo, você pode usar o caractere '█' como meio bloco e pintá-lo em qualquer cor que desejar, ou apenas escolher qualquer caractere de sua escolha.

Restrições:

  • Os blocos precisam ter três cores diferentes, que serão usadas o maior tempo possível (se a entrada for 1 ou 2, não haverá blocos suficientes para usar as três cores). Se desejar, você pode usar os caracteres '░▒▓', por exemplo, ou apenas selecionar três caracteres diferentes.
  • Dois blocos da mesma cor ou padrão não podem ficar lado a lado em uma única linha.

Meu filho realmente não se importa com espaços à direita ou novas linhas, desde que uma escada seja desenhada.

Exemplos (desculpe pela má escolha de caracteres):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

Input: 3
Output:
██
 ▓▓
██░░

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓

17
Diga ao seu filho que a diversão está em construção / programando-se :-)
Luis Mendo

3
Bem vindo ao site! Combinar arte ASCII e saída gráfica é geralmente desaprovado, pois resulta em dois desafios paralelos. Além disso, se você vai para ASCII, eu permitiria que caracteres ASCII reais a serem usadas (eu acho que você já faz, mas talvez seja mais explícito), como algumas línguas podem ter dificuldade com caracteres não ASCII
Luis Mendo

2
FYI os blocos são chamados Duplo
caird coinheringaahing

10
@cairdcoinheringaahing duplo não possui botões redondos.
Christoph

3
@cairdcoinheringaahing Os blocos da Questão não são Duplo, Duplo é compatível com Lego , esses são Lego Baby . Eles foram originalmente chamado Duplo Primo e gostaria que teve um nome diferente do que qualquer um dos dois, mas eles são tecnicamente um produto diferente do que ambos Lego e Duplo.
Draco18s

Respostas:


5

Geléia ,  21 19  16 bytes

d2SR+%3x2⁶;ṙḂµ€Y

Um programa completo imprimindo o resultado.

Usa 00, 11e 22como os blocos.

Experimente online!

Quão?

d2SR+%3x2⁶;ṙḂµ€Y - Main link: number n
             µ€  - for €ach "row" in n (i.e. for row, r = 1 to n inclusive):
d2               -   divmod 2   -> [integer-divide by 2, remainder] i.e. [r/2, r%2]
  S              -   sum        -> r/2 + r%2
   R             -   range      -> [1, 2, 3, ..., r/2 + r%2]
    +            -   add r      -> [r+1, r+2, r+3, ..., r + r/2 + r%2]
     %3          -   modulo 3   -> [r%3+1, r%3+2, r%3+0, ..., (r + r/2 + r%2)%3]
                 -   e.g.: r: 1  , 2  , 3    , 4    , 5      , 6      , 7       , ...
                             [2], [0], [1,2], [2,0], [0,1,2], [1,2,0], [2,0,1,2], ...
       x2        -   times 2 - repeat each twice (e.g. [2,0,1,2] -> [2,2,0,0,1,1,2,2]
         ⁶       -   literal space character
          ;      -   concatenate (add a space character to the left)
            Ḃ    -   r mod 2 (1 if the row is odd, 0 if it is even (1 at the top))
           ṙ     -   rotate (the list) left by (r mod 2)
               Y - join with newlines
                 - implicit print (no brackets printed due to the presence of characters)

11

Python 2 , 55 bytes

i=2
exec"print(i%2*' '+`2%i*1122`*i)[:i];i+=1;"*input()

Experimente online!

Alterna entre blocos de 22, 44, exceto a linha superior 00. Por exemplo, na entrada 10, imprime

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Imprime linhas de comprimento crescente i=2,3,.., criando um espaço para comprimentos ímpares, repetindo os itempos do padrão e truncando para o comprimento i. O padrão é 2244para todas as linhas, exceto a primeira i=2para a qual é 0. Isso é alcançado com a expressão aritmética2%i*1122 .


1
Usa apenas duas cores para o caso 3. #
Christoph

Correção muito inteligente!
Charlie

4

JavaScript (ES6), 80 bytes

n=>eval(`for(s=11,i=1;i++<n;)s+='\\n'+(' '+'2233'.repeat(n)).substr(i%2,i+1);s`)


JavaScript (ES6), 87 bytes

Solução anterior.

n=>[11,...Array(n).fill(' '+'2233'.repeat(n)).map((r,n)=>r.slice(n%2,n+3+n%2))].join`
`

3

SOGL , 31 28 27 25 bytes

∫³2\@*O"²b“2⁵I%*r*;I»«nKp

Explicação:

∫                          iterate input times, pushing 1-indexed counter
 ³                         get 3 total copies of it on stack
  2\                       1 if divides by 2, else 0
    @*                     get that many spaces
      O                    output in a new line
       "²b“                push 1122
           2⁵I%*           multiply 1122 by 2%(iteration+1)
                r          convert to string
                 *         multiply by iteration
                  ;I»«     get one iteration variable ontop of stack
                      n    increase, floor divide by 2, multiply by 2 (gets the amount of bricks in a line)
                       Kp  split that multiplied string in pieces of that length

usando esta técnica
Exemplo de saída para 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

não concorrente, 22 bytes

∫³2\@*O"²b“2⁵I%*;I»«mp

O comando mfoi documentado no 1º commit do SOGL , apenas não implementado.


3

05AB1E , 22 21 20 18 17 bytes

Usa o fato interessante de que 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

F4NÌm5÷bDðì}r·IF,

Experimente online!

Explicação

F                     # for N in 0...input-1 do
 4                    # push 4
  NÌ                  # push N+2
    m                 # push 4^(N+2)
     5÷               # integer division by 5
       b              # convert to binary
        D             # duplicate
         ðì           # prepend a space to the copy
           }          # end loop
            r         # reverse stack
             ·        # multiply top of stack by 2
              IF      # input times do
                ,     # print with newline

Desculpe, melhorei minha resposta - ótimo método!
Jonathan Allan

@ JonathanAllan: Claro que sim;) Obrigado! Idéia bem legal de lidar com o recuo com rotações mod2 em sua resposta.
Emigna

2

PHP, 61 59

aa<?for(;++$i<$argn;)echo"
",str_pad(" "[~$i&1],2+$i,bbcc);

funciona praticamente como as versões python, mas usa todas as três cores, se possível. Nenhuma nova linha à direita.

-2 bytes by @user63956. Thanks !

1
Você pode salvar dois bytes com aa<?for....
user63956

1

Pitão , 29 bytes

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

Teste online!

Explicações

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

VQ                               For N in range(0, input)
  I!%hN2pd)                      If N is odd, print a leading space
           Vh/N2          )      For H in range(0, N / 2 + 1)
                   @G%+NH3       Select the letter at position (N + H) % 3 in the alphabet
                 *2              Then make it a two letters string ("aa" or "bb" or "cc")
                p                Print it
                           pb    End the line by printing a new line

Tenho certeza de que há várias maneiras de encurtar esse código, mas agora estou cansado de tudo ... Tentarei mais tarde.


0

Lote, 125 bytes

@set s=█
@for /l %%i in (2,1,%1)do @call:c
:c
@set s= %s:█= %
@set s=%s:▓=█%
@set s=%s:░=▓%
@set s=%s:  =░░%
@echo %s%

Nota: Salve isso no CP437 ou CP850 ou algo parecido. Funciona girando as cores cada vez. Como não consigo mapear a sequência para executar a rotação, utilizo quatro substituições, usando espaços como um estágio temporário. Isso também me permite prefixar um espaço a cada linha, para que dois espaços se transformem em um novo bloco. Saída de amostra:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
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.