Побудувати Торнадо


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

Пітон 2 , 66 59 байт

-7 байт завдяки Арнольду Палмеру

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

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

0прибрати з правого, 1зняти з лівого


1
ninja'd me: (((
Koishore Roy

Тут же чоловік: /
Арнольд Палмер

Зберегти 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. Тестуванням, скопіювавши код у 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.
Ерік Аутгольфер

4

Сітківка , 30 28 байт

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

Спробуйте в Інтернеті! Бере лише рядок 0 і 1 і обчислює ширину на основі рядка. Пояснення: Перший етап приймає рядок введення і повторює його один раз для кожної граничної точки, вставляючи в #цій точці. Потім другий етап змінює всі цифри після #значень #s на більше s, створюючи трикутник. Потім третій етап видаляє всі решта та змінює нулі на пробіли, що призводить до «коливання» торндао.


3

J, 32 байти

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

неозорий

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

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


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

@miles ty для цього та вашого іншого коментаря. дуже ціную їх і будь ласка, продовжуйте їх приїжджати.
Іона


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 я врятував себе)

Перевершив користувач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

Кумулятивно зменшити вхідний масив ( å) з конкатенацією рядків ( +). Це призводить до масиву кожного проміжного значення зменшення. Потім додайте ( 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

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

Невикористаний код (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

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

"Безголів"

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) currying. У масиві 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}

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

Вводить введення $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.