Costruisci una scala per mio figlio


25

L'altro giorno, mio ​​figlio mi ha chiesto di costruirgli una scala usando i blocchi di Lego. E ho pensato a qualcosa del genere:

Scala

Quindi mio figlio mi ha chiesto un programma usando il minor numero di byte che generava una scala simile sullo schermo di un computer. Non sono così bravo nel , quindi ho bisogno del tuo aiuto. Ho bisogno di un programma che:

  • Riceve un numero intero positivo con il numero di livelli che la scala deve avere.
  • Emette un disegno di una scala, con il motivo che vedi nell'immagine.

L'output sarà in formato testo ma i mattoni possono essere distinti l'uno dall'altro. Ad esempio, puoi usare il carattere '█' come mezzo blocco e dipingerlo in qualsiasi colore tu voglia, o semplicemente scegliere qualsiasi personaggio di tua scelta.

restrizioni:

  • I blocchi devono essere di tre colori diversi, che verranno utilizzati il ​​più a lungo possibile (se l'input è 1 o 2 non ci sono abbastanza blocchi per usare tutti e tre i colori). Se lo desideri, puoi utilizzare i caratteri '░▒▓', ad esempio, o semplicemente selezionare tre caratteri diversi.
  • Non ci sono due blocchi dello stesso colore o modello in una riga.

A mio figlio non importa davvero di trascinare spazi o nuove linee fintanto che viene disegnata una scala.

Esempi (scusate per la cattiva scelta dei personaggi):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
Di 'a tuo figlio che il divertimento è costruirlo / programmarlo da solo :-)
Luis Mendo,

3
Benvenuti nel sito! La combinazione di arte ASCII e output grafico è generalmente disapprovata, poiché si traduce in una sorta di due sfide parallele. Inoltre, se scegli ASCII, consentirei di utilizzare i caratteri ASCII effettivi (penso che tu lo faccia già, ma forse essere più esplicito), poiché alcune lingue potrebbero avere difficoltà con caratteri non ASCII
Luis Mendo,

2
Cordiali saluti i blocchi si chiamano Duplo
caird coinheringaahing il

10
@cairdcoinheringaahing duplo non ha pulsanti rotondi.
Christoph,

3
@cairdcoinheringaahing I blocchi nella domanda non sono Duplo, Duplo è compatibile con Lego , quelli sono Lego Baby . Inizialmente si chiamavano Duplo Primo e vorrei che avessero un nome diverso da uno di quei due, ma tecnicamente sono un prodotto diverso rispetto a Lego e Duplo.
Draco18s

Risposte:


5

Gelatina ,  21 19  16 byte

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

Un programma completo che stampa il risultato.

Usi 00, 11e 22come i blocchi.

Provalo online!

Come?

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 byte

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

Provalo online!

Cicli tra i blocchi di 22, 44, tranne la riga superiore è 00. Ad esempio, sull'ingresso 10, stampa

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Stampa righe di lunghezza crescente i=2,3,..creando uno spazio per lunghezze dispari, ripetendo i itempi del motivo e troncando alla lunghezza i. Il modello è 2244per tutte le righe tranne la prima i=2per cui è 0. Ciò si ottiene con l'espressione aritmetica 2%i*1122.


1
Utilizza solo due colori per il caso 3.
Christoph

Soluzione molto intelligente!
Charlie,

4

JavaScript (ES6), 80 byte

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


JavaScript (ES6), 87 byte

Soluzione precedente.

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 byte

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

Spiegazione:

∫                          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 questa tecnica
Esempio di output per 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

non competitivo, 22 byte

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

Il comando mè stato documentato sul primo commit SOGL , ma non implementato.


3

05AB1E , 22 21 20 18 17 byte

Usa il fatto interessante che 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Provalo online!

Spiegazione

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

Mi dispiace, ho migliorato la mia risposta - bel metodo però!
Jonathan Allan,

@JonathanAllan: Certo che l'hai fatto;) Grazie! Un'idea abbastanza interessante di gestire il rientro con rotazioni mod2 nella tua risposta.
Emigna,

2

PHP, 61 59

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

funziona più o meno come le versioni di Python ma utilizza tutti e tre i colori se possibile. Nessuna nuova riga finale.

-2 bytes by @user63956. Thanks !

1
È possibile salvare due byte con aa<?for....
user63956

1

Pyth , 29 byte

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

Provalo online!

spiegazioni

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

Sono sicuro che ci sono molti modi per abbreviare quel codice, ma sono il re della stanca in questo momento ... Ci proverò più tardi.


0

Lotto, 125 byte

@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: salvarlo in CP437 o CP850 o in parte. Funziona ruotando i colori ogni volta. Poiché non riesco a mappare sulla stringa per eseguire la rotazione, utilizzo quattro sostituzioni, utilizzando gli spazi come fase temporanea. Questo mi permette anche di anteporre uno spazio ad ogni riga, in modo che due spazi si trasformino in un nuovo blocco. Uscita campione:

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