Zbuduj schody dla mojego dziecka

25

Któregoś dnia mój syn poprosił mnie, żebym zbudował mu klatkę schodową z klocków Lego. I wymyśliłem coś takiego:

Klatka schodowa

Potem moje dziecko poprosiło mnie o program wykorzystujący najmniej bajtów, które wygenerowały podobne schody na ekranie komputera. Nie jestem zbyt dobry w , więc potrzebuję twojej pomocy. Potrzebuję programu, który:

  • Otrzymuje dodatnią liczbę całkowitą z liczbą poziomów, jakie musi mieć schody.
  • Tworzy rysunek klatki schodowej z wzorem widocznym na obrazie.

Dane wyjściowe będą w formacie tekstowym, ale cegły można rozróżnić jeden od drugiego. Na przykład możesz użyć znaku „█” jako pół bloku i pomalować go na dowolny kolor lub po prostu wybrać dowolną postać.

Ograniczenia:

  • Bloki muszą mieć trzy różne kolory, które będą używane tak długo, jak to możliwe (jeśli wejście to 1 lub 2, nie ma wystarczającej liczby bloków, aby użyć wszystkich trzech kolorów). Jeśli chcesz, możesz na przykład użyć znaków „░▒▓” lub po prostu wybrać trzy różne znaki.
  • Żadne dwa bloki tego samego koloru lub wzoru nie mogą znajdować się obok siebie w jednym rzędzie.

Mój syn tak naprawdę nie dba o końcowe spacje lub nowe linie, dopóki narysowane są schody.

Przykłady (przepraszam za zły wybór znaków):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓
Charlie
źródło
17
Powiedz dziecku, że zabawa polega na samodzielnym budowaniu / programowaniu :-)
Luis Mendo
3
Witamy na stronie! Łączenie grafiki ASCII z grafiką jest zwykle lekceważone, ponieważ prowadzi to do dwóch równoległych wyzwań. Ponadto, jeśli wybierzesz ASCII, pozwoliłbym na użycie rzeczywistych znaków ASCII (myślę, że już to robisz, ale być może bardziej wyraźne), ponieważ niektóre języki mogą mieć trudności z znakami spoza ASCII
Luis Mendo
2
FYI bloki nazywają się Duplo
caird coinheringaahing
10
@cairdcoinheringaahing duplo nie ma okrągłych przycisków.
Christoph
3
@cairdcoinheringaahing Bloki w pytaniu nie są Duplo, Duplo jest kompatybilne z Lego , to są Lego Baby . One były pierwotnie zwany Duplo Primo i życzę mieli inną nazwę niż albo z tych dwóch, ale są one technicznie inny produkt niż zarówno Lego i Duplo.
Draco18s,

Odpowiedzi:

5

Galaretka ,  21 19  16 bajtów

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

Pełny program drukujący wynik.

Używa 00, 11i 22jak bloki.

Wypróbuj online!

W jaki sposób?

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
źródło
11

Python 2 , 55 bajtów

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

Wypróbuj online!

Cykle między blokami 22, 44, z wyjątkiem górnego rzędu 00. Na przykład na wejściu 10 drukuje

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Drukuje rzędy o coraz większej długości i=2,3,.., tworząc miejsce na nieparzyste długości, powtarzając iczasy wzoru i przechodząc do długości i. Wzór jest 2244dla wszystkich wierszy z wyjątkiem pierwszego, i=2dla którego jest 0. Osiąga się to za pomocą wyrażenia arytmetycznego 2%i*1122.

xnor
źródło
1
Używa tylko dwóch kolorów dla przypadku 3.
Christoph
Bardzo sprytna poprawka!
Charlie
4

JavaScript (ES6), 80 bajtów

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


JavaScript (ES6), 87 bajtów

Poprzednie rozwiązanie.

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

SOGL , 31 28 27 25 bajtów

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

Wyjaśnienie:

∫                          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

przy użyciu tej techniki
Przykład danych wyjściowych dla 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

niekonkurujące, 22 bajty

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

Polecenie mzostało udokumentowane przy pierwszym zatwierdzeniu SOGL , po prostu nie zostało zaimplementowane.

dzaima
źródło
3

05AB1E , 22 21 20 18 17 bajtów

Wykorzystuje interesujący fakt, że 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Wypróbuj online!

Wyjaśnienie

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
źródło
Przepraszam, poprawiłem odpowiedź - fajna metoda!
Jonathan Allan
@JonathanAllan: Oczywiście, że tak;) Dzięki! Całkiem fajny pomysł obsługi wcięcia z obrotami mod2 w twojej odpowiedzi.
Emigna
2

PHP, 61 59

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

działa bardzo podobnie do wersji Pythona, ale w miarę możliwości używa wszystkich trzech kolorów. Brak końcowej nowej linii.

-2 bytes by @user63956. Thanks !
Christoph
źródło
1
Możesz zapisać dwa bajty za pomocą aa<?for....
user63956
1

Pyth , 29 bajtów

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

Przetestuj online!

Objaśnienia

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

Jestem pewien, że istnieje wiele sposobów na skrócenie tego kodu, ale teraz jestem królem zmęczenia ... Spróbuję później.

Jim
źródło
0

Partia, 125 bajtów

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

Uwaga: Zapisz to w CP437 lub CP850 lub niektórych podobnych. Działa poprzez obracanie kolorów za każdym razem. Ponieważ nie mogę odwzorować ciągu w celu wykonania obrotu, używam czterech zamienników, używając spacji jako tymczasowego etapu. To pozwala mi również na prefiks spacji w każdym wierszu, dzięki czemu dwie spacje zamieniają się w nowy blok. Przykładowe dane wyjściowe:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Neil
źródło