Bangun tangga untuk anak saya

25

Suatu hari, putra saya meminta saya untuk membangun tangga menggunakan balok Lego-ish. Dan saya datang dengan sesuatu seperti ini:

Tangga

Kemudian anak saya meminta saya untuk sebuah program menggunakan jumlah byte terkecil yang menghasilkan tangga serupa di layar komputer. Saya tidak pandai , jadi saya butuh bantuan Anda. Saya membutuhkan program yang:

  • Menerima bilangan bulat positif dengan jumlah level yang perlu dimiliki tangga.
  • Menghasilkan gambar tangga, dengan pola yang Anda lihat pada gambar.

Outputnya akan dalam format teks tetapi batu bata dapat dibedakan satu sama lain. Misalnya, Anda dapat menggunakan karakter '█' sebagai setengah blok dan melukisnya dengan warna apa pun yang Anda inginkan, atau cukup pilih karakter apa pun yang Anda pilih.

Pembatasan:

  • Blok harus terdiri dari tiga warna berbeda, yang akan digunakan selama mungkin (jika inputnya 1 atau 2 tidak ada blok yang cukup untuk menggunakan ketiga warna). Jika Anda ingin, Anda dapat menggunakan karakter '░▒▓', misalnya, atau hanya memilih tiga karakter yang berbeda.
  • Tidak ada dua blok dengan warna atau pola yang sama yang dapat bersebelahan dalam satu baris.

Putraku tidak terlalu peduli tentang jejak ruang atau garis baru selama tangga ditarik.

Contoh (maaf untuk pilihan karakter yang buruk):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓
Charlie
sumber
17
Beri tahu anak Anda bahwa kesenangan itu ada dalam membangun / memprogramnya sendiri :-)
Luis Mendo
3
Selamat datang di situs ini! Menggabungkan seni ASCII dan output grafis biasanya disukai, karena menghasilkan semacam dua tantangan paralel. Juga, jika Anda menggunakan ASCII, saya akan mengizinkan karakter ASCII aktual untuk digunakan (saya pikir Anda sudah melakukannya, tetapi mungkin lebih eksplisit), karena beberapa bahasa mungkin mengalami kesulitan dengan karakter non ASCII
Luis Mendo
2
FYI blok disebut Duplo
caird coinheringaahing
10
Duplo @cairdcoinheringaahing tidak memiliki tombol bundar.
Christoph
3
@cairdcoinheringaahing Blok dalam Pertanyaan bukan Duplo, Duplo kompatibel dengan Lego , itu adalah Lego Baby . Mereka yang awalnya disebut Duplo Primo dan saya berharap mereka memiliki nama yang berbeda dari salah satu dari dua, tetapi mereka secara teknis produk yang berbeda dari kedua Lego dan Duplo.
Draco18s

Jawaban:

5

Jelly ,  21 19  16 byte

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

Program lengkap mencetak hasilnya.

Penggunaan 00,, 11dan 22sebagai blok.

Cobalah online!

Bagaimana?

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
sumber
11

Python 2 , 55 byte

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

Cobalah online!

Siklus di antara blok 22, 44, kecuali baris paling atas 00. Misalnya, pada input 10, dicetak

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Mencetak baris i=2,3,..dengan panjang yang bertambah dengan menciptakan ruang untuk panjang ganjil, mengulangi waktu pola i, dan memotong panjang i. Pola ini 2244untuk semua baris kecuali yang pertama i=2yang itu 0. Ini dicapai dengan ekspresi aritmatika 2%i*1122.

Tidak
sumber
1
Hanya menggunakan dua warna untuk case 3.
Christoph
Memperbaiki sangat pintar!
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

Solusi sebelumnya.

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

SOGL , 31 28 27 25 byte

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

Penjelasan:

∫                          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

menggunakan teknik ini
Contoh output untuk 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

non-bersaing, 22 byte

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

Perintah mtelah didokumentasikan pada komit SOGL ke-1 , tidak diimplementasikan.

dzaima
sumber
3

05AB1E , 22 21 20 18 17 byte

Menggunakan fakta menarik itu 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Cobalah online!

Penjelasan

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
sumber
Maaf, saya meningkatkan jawaban saya - metode yang bagus!
Jonathan Allan
@ JonathanAllan: Tentu saja kamu;) Terima kasih! Ide yang cukup keren untuk menangani lekukan dengan rotasi mod2 dalam jawaban Anda.
Emigna
2

PHP, 61 59

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

bekerja sangat mirip dengan versi python tetapi menggunakan ketiga warna jika memungkinkan. Tidak ada garis baru.

-2 bytes by @user63956. Thanks !
Christoph
sumber
1
Anda dapat menyimpan dua byte dengan aa<?for....
user63956
1

Pyth , 29 byte

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

Uji secara online!

Penjelasan

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

Saya yakin ada banyak cara untuk mempersingkat kode itu, tetapi saya raja yang lelah sekarang ... Akan mencoba nanti.

Jim
sumber
0

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

Catatan: Simpan ini di CP437 atau CP850 atau semacamnya. Bekerja dengan memutar warna setiap waktu. Karena saya tidak bisa memetakan string untuk melakukan rotasi, saya menggunakan empat penggantian, menggunakan spasi sebagai tahap sementara. Ini kemudian juga memungkinkan saya untuk awalan spasi setiap baris, sehingga dua spasi berubah menjadi blok baru. Output sampel:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Neil
sumber