Построить Торнадо


31

По мне, торнадо выглядит так:

########
#######
 ######
  #####
   ####
   ###
    ##
     #

Этот торнадо начинается с ширины n, и в каждой следующей строке символ удаляется слева или справа, в зависимости от ввода.

вход

Входными данными будут список каких-либо двух уникальных значений (работает также строка из двух уникальных символов) и необязательное положительное целое число, указывающее начальную ширину. Если необязательное целое число не взято, то начальная ширина на 1 больше длины списка. Пусть начальная ширина будет n.

Как сделать торнадо

В моем примере я выбираю свой список, содержащий 1s и 0s, хотя вы можете выбрать любые два различных константных значения или строку из любых двух различных константных символов.

Первая строка будет состоять из nнепробельных символов (вы можете выбрать любой непротиворечивый символ; я выберу #для своего примера).

Затем для каждого номера в списке, если номер есть 0, удалите левый символ и создайте новую строку; если это 1, удалите правильный символ и создайте новую строку.

Таким образом, вышеуказанный торнадо является выходом для 8, [1, 0, 0, 0, 1, 0, 0].

Выход

Выходными данными могут быть список строк, список списков символов или многострочная строка. Конечный пробел в каждой строке разрешен, а завершающий символ новой строки в конце разрешен.

Тестовые случаи

Эти тесты включают начальную ширину и списки использования 1, 0.

5, [1,0,0,1]

#####
####
 ###
  ##
  #

10, [1,0,0,1,0,1,0,0,1]

##########
#########
 ########
  #######
  ######
   #####
   ####
    ###
     ##
     #

7, [1,1,1,1,1,1]

#######
######
#####
####
###
##
#

100,
 [1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,1,0,1,1,1,1,0,1,0,1,1,0,0,1,0,1,1,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1]

Длинный тест

правила

  • Применяются стандартные лазейки
  • Самый короткий код в байтах побеждает!
  • Фон не должен быть пробелом (я забыл указать это ранее).
  • Ваш язык должен поддерживать только те числа (ширины), которые он может обработать, но если ваш переводчик был переписан с большим размером, он должен работать теоретически.

Реализация эталона


3
Из ваших примеров видно, что начальная буква всегда будет на 1 больше длины списка. Можем ли мы привести пример, где это не так? Может ли начальная ширина быть меньше длины списка?
Чарли

@CarlosAlejo Нет ... Тогда это не имеет смысла, потому что тогда у вас не будет достаточно элементов для удаления в конце ...
HyperNeutrino

4
Очки, которые @HyperNeutrino использовал, чтобы увидеть свой первый торнадо: i.imgur.com/TzMm94a.png
Волшебная урна осьминога

@MagicOctopusUrn ... lol
HyperNeutrino

Ответы:



9

Python 2 , 66 59 байт

-7 байт благодаря Арнольду Палмеру

x,z=input()
for i in range(x):print' '*sum(z[:i])+'#'*(x-i)

Попробуйте онлайн!

0убрать справа, 1убрать слева


1
Ниндзя меня: (((
Койшор Рой

Тот же самый человек: /
Арнольд Палмер

Сохранить 7 байт, заменяя len(z)+1с xесли «необязательным положительным целым числом» означает , что вы не должны использовать его. Формулировка вопроса звучит так, как будто это разрешено, поскольку в нем говорится «Если необязательное целое число не взято», а не «Если необязательное целое число не задано».
Арнольд Палмер

6

vim, 85 82 байта

o"cp:s/#/ <C-v><CR>0"cy$<ESC>"ayy7hR$/<ESC>"bdd:s/[][, ]\+/<C-v><CR>@/g<CR>ggAa#<C-v><ESC><ESC>^D@"^"cy$:2,$:norm D@"

<ESC>является 0x1B, <CR>это 0x0D, <C-v>является 0x16. И <ESC>OHявляется многобайтовой последовательностью, представляющей ключ HOME.

Входные данные используют aв качестве значения «удалить влево» и bв качестве значения «удалить влево».

" @a will remove from the left; @b will remove from the right.
o"cp:s/#/ <C-v><CR>0"cy$<ESC>"ayy
7hR$/<ESC>"bdd

" split the input into digestible chunks
:s/[][, ]\+/<C-v><CR>@/g<CR>
gg

" Create the first line
Aa#<C-v><ESC><ESC>
^D
@"^"cy$

" Create tornado
:2,$:norm D@"

Нет ссылки TIO, к сожалению. Я не смог заставить его работать под V. Test, скопировав код в tornado.vim (заменив <ESC>и т. Д. Их действительными байтами) и выполнив следующее:

$ echo '8, [b, a, a, a, b, a, a]' > a.txt
$ { cat tornado.vim; echo ':wq'; } | vim a.txt
$ cat a.txt

-3 байта по предложению Нейла.


Вы не можете использовать ^вместо ␛OH?
Нил

@Neil ^переходит к первому непустому символу. ␛OHпереходит к первому персонажу
Рэй

1
Ах, прости, я имел в виду 0, не так ли ...
Нил

@Neil В таком случае, да, я должен это делать. Спасибо.
Рэй

5

05AB1E , 11 9 байтов

-2 байта благодаря Эрику Аутгольферу

0×=²v¨yú=

Удалить слева: 1
Удалить справа:0

Попробуйте онлайн!

0×        # Make a string of n 0s
  =       # Print without popping
   ²v     # For each character in input (call it y):
     ¨    #   Remove the last character of the current string
      yú  #   Pad with y spaces
        = #   Print without popping

0×ηsηOимеет такой большой потенциал, но я не могу понять это до 11 байтов.
Волшебная Осьминог Урна

Держите последнюю версию и заменить ðy×ìс на -2.
Эрик Outgolfer

4

Сетчатка , 30 28 байт

.?
$`#$&$'¶
T`d`#`#.*
T`d` _

Попробуйте онлайн! Принимает только строку из 0 и 1 и вычисляет ширину на основе строки. Объяснение: Первый этап берет входную строку и дублирует ее один раз для каждой граничной точки, вставляя #в этой точке. Затем второй этап меняет все цифры после #более на #s, создавая треугольник. Затем третий набор удаляет все оставшиеся и заменяет нули на пробелы, что приводит к «колебанию» торндао.


3

J, 32 байта

' #'#~[:(],.1+i.@-@#)0,(+/\@:-.)

ungolfed

' #'#~ [: ( ] ,. 1+i.@-@# )  0 , (+/\ @: -.)

Попробуйте онлайн!


19 байт ' #'#~0(,.#\.)@,+/\, где входной сигнал инвертируется из выборки, поскольку запрос позволяет выбрать два различных значения.
миль

@ миль ты для этого и вашего другого комментария. действительно ценю их и, пожалуйста, продолжайте.
Иона


3

R , 85 82 байт

3 байта сохранены благодаря Джузеппе

function(n,l)for(k in 1:n)cat(rep(" ",sum(c(0,l)[1:k])),rep("%",n-k+1),"
",sep="")

Попробуйте онлайн!

Объяснение:

function(n,l){
  for(k in 1:n){                      # Proceed line by line
    cat(                              # Concatenate...
        rep(" ",sum(c(0,l)[1:k])),    # ...required number of leading spaces,...
        rep("%",n-k+1),               # ...required number of tornado characters...
        "\n",                         # ...and a new line.
        sep=""                        # Join without spaces
        )
  }
}

Я знал, что сделать матрицу было не лучшим вариантом!
Джузеппе

1
82 байта - сбрил {}и использовал буквальный '\n'
Джузеппе

3

Haskell, 50 байтов

h n=scanl(\s i->[(' ':),id]!!i$init s)$'#'<$[1..n]

Попробуйте онлайн!

Если входной список может быть списком имен функций, мы можем сохранить байт

Haskell, 49 байтов

f=id
g=(' ':)
h n=scanl(flip id.init)$'#'<$[1..n]

Пример использования: h 5 [g,f,f,g].

Попробуйте онлайн!

Как это работает:

           '#'<$[1..n]   -- build the first line of the tornado, i.e. n times '#'
scanl(    )              -- repeatedly apply the given function to the starting
                         -- value and the next element of the input list and
                         -- return a list of the intermediate results
  \s i->                 -- the function takes a string s and a number i
            init s       -- and first drops the last element of s
      [    ]!!i          -- and then picks and apply a funtion from the list
        (' ':)           --  i = 0:  prepend a space
        id               --  i = 1:  do nothing

2

Python 2, 58 57 байт

редактирование: сохранено 1 байт благодаря xnor

l,a=input()
s="#"*l
for i in a+[0]:print s;s=" "*i+s[:-1]

Попробуйте онлайн!

1 удалить слева, 0 удалить справа.


1
Я думаю, что вы можете сделать s=" "*i+s[:-1]с левой и правой поменять местами.
xnor

2

R , 116 109 102 байт

-5 байт благодаря пользователю 2390246 (и еще 2 я спас сам)

Outgolfed пользователем 2390246

function(n,l){k=cumsum
m=matrix(' ',n,n)
for(i in 1:n)m[k(c(1,!l))[i]:k(c(n,-l))[i],i]='#'
write(m,'',n,,'')}

Попробуйте онлайн!

Возвращает анонимную функцию, которая принимает nи вектор lс 0для удаления слева и 1для удаления справа, и выводит результат на консоль с правильным форматированием.


1
Вы можете сэкономить немного при вычислении конца строки, поскольку вы знаете, что число #s будет n-i + 1: попробуйте онлайн! Хотя есть немного лучший подход, если вы просто печатаете построчно, а не строите
user2390246

@ user2390246 очень приятно! Мне удалось сбрить еще одну пару байтов :)
Джузеппе

2

Japt , 14 13 байт

-1 байт благодаря @ETH

å+ uP £X+QpV´

Вход - это массив, затем размер. Значения массива - это ""или " ", которые представляют удаление справа или слева соответственно. Использует "вместо #и возвращает как массив строк.

Идея здесь состояла в том, чтобы сначала создать массив левого отступа для каждой строки, отсюда и входные строки. Затем каждая строка "добавляет s, используя тот факт, что количество "s уменьшается на 1 каждый раз.

Попробуйте онлайн!

Все они используют -Rфлаг для форматирования вывода, соединяя его с символами новой строки.

объяснение

å+ uP £X+QpYnV

Неявный: U= входной массив, V= входной номер.

å+ uP

Кумулятивно уменьшите входной массив ( å) с помощью конкатенации строк ( +). Это приводит к массиву каждого промежуточного значения сокращения. Затем prepend ( u) пустая строка ( P) к массиву.

£X+

Сопоставьте £каждое значение с собой ( X), объединенным с ...

QpV´

Символ кавычки ( Q) повторяется ( p) V--( ) раз. Это также уменьшается Vкаждый раз.


Хороший. Я думаю, что вы можете сохранить байт, изменив YnVна
ETHproductions

@ETHproductions Удивительно, спасибо! Я полностью забыл об использовании ++или --в Japt.
Джастин Маринер

2

ArnoldC , 3132 байта

ArnoldC не имеет конкатенации строк, поэтому он создает торнадо из 8s и использует 1s для его разметки. ArnoldC также поддерживает только до 16-битных целых чисел, поэтому он переполняется при вводе длиннее 7 цифр. (Так что он будет делать только мини-торнадо)

1слева, любая другая цифра справа (хотя я бы не советовал 0, так как вы не можете начать с этого.)

Входные данные: 1221122

Выход:

88888888
18888888
18888881
18888811
11888811
11188811
11188111
11181111

Гольф-код:

IT'S SHOWTIME
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE e
YOU SET US UP 0
HEY CHRISTMAS TREE m
YOU SET US UP 0
GET YOUR ASS TO MARS m
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE l
YOU SET US UP 0
GET YOUR ASS TO MARS l
DO IT NOW g m
DO IT NOW h l m
YOU HAVE BEEN TERMINATED
LISTEN TO ME VERY CAREFULLY g
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE m
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE i
YOU SET US UP 2
HEY CHRISTMAS TREE n
YOU SET US UP m
STICK AROUND n
GET TO THE CHOPPER n
HERE IS MY INVITATION n
HE HAD TO SPLIT 10
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE n
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
CHILL
I'LL BE BACK i
HASTA LA VISTA, BABY
LISTEN TO ME VERY CAREFULLY h
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE l
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE m
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE o
YOU SET US UP -2
GET TO THE CHOPPER o
HERE IS MY INVITATION o
GET UP l
ENOUGH TALK
HEY CHRISTMAS TREE k
YOU SET US UP 1
STICK AROUND o
GET TO THE CHOPPER k
HERE IS MY INVITATION k
YOU'RE FIRED 10
ENOUGH TALK
GET TO THE CHOPPER o
HERE IS MY INVITATION o
GET DOWN 1
ENOUGH TALK
CHILL
HEY CHRISTMAS TREE p
YOU SET US UP 0
HEY CHRISTMAS TREE f
YOU SET US UP 0
HEY CHRISTMAS TREE i
YOU SET US UP 0
HEY CHRISTMAS TREE q
YOU SET US UP l
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE e
YOU SET US UP 1
HEY CHRISTMAS TREE a
YOU SET US UP 0
HEY CHRISTMAS TREE b
YOU SET US UP 0
HEY CHRISTMAS TREE c
YOU SET US UP l
STICK AROUND q
GET TO THE CHOPPER i
HERE IS MY INVITATION 0
ENOUGH TALK
GET TO THE CHOPPER a
HERE IS MY INVITATION d
ENOUGH TALK
GET TO THE CHOPPER b
HERE IS MY INVITATION e
ENOUGH TALK
GET TO THE CHOPPER c
HERE IS MY INVITATION l
ENOUGH TALK
STICK AROUND c
BECAUSE I'M GOING TO SAY PLEASE a
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
YOU'RE FIRED 10
ENOUGH TALK
GET TO THE CHOPPER a
HERE IS MY INVITATION a
GET DOWN 1
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER f
HERE IS MY INVITATION b
LET OFF SOME STEAM BENNET c
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE f
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 1
YOU'RE FIRED 10
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER i
HERE IS MY INVITATION i
GET UP 8
YOU'RE FIRED 10
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET DOWN 1
ENOUGH TALK
CHILL
GET TO THE CHOPPER i
HERE IS MY INVITATION i
HE HAD TO SPLIT 10
ENOUGH TALK
TALK TO THE HAND i
GET TO THE CHOPPER q
HERE IS MY INVITATION q
GET DOWN 1
ENOUGH TALK
GET TO THE CHOPPER p
HERE IS MY INVITATION m
HE HAD TO SPLIT k
I LET HIM GO 10
ENOUGH TALK
GET TO THE CHOPPER k
HERE IS MY INVITATION k
HE HAD TO SPLIT 10
ENOUGH TALK
GET TO THE CHOPPER f
HERE IS MY INVITATION p
YOU ARE NOT YOU YOU ARE ME 1
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE f
GET TO THE CHOPPER d
HERE IS MY INVITATION d
GET UP 1
ENOUGH TALK
BULLSHIT
GET TO THE CHOPPER e
HERE IS MY INVITATION e
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
CHILL
I'LL BE BACK i
HASTA LA VISTA, BABY

Попробуйте онлайн!

Код Ungolfed (5178 байт):

IT'S SHOWTIME
    HEY CHRISTMAS TREE left
        YOU SET US UP 0
    HEY CHRISTMAS TREE right
        YOU SET US UP 0
    HEY CHRISTMAS TREE input
        YOU SET US UP 0
        GET YOUR ASS TO MARS input
        DO IT NOW
        I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
    HEY CHRISTMAS TREE width
    YOU SET US UP 0
    GET YOUR ASS TO MARS width
    DO IT NOW calcwidth input
    DO IT NOW buildline width input
YOU HAVE BEEN TERMINATED

LISTEN TO ME VERY CAREFULLY calcwidth
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE input
    GIVE THESE PEOPLE AIR
    HEY CHRISTMAS TREE result
    YOU SET US UP 2
    HEY CHRISTMAS TREE calc
    YOU SET US UP input
    STICK AROUND calc
        GET TO THE CHOPPER calc
        HERE IS MY INVITATION calc
        HE HAD TO SPLIT 10
        ENOUGH TALK
        BECAUSE I'M GOING TO SAY PLEASE calc
            GET TO THE CHOPPER result
        HERE IS MY INVITATION result
        GET UP 1
        ENOUGH TALK
    YOU HAVE NO RESPECT FOR LOGIC
    CHILL
    I'LL BE BACK result
HASTA LA VISTA, BABY

LISTEN TO ME VERY CAREFULLY buildline
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE width
    I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE input
    GIVE THESE PEOPLE AIR

    HEY CHRISTMAS TREE ctr
        YOU SET US UP -2
        GET TO THE CHOPPER ctr
            HERE IS MY INVITATION ctr
            GET UP width
        ENOUGH TALK
    HEY CHRISTMAS TREE mask
        YOU SET US UP 1
        STICK AROUND ctr
            GET TO THE CHOPPER mask
                HERE IS MY INVITATION mask
                YOU'RE FIRED 10
            ENOUGH TALK
            GET TO THE CHOPPER ctr
                HERE IS MY INVITATION ctr
                GET DOWN 1
            ENOUGH TALK
        CHILL
    HEY CHRISTMAS TREE digit
        YOU SET US UP 0
    HEY CHRISTMAS TREE decider
        YOU SET US UP 0
    HEY CHRISTMAS TREE result
        YOU SET US UP 0
    HEY CHRISTMAS TREE lines
        YOU SET US UP width
    HEY CHRISTMAS TREE left
        YOU SET US UP 0
    HEY CHRISTMAS TREE right
        YOU SET US UP 1
    HEY CHRISTMAS TREE leftcounter
        YOU SET US UP 0
    HEY CHRISTMAS TREE rightcounter
        YOU SET US UP 0
    HEY CHRISTMAS TREE widthcounter
    YOU SET US UP width
    STICK AROUND lines
        GET TO THE CHOPPER result
            HERE IS MY INVITATION 0
        ENOUGH TALK
        GET TO THE CHOPPER leftcounter
            HERE IS MY INVITATION left
        ENOUGH TALK
        GET TO THE CHOPPER rightcounter
            HERE IS MY INVITATION right
        ENOUGH TALK
        GET TO THE CHOPPER widthcounter
            HERE IS MY INVITATION width
        ENOUGH TALK
        STICK AROUND widthcounter
            BECAUSE I'M GOING TO SAY PLEASE leftcounter
                GET TO THE CHOPPER result
                    HERE IS MY INVITATION result
                    GET UP 1
                    YOU'RE FIRED 10
                ENOUGH TALK
                GET TO THE CHOPPER leftcounter
                    HERE IS MY INVITATION leftcounter
                    GET DOWN 1
                ENOUGH TALK
            BULLSHIT
                GET TO THE CHOPPER decider
                    HERE IS MY INVITATION rightcounter
                    LET OFF SOME STEAM BENNET widthcounter
                ENOUGH TALK
                BECAUSE I'M GOING TO SAY PLEASE decider
                    GET TO THE CHOPPER result
                        HERE IS MY INVITATION result
                        GET UP 1
                        YOU'RE FIRED 10
                    ENOUGH TALK
                BULLSHIT
                    GET TO THE CHOPPER result
                        HERE IS MY INVITATION result
                        GET UP 8
                        YOU'RE FIRED 10
                    ENOUGH TALK
                YOU HAVE NO RESPECT FOR LOGIC
            YOU HAVE NO RESPECT FOR LOGIC

            GET TO THE CHOPPER widthcounter
                HERE IS MY INVITATION widthcounter
                GET DOWN 1
            ENOUGH TALK
        CHILL
        GET TO THE CHOPPER result
            HERE IS MY INVITATION result
            HE HAD TO SPLIT 10
        ENOUGH TALK
        TALK TO THE HAND result
        GET TO THE CHOPPER lines
            HERE IS MY INVITATION lines
            GET DOWN 1
        ENOUGH TALK
        GET TO THE CHOPPER digit
            HERE IS MY INVITATION input
            HE HAD TO SPLIT mask
            I LET HIM GO 10
        ENOUGH TALK
        GET TO THE CHOPPER mask
            HERE IS MY INVITATION mask
            HE HAD TO SPLIT 10
        ENOUGH TALK
        GET TO THE CHOPPER decider
            HERE IS MY INVITATION digit
            YOU ARE NOT YOU YOU ARE ME 1
        ENOUGH TALK
        BECAUSE I'M GOING TO SAY PLEASE decider
            GET TO THE CHOPPER left
                HERE IS MY INVITATION left
                GET UP 1
            ENOUGH TALK
        BULLSHIT
            GET TO THE CHOPPER right
                HERE IS MY INVITATION right
                GET UP 1
            ENOUGH TALK
        YOU HAVE NO RESPECT FOR LOGIC
    CHILL
    I'LL BE BACK result
HASTA LA VISTA, BABY

К сожалению, я не думаю, что этот ответ действителен, потому что он слишком сильно ограничивает ввод и изменяет вывод способом, который недопустим (используя фон без пробелов). Сожалею!
HyperNeutrino

@ HyperNeutrino Справедливо, это так хорошо, как вы можете получить от ArnoldC.
TemporalWolf

Это неудачно. Извините, что потратил ваше время и силы, но я считаю, что вам придется удалить это, так как оно недопустимо в соответствии с техническими требованиями. Вы можете спросить в Meta , считаете ли вы, что это неправильный выбор, и сообщество может решить, что делать. Спасибо :)
HyperNeutrino

1
@HyperNeutrino Я не убежден, что ArnoldC автоматически недействителен: он работает для всего диапазона допустимых целых чисел, поддерживаемых ArnoldC, и не "злоупотребляет" им, используя меньший пробел: если вы написали 32-битную поддержку ArnoldC, мой ответ будет работать без изменений с такой точностью. Правила не устанавливают никаких требований к символам заполнения, ни минимальной высоты торнадо, которая должна быть достижимой. Но я открою вопрос о мета, если вы предпочитаете.
TemporalWolf

1
Вы правы. Справедливо, продолжай; Я ошибся. Хороший ответ :)
HyperNeutrino

1

Haskell , 67 64 байта

Входные данные перевернуты: 0означает удалить правую и 1удалить левую:

f n=zipWith(\x y->(' '<$[1..y])++('#'<$[1..n-x]))[0..].scanl(+)0

Попробуйте онлайн!

"Ungolfed"

f n = zipWith (\x y-> replicate y ' ' ++ replicate (n-x) '#') [0..] . scanl (+) 0


1

C 68 63 байта

s;f(w,i)int*i;{for(;w;s+=!*i++)printf("%*s%0*d\n",s,"",w--,0);}

Это использует динамическую спецификацию ширины поля в printf()строке формата. Функция вызывается так:

#include <stdio.h>

s;f(w,i)int*i;{for(;w;s+=!*i++)printf("%*s%0*d\n",s,"",w--,0);}

int main() {
    f(8, (int[]){1, 0, 0, 0, 1, 0, 0});
}

Сохраните 5 байтов, удалив int s=0;и поместив s;перед f(w,i).
MD XF

1

JavaScript (ES6), 64 байта

Анонимная функция, принимающая параметры в синтаксисе карри (a) (b). В массиве b пустая строка представляет удаление справа, а пробел представляет удаление слева.

a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),p+=v)+a,a=Array(a+1),p='')

Используя 1 и 0, как в примерах, оценка 70

a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),v?p:p+=' ')+a,a=Array(a+1),p='')

Тест

F=
a=>b=>b.reduce((t,v)=>t+'\n'+(a.pop(),p+=v)+a,a=Array(a+1),p='')

function update() {
  var b=B.value.match(/\d/g)
  
  if (b) {
    b=b.map(v=>+v?'':' ')
    O.textContent = F(b.length+1)(b)
  }
  else
    O.textContent = 'invalid input'
}

update()
  
Input B (0 and 1) <input id=B value='1001' oninput='update()'>
<pre id=O></pre>


0

PowerShell , 53 байта

param($a,$b)"#"*$a;0..$a|%{" "*($i+=$b[$_])+"#"*--$a}

Попробуйте онлайн!

Принимает input $aкак необязательное целое число, а также $bкак массив 1и 0s. (Обратите внимание, что мой массив 1и 0триггер от вызова.) Создает начальную строку #и оставляет ее на конвейере. Затем переходит от 0к $a. На каждой итерации мы выводим возможно увеличенное количество пробелов, за которым следует предварительно уменьшенное число# . Да, в конце вы получите пустой завершающий символ новой строки, так как мы$a количества элементов в списке.

Все отдельные строки остаются в конвейере, и вывод с разделителем новой строки между ними подразумевается при завершении программы.


0

C #, 181 байт

n=>a=>{var r=new string[n];r[0]=new string('#',n);for(int i=1,p;i<n;++i){r[i]=r[i-1];p=a[i-1]?r[i].LastIndexOf('#'):r[i].IndexOf('#');r[i]=r[i].Remove(p,1).Insert(p," ");}return r;}

Попробуйте онлайн!

Полная / Отформатированная версия:

class P
{
    static void Main()
    {
        System.Func<int, System.Func<bool[], string[]>> f = n => a =>
        {
            var r=new string[n];
            r[0]=new string('#',n);

            for (int i = 1, p; i < n; ++i)
            {
                r[i] = r[i - 1];
                p = a[i - 1] ? r[i].LastIndexOf('#') : r[i].IndexOf('#');
                r[i] = r[i].Remove(p, 1).Insert(p, " ");
            }

            return r;
        };

        System.Console.WriteLine(string.Join("\n", f(5)(new[] { true, false, false, true })));

        System.Console.ReadLine();
    }
}

0

Древесный уголь , 17 байт

FN«P×#⁺¹ι¿I§⮌ηι↑↖

Попробуйте онлайн! Ссылка на ближайшую подробную версию кода. Объяснение:

FN«

Первый вход дает количество итераций цикла.

P×#⁺¹ι

Поскольку индексы цикла по умолчанию имеют нулевое индексирование, мы добавляем один здесь, чтобы получить правильное число #s.

¿I§⮌ηι

Начиная с нижней части торнадо и работая вверх, вы экономите байт, но затем нам нужно повернуть второй вход, чтобы мы могли индексировать текущую цифру.

Если текущая цифра a 1, двигайтесь вверх. Это делает предыдущий ряд лишним #в конце.

Если текущая цифра a 0, двигайтесь вверх и влево. Это делает предыдущий ряд лишним #в начале.


0

C # , 159 байт

using System.Linq;n=>a=>new[]{new string('#',n)}.Concat(a.Select((_,i)=>{var s=a.Take(i+1).Count(j=>j==0);var h=n-i-1;return new string('#',h).PadLeft(s+h);}))

объяснение

 new[] { new string('#', n) }                //start with n number of hashes
                .Concat(                     //append...
                    a.Select((_, i) =>       //    map each element of array
                    {
                        var s = a.Take(i + 1).Count(j => j == 0);  // count the number of 0's up to, and including, this point
                        var h = n - i - 1;                         // number of hashes for this step
                        return new string('#', h).PadLeft(s + h);  // number of hashes padded left with number of 0s
                    }));

Попробуйте онлайн!


0

PHP, 136 байт

$b=explode(',',end($argv));$a=$argc==3?$argv[1]:count($b)+1;$c=0;for(;$a;--$a){printf("% {$c}s%'#{$a}s\n",'','');$c+=!array_shift($b);}

Сохраните в php-файле и протестируйте с php file.php 8 '1,0,0,0,1,0,0'. Выход:

########
#######
 ######
  #####
   ####
   ###
    ##
     #

Увы, подготовка ввода - это половина работы.

Другая версия (158 байт), использующая str_repeatвместо printfи ... gotoвсех вещей:

$b=explode(',',end($argv));$a=$argc==3?$argv[1]:count($b)+1;$c=0;z:
echo str_repeat(' ',$c).str_repeat('#',$a)."\n";while(--$a){$c+=!array_shift($b);goto z;}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.