Построить лестницу для моего ребенка


25

На днях мой сын попросил меня построить для него лестницу из легошишских блоков. И я придумал что-то вроде этого:

лестница

Затем мой ребенок попросил у меня программу, использующую наименьшее количество байтов, которые генерировали аналогичную лестницу на экране компьютера. Я не очень хорош в , поэтому мне нужна ваша помощь. Мне нужна программа, которая:

  • Получает положительное целое число с количеством уровней, которые должна иметь лестница.
  • Выводит чертеж лестницы с рисунком, который вы видите на изображении.

Вывод будет в текстовом формате, но кирпичи можно отличить один от другого. Например, вы можете использовать символ «█» в качестве половины блока и раскрасить его в любой цвет, который вы хотите, или просто выбрать любой символ по вашему выбору.

Ограничения:

  • Блоки должны быть трех разных цветов, которые будут использоваться как можно дольше (при вводе 1 или 2 недостаточно блоков для использования всех трех цветов). Если вы хотите, вы можете использовать символы «░▒▓», например, или просто выбрать три разных символа.
  • В одном ряду не может быть двух блоков одного цвета или рисунка.

Моему сыну на самом деле нет дела до конечных пробелов или новых линий, пока идет лестница.

Примеры (извините за неудачный выбор символов):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
Скажите своему ребенку, что самое интересное в его построении / программировании :-)
Луис Мендо

3
Добро пожаловать на сайт! Комбинирование ASCII-графики и графического вывода обычно не одобряется, так как это приводит к возникновению двух параллельных проблем. Кроме того, если вы выберете ASCII, я бы позволил использовать фактические символы ASCII (я думаю, что вы уже это делаете, но, возможно, будете более явными), поскольку некоторые языки могут испытывать трудности с не-ASCII символами
Луис Мендо

2
К вашему сведению блоки называются Duplo
Caird Coneheringaahing

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была задокументирована на 1-м коммите 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.