Construis un escalier pour mon enfant

25

L'autre jour, mon fils m'a demandé de lui construire un escalier en utilisant des blocs Lego-ish. Et j'ai trouvé quelque chose comme ça:

Escalier

Ensuite, mon enfant m'a demandé un programme utilisant le moins d'octets générant un escalier similaire sur un écran d'ordinateur. Je ne suis pas très bon en , j'ai donc besoin de votre aide. J'ai besoin d'un programme qui:

  • Reçoit un entier positif avec le nombre de niveaux que l'escalier doit avoir.
  • Produit un dessin d'un escalier, avec le motif que vous voyez dans l'image.

La sortie sera au format texte mais les briques peuvent être distinguées les unes des autres. Par exemple, vous pouvez utiliser le caractère «█» comme un demi-bloc et le peindre dans la couleur de votre choix, ou simplement choisir le caractère de votre choix.

Restrictions:

  • Les blocs doivent être de trois couleurs différentes, qui seront utilisées aussi longtemps que possible (si l'entrée est 1 ou 2, il n'y a pas assez de blocs pour utiliser les trois couleurs). Si vous le souhaitez, vous pouvez utiliser les caractères «░▒▓», par exemple, ou simplement sélectionner trois caractères différents.
  • Deux blocs de la même couleur ou du même motif ne peuvent pas être côte à côte sur une même rangée.

Mon fils ne se soucie pas vraiment des espaces de fuite ou des nouvelles lignes tant qu'un escalier est dessiné.

Exemples (désolé pour le mauvais choix de personnages):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓
Charlie
la source
17
Dites à votre enfant que le plaisir est de le construire / le programmer lui-même :-)
Luis Mendo
3
Bienvenue sur le site! La combinaison de l'art ASCII et de la sortie graphique est généralement mal vue, car elle entraîne en quelque sorte deux défis parallèles. De plus, si vous optez pour ASCII, j'autoriserais l'utilisation de caractères ASCII réels (je pense que vous le faites déjà, mais peut-être plus explicite), car certaines langues peuvent avoir des problèmes avec les caractères non ASCII
Luis Mendo
2
Pour info les blocs s'appellent Duplo
caird coinheringaahing
10
@cairdcoinheringaahing duplo n'a pas de boutons ronds.
Christoph
3
@cairdcoinheringaahing Les blocs de la Question ne sont pas Duplo, Duplo est compatible Lego , ce sont Lego Baby . Ils ont été à l' origine appelé Duplo Primo et je souhaite qu'ils avaient un autre nom que ce soit de ces deux, mais ils sont techniquement un produit différent que les deux Lego et Duplo.
Draco18s

Réponses:

5

Gelée ,  21 19  16 octets

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

Un programme complet imprimant le résultat.

Utilisations 00, 11et 22que les blocs.

Essayez-le en ligne!

Comment?

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)
Jonathan Allan
la source
11

Python 2 , 55 octets

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

Essayez-le en ligne!

Cycles entre les blocs de 22, 44, sauf que la ligne supérieure est 00. Par exemple, sur l'entrée 10, imprime

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Imprime des rangées de plus en plus longues i=2,3,..en créant un espace pour les longueurs impaires, en répétant les itemps des motifs et en tranchant jusqu'à la longueur i. Le modèle est 2244pour toutes les lignes sauf la première i=2pour laquelle il l'est 0. Ceci est réalisé avec l'expression arithmétique 2%i*1122.

xnor
la source
1
Utilise seulement deux couleurs pour le cas 3.
Christoph
Solution très intelligente!
Charlie
4

JavaScript (ES6), 80 octets

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


JavaScript (ES6), 87 octets

Solution précédente.

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

SOGL , 31 28 27 25 octets

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

Explication:

∫                          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

en utilisant cette technique
Exemple de sortie pour 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

non concurrent, 22 octets

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

La commande ma été documentée lors du 1er commit SOGL , mais pas implémentée.

dzaima
la source
3

05AB1E , 22 21 20 18 17 octets

Utilise le fait intéressant que 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Essayez-le en ligne!

Explication

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
Emigna
la source
Désolé, j'ai amélioré ma réponse - belle méthode cependant!
Jonathan Allan
@JonathanAllan: Bien sûr que vous l'avez fait;) Merci! Idée plutôt cool de gérer l'indentation avec des rotations mod2 dans votre réponse.
Emigna
2

PHP, 61 59

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

fonctionne à peu près comme les versions python mais utilise les trois couleurs si possible. Pas de nouvelle ligne de fuite.

-2 bytes by @user63956. Thanks !
Christoph
la source
1
Vous pouvez enregistrer deux octets avec aa<?for....
user63956
1

Pyth , 29 octets

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

Testez-le en ligne!

Explications

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

Je suis sûr qu'il existe de nombreuses façons de raccourcir ce code, mais je suis le roi de la fatigue en ce moment ... J'essaierai plus tard.

Jim
la source
0

Lot, 125 octets

@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%

Remarque: enregistrez-le dans CP437 ou CP850 ou un autre. Fonctionne en faisant tourner les couleurs à chaque fois. Comme je ne peux pas mapper la chaîne pour effectuer la rotation, j'utilise quatre remplacements, en utilisant des espaces comme étape temporaire. Cela me permet également de préfixer un espace à chaque ligne, de sorte que deux espaces se transforment en un nouveau bloc. Exemple de sortie:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Neil
la source