Baue eine Treppe für mein Kind


25

Neulich bat mich mein Sohn, ihm eine Treppe aus Legoblöcken zu bauen. Und mir ist so etwas eingefallen:

Treppe

Dann bat mich mein Kind um ein Programm mit der geringsten Anzahl von Bytes, die eine ähnliche Treppe auf einem Computerbildschirm erzeugten. Ich bin nicht so gut im , also brauche ich deine Hilfe. Ich brauche ein Programm, das:

  • Erhält eine positive Ganzzahl mit der Anzahl der Stufen, die die Treppe haben muss.
  • Gibt eine Zeichnung einer Treppe mit dem Muster aus, das Sie im Bild sehen.

Die Ausgabe erfolgt im Textformat, die Bausteine ​​können jedoch voneinander unterschieden werden. Sie können beispielsweise das Zeichen '█' als halben Block verwenden und in einer beliebigen Farbe malen oder einfach ein beliebiges Zeichen Ihrer Wahl auswählen.

Beschränkungen:

  • Blöcke müssen drei verschiedene Farben haben, die so lange wie möglich verwendet werden (bei Eingabe von 1 oder 2 sind nicht genügend Blöcke vorhanden, um alle drei Farben zu verwenden). Wenn Sie möchten, können Sie zum Beispiel die Zeichen "░" verwenden oder einfach drei verschiedene Zeichen auswählen.
  • Es dürfen keine zwei Blöcke der gleichen Farbe oder des gleichen Musters in einer einzigen Reihe nebeneinander liegen.

Mein Sohn kümmert sich nicht wirklich um Leerzeichen oder neue Linien, solange eine Treppe gezogen wird.

Beispiele (Entschuldigung für die schlechte Zeichenauswahl):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
Sagen Sie Ihrem Kind, dass es Spaß macht, es selbst zu bauen / zu programmieren :-)
Luis Mendo

3
Willkommen auf der Seite! Das Kombinieren von ASCII-Grafik und grafischer Ausgabe ist normalerweise verpönt, da sich daraus zwei parallele Herausforderungen ergeben. Wenn Sie sich für ASCII entscheiden, würde ich auch zulassen, dass tatsächliche ASCII-Zeichen verwendet werden (ich denke, dass Sie dies bereits tun, aber möglicherweise expliziter), da einige Sprachen möglicherweise Probleme mit Nicht-ASCII-Zeichen haben
Luis Mendo

2
Zu Ihrer Information werden die Blöcke Duplo genannt
caird coinheringaahing

10
@cairdcoinheringaahing duplo hat keine runden Knöpfe.
Christoph

3
@cairdcoinheringaahing Die Blöcke in der Frage sind nicht Duplo, Duplo ist Lego-kompatibel , das sind Lego Baby . Sie waren ursprünglich Duplo Primo und ich wünschte, sie hätten einen anderen Namen als beide , aber sie sind technisch gesehen ein anderes Produkt als Lego und Duplo.
Draco18s

Antworten:


5

Jelly ,  21 19  16 Bytes

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

Ein volles Programm druckt das Ergebnis aus.

Verwendet 00, 11und 22als Blöcke.

Probieren Sie es online!

Wie?

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

Probieren Sie es online!

Wechselt zwischen Blöcken von 22, 44bis auf die oberste Zeile00 . Beispiel: Bei Eingabe 10 wird gedruckt

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Druckt Zeilen mit zunehmender Länge, i=2,3,..indem ein Leerzeichen für ungerade Längen erstellt, die Musterzeiten wiederholt iund die Länge angepasst wird i. Das Muster gilt 2244für alle Zeilen mit Ausnahme der ersten, i=2für die es gilt 0. Dies wird mit dem arithmetischen Ausdruck erreicht 2%i*1122.


1
Verwendet nur zwei Farben für Fall 3.
Christoph

Sehr clevere Lösung!
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

Vorherige Lösung.

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

Erläuterung:

∫                          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

mit dieser Technik
Beispielausgabe für 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

Nicht konkurrierend, 22 Bytes

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

Der Befehl mwurde beim 1. SOGL-Commit dokumentiert , nur nicht implementiert.


3

05AB1E , 22 21 20 18 17 Bytes

Nutzt die interessante Tatsache, dass 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Probieren Sie es online!

Erläuterung

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

Entschuldigung, ich habe meine Antwort verbessert - nette Methode!
Jonathan Allan

@ JonathanAllan: Natürlich hast du;) Danke! Ziemlich coole Idee, den Einzug mit Mod2-Rotationen in der Antwort zu behandeln.
Emigna

2

PHP, 61 59

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

Funktioniert ähnlich wie die Python-Versionen, verwendet jedoch nach Möglichkeit alle drei Farben. Keine nachgestellte neue Zeile.

-2 bytes by @user63956. Thanks !

1
Mit können Sie zwei Bytes speichern aa<?for....
user63956

1

Pyth , 29 Bytes

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

Online testen!

Erklärungen

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

Ich bin mir sicher, dass es viele Möglichkeiten gibt, diesen Code zu verkürzen, aber ich bin im Moment ein König der Müdigkeit ... Werde es später versuchen.


0

Batch, 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%

Hinweis: Speichern Sie dies in CP437 oder CP850 oder einem anderen. Arbeitet, indem die Farben jedes Mal gedreht werden. Da ich die Zeichenfolge nicht zuordnen kann, um die Drehung durchzuführen, verwende ich vier Ersetzungen, wobei Leerzeichen als temporäre Bühne verwendet werden. Dadurch kann ich dann auch jeder Zeile ein Leerzeichen voranstellen, sodass aus zwei Leerzeichen ein neuer Block wird. Beispielausgabe:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.