Побудуйте сходи для моєї дитини


25

Днями мій син попросив мене побудувати йому сходи за допомогою блоків Lego-ish. І я придумав щось подібне:

Сходи

Тоді моя дитина попросила мене про програму, використовуючи найменшу кількість байтів, які генерували схожі сходи на екрані комп'ютера. Я не такий хороший у , тому мені потрібна ваша допомога. Мені потрібна програма, яка:

  • Отримує додатне ціле число з кількістю рівнів, на яких потрібно мати сходи.
  • Виводить креслення сходів із малюнком, який ви бачите на зображенні.

Вихід буде у текстовому форматі, але цеглини можна відрізнити один від іншого. Наприклад, ви можете використовувати символ █ як півблоку і пофарбувати його в будь-який колір, або просто вибрати будь-який символ на ваш вибір.

Обмеження:

  • Блоки повинні бути з трьох різних кольорів, які будуть використовуватися якомога довше (якщо вхід 1 або 2, недостатньо блоків для використання всіх трьох кольорів). Якщо ви хочете, ви можете, наприклад, використовувати символи '░▒▓' або просто вибрати три різних символи.
  • Немає двох блоків одного кольору або візерунка не можуть бути поруч в одному ряду.

Мій син не дуже піклується про проміжні місця або нові лінії, доки намальована сходи.

Приклади (вибачте за поганий вибір персонажів):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
Скажіть своїй дитині, що весело в тому, щоб будувати / програмувати це сам :-)
Луїс Мендо

3
Ласкаво просимо на сайт! Поєднання мистецтва та графічного виходу ASCII, як правило, нахмуриться, оскільки це призводить до свого роду двох паралельних викликів. Крім того, якщо ви перейдете на ASCII, я б дозволив використовувати фактичні символи ASCII (я думаю, ви це вже робите, але, можливо, буде більш чітким), оскільки деякі мови можуть мати труднощі з символами, що не належать до ASCII
Луїс Мендо

2
FYI блоки називаються Duplo
caird coinheringaahing

10
@cairdcoinheringaahing duplo не має круглих кнопок.
Крістоф

3
@cairdcoinheringaahing Блоки у запитанні не є Duplo, Duplo сумісний з Lego , це Lego Baby . Вони були спочатку називали Duplo Primo , і я бажаю , щоб вони мали іншу назву , ніж будь-який з цих двох, але вони технічно інший продукт , ніж як Лего і Duplo.
Draco18s

Відповіді:


5

Желе ,  21 19  16 байт

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

Повна програма, що друкує результат.

Використовує 00, 11і 22як блоки.

Спробуйте в Інтернеті!

Як?

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 байт

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

Спробуйте в Інтернеті!

Цикли між блоками 22, 44, за винятком верхнього ряду 00. Наприклад, на вході 10 друкується

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Друкує рядки збільшення довжини i=2,3,.., створюючи простір для непарних довжин, повторюючи часи візерунка iі скорочуючи до довжини i. Візерунок є 2244для всіх рядків, крім першого, i=2для якого він є 0. Це досягається арифметичним виразом 2%i*1122.


1
Для випадку 3 використовується лише два кольори
Крістоф

Дуже розумне виправлення!
Чарлі

4

JavaScript (ES6), 80 байт

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


JavaScript (ES6), 87 байт

Попереднє рішення.

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 байт

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

Пояснення:

∫                          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

за допомогою цієї методики
Приклад виведення для 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

неконкурентоспроможний, 22 байти

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

Команда mбула задокументована на першому комітеті SOGL , просто не виконана.


3

05AB1E , 22 21 20 18 17 байт

Використовує цікавий факт, що 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

Спробуйте в Інтернеті!

Пояснення

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

Вибачте, я вдосконалив свою відповідь - хоча приємний метод!
Джонатан Аллан

@JonathanAllan: Звичайно, ти зробив;) Дякую! Дуже класна ідея поводження з відступом з обертаннями mod2 у вашій відповіді.
Емінья

2

PHP, 61 59

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

працює майже як версії python, але використовує всі три кольори, якщо це можливо. Ніякої нової лінії немає.

-2 bytes by @user63956. Thanks !

1
Ви можете зберегти два байти за допомогою aa<?for....
user63956

1

Pyth , 29 байт

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

Перевірте це в Інтернеті!

Пояснення

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

Я впевнений, що існує багато способів скоротити цей код, але я король втомився прямо зараз. Спробую пізніше.


0

Пакетна, 125 байт

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

Примітка. Збережіть це в CP437 або CP850 або деяких подібних. Працює, обертаючи кольори кожен раз. Оскільки я не можу скласти карту рядка для виконання обертання, я використовую чотири заміни, використовуючи пробіли як тимчасовий етап. Це також дозволяє мені префіксувати пробіл у кожному рядку, щоб два пробіли перетворилися на новий блок. Вибірка зразка:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.