Xây cầu thang cho con tôi


25

Hôm nọ, con trai tôi yêu cầu tôi xây cho nó một cầu thang bằng các khối Lego-ish. Và tôi đã nghĩ ra một thứ như thế này:

Cầu thang

Sau đó, con tôi yêu cầu tôi cho một chương trình sử dụng số byte ít nhất tạo ra một cầu thang tương tự trong màn hình máy tính. Tôi không giỏi về , vì vậy tôi cần sự giúp đỡ của bạn. Tôi cần một chương trình:

  • Nhận một số nguyên dương với số cấp mà cầu thang cần phải có.
  • Xuất ra một bản vẽ của một cầu thang, với mẫu bạn nhìn thấy trong hình ảnh.

Đầu ra sẽ ở định dạng văn bản nhưng các viên gạch có thể được phân biệt với nhau. Chẳng hạn, bạn có thể sử dụng ký tự '' làm nửa khối và tô nó theo bất kỳ màu nào bạn muốn hoặc chỉ chọn bất kỳ ký tự nào bạn chọn.

Hạn chế:

  • Các khối cần có ba màu khác nhau, sẽ được sử dụng càng lâu càng tốt (nếu đầu vào là 1 hoặc 2 thì không có đủ các khối để sử dụng cả ba màu). Nếu bạn muốn, bạn có thể sử dụng các ký tự '' hoặc chỉ chọn ba ký tự khác nhau.
  • Không có hai khối có cùng màu hoặc hoa văn có thể nằm cạnh nhau trong một hàng.

Con trai tôi không thực sự quan tâm đến các không gian kéo dài hoặc các đường mới miễn là một cầu thang được vẽ.

Ví dụ (xin lỗi vì sự lựa chọn không tốt của các nhân vật):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
Nói với con bạn rằng niềm vui là tự mình xây dựng / lập trình :-)
Luis Mendo

3
Chào mừng đến với trang web! Kết hợp nghệ thuật ASCII và đầu ra đồ họa thường được tán thành, vì nó dẫn đến hai thách thức song song. Ngoài ra, nếu bạn sử dụng ASCII, tôi sẽ cho phép sử dụng các ký tự ASCII thực tế (tôi nghĩ bạn đã làm, nhưng có lẽ rõ ràng hơn), vì một số ngôn ngữ có thể gặp khó khăn với các ký tự không phải ASCII
Luis Mendo

2
FYI các khối được gọi là Duplo
caird coinheringaahing

10
@cairdcoinheringaahing duplo không có nút tròn.
Christoph

3
@cairdcoinheringaahing Các khối trong Câu hỏi không phải Duplo, Duplo tương thích với Lego , đó là Lego Baby . Họ đã được ban đầu được gọi Duplo Primo và tôi muốn họ có một cái tên khác nhau hơn hoặc của cả hai, nhưng họ có kỹ thuật một sản phẩm khác nhau hơn cả Lego và Duplo.
Draco18

Câu trả lời:


5

Thạch ,  21 19  16 byte

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

Một chương trình đầy đủ in kết quả.

Sử dụng 00, 1122như các khối.

Hãy thử trực tuyến!

Làm sao?

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

Hãy thử trực tuyến!

Chu kỳ giữa các khối 22, 44, ngoại trừ hàng trên cùng là 00. Ví dụ: trên đầu vào 10, in

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

In các hàng có chiều dài tăng dần i=2,3,..bằng cách tạo khoảng itrắng cho các độ dài lẻ, lặp lại thời gian của mẫu và chấm theo chiều dài i. Mô hình là 2244cho tất cả các hàng ngoại trừ cái đầu tiên i=2mà nó 0. Điều này đạt được với biểu thức số học 2%i*1122.


1
Chỉ sử dụng hai màu cho trường hợp 3.
Christoph

Sửa rất thông minh!
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

Giải pháp trước đây.

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

Giải trình:

∫                          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

sử dụng kỹ thuật này
Ví dụ đầu ra cho 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

không cạnh tranh, 22 byte

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

Lệnh mđã được ghi nhận trên cam kết SOGL đầu tiên , chỉ không được thực hiện.


3

05AB1E , 22 21 20 18 17 byte

Sử dụng thực tế thú vị rằng 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Hãy thử trực tuyến!

Giải trình

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

Xin lỗi, tôi đã cải thiện câu trả lời của tôi - phương pháp tốt đẹp mặc dù!
Jonathan Allan

@Jonathan ALLan: Tất nhiên là bạn đã làm;) Cảm ơn! Ý tưởng khá tuyệt vời về việc xử lý vết lõm với các phép quay mod2 trong câu trả lời của bạn.
Emigna

2

PHP, 61 59

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

hoạt động khá giống các phiên bản python nhưng sử dụng cả ba màu nếu có thể. Không có dòng mới.

-2 bytes by @user63956. Thanks !

1
Bạn có thể lưu hai byte với aa<?for....
dùng63956

1

Bình thường , 29 byte

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

Kiểm tra nó trực tuyến!

Giải thích

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

Tôi chắc chắn có rất nhiều cách để rút ngắn mã đó, nhưng tôi là vua mệt mỏi ngay bây giờ ... Sẽ thử sau.


0

Mẻ, 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%

Lưu ý: Lưu cái này trong CP437 hoặc CP850 hoặc một số thứ khác. Hoạt động bằng cách xoay màu mỗi lần. Vì tôi không thể ánh xạ chuỗi để thực hiện xoay vòng, tôi sử dụng bốn thay thế, sử dụng khoảng trắng làm giai đoạn tạm thời. Điều này sau đó cũng cho phép tôi tiền tố một khoảng trắng mỗi dòng, để hai khoảng trắng biến thành một khối mới. Đầu ra mẫu:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.