竜巻を構築する


31

私によると、竜巻は次のようになります。

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

この竜巻はwidth nで始まり、次の各行で、入力に応じて文字が左または右から削除されます。

入力

入力は、任意の2つの一意の値(2つの一意の文字列も機能します)のリストと、開始幅を示すオプションの正の整数です。オプションの整数を使用しない場合、開始幅はリストの長さより1大きくなります。開始幅をとしますn

竜巻の作り方

この例では、1sと0s を含むリストを選択しますが、2つの異なる定数値、または2つの異なる定数文字列を選択できます。

最初の行は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

パイソン266の 59バイト

アーノルド・パーマーのおかげで-7バイト

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

オンラインでお試しください!

01から削除するには、左から削除するには


1
ninja'd me:(((
Koishore Roy

同じ男:/
アーノルドパーマー

「オプションの正の整数」を使用する必要がないことを意味する場合に置き換えlen(z)+1x、7バイトを節約します。質問の文言は、「オプションの整数が取られない場合」対「オプションの整数が与えられない場合」と言うので、これが許可されているように聞こえます。
アーノルドパーマー

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

05AB1E11 9バイト

Erik the Outgolferのおかげで-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バイト未満ではわかりません。
魔法のタコUr

後者のバージョンを保持ðy×ì、-2に置き換えます。
エリックアウトゴルファー

4

網膜30 28バイト

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

オンラインでお試しください!0と1の文字列だけを受け取り、その文字列に基づいて幅を計算します。説明:最初の段階では、入力文字列を取得し、境界ポイントごとに1回複製して#、そのポイントにa を挿入します。次に、2番目の段階では、#から#s までのすべての数字を変更して、三角形を作成します。3番目のスタンジは、残りのすべてを削除し、ゼロをスペースに変更します。これにより、竜巻の「ぐらつき」が生じます。


3

J、32バイト

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

食べない

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

オンラインでお試しください!


19バイト' #'#~0(,.#\.)@,+/\。チャレンジでは2つの異なる値を選択できるため、入力はサンプルから反転します。
マイル

これとあなたの他のコメントの@マイル。本当に感謝し、来てください。
ジョナ


3

R85 82バイト

Giuseppeのおかげで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

R116の 109 102バイト

user2390246のおかげで-5バイト(および自分で保存した別の2 バイト

user2390246によるアウトゴルフ

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を返し、その結果を正しいフォーマットでコンソールに出力します。01


1
#s の数がn-i + 1になることがわかっているので、行末を計算するのに少し節約できます。オンラインで試してください!あなただけではなく、マトリックスを構築するよりも、行ずつ印刷する場合は、わずかにもっと良い方法がありますけれども:codegolf.stackexchange.com/a/133720/66252
user2390246

@ user2390246とても素敵!私はもう1組のバイトを削ることもできました:)
ジュゼッペ

2

Japt14 13バイト

@ETHのおかげで-1バイト

å+ uP £X+QpV´

入力は配列、サイズです。配列値は""または" "であり、それぞれ右または左からの削除を表します。の"代わりに使用#、文字列の配列として返します。

ここでのアイデアは、最初に各行の左パディングの配列、つまり入力文字列を作成することでした。次に、"sの量が"毎回1ずつ減少するという事実を使用して、各行にsが追加されます。

オンラインでお試しください!

これらはすべて-Rフラグを使用して、改行で結合することにより出力をフォーマットします。

説明

å+ uP £X+QpYnV

暗黙的:U=入力配列、V=入力番号。

å+ uP

入力配列(å)を文字列連結(+)で累積的に減らします。これにより、リダクションの各中間値の配列が生成されます。次に、u空の文字列(P)を配列に追加します()。

£X+

マップ£自体への各値(Xと連結)を...

QpV´

引用符(Q)が(pV--)回繰り返されました。これもV毎回減少します。


良いもの。YnV
ETHproductions

@ETHproductions素晴らしい、ありがとう!++または--Japt を使用することを完全に忘れていました。
ジャスティンマリナー

2

ArnoldC、3132バイト

ArnoldCには文字列の連結がないため、8sから竜巻を作成し、sを使用1してスペースを空けます。また、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まあ、これはArnoldCから得られるのと同じくらい良いです。
TemporalWolf

それは残念です。時間と労力を浪費して申し訳ありませんが、チャレンジ仕様では無効であるため、削除する必要があると思います。これが間違った選択であり、コミュニティがそこで何をすべきかを決定できると信じているかどうか、Metaに尋ねることができます。ありがとう:)
HyperNeutrino

1
@HyperNeutrino ArnoldCが自動的に無効であるとは確信していません。ArnoldCでサポートされている有効な整数の範囲全体で機能し、小さいスペースを使用して「乱用」していません。その精度で変更なしで動作します。ルールでは、パディング文字の要件も、達成可能な最小高さの竜巻も指定されていません。ただし、必要に応じてメタに関する質問を開きます。
TemporalWolf

1
あなたが正しい。十分に公平で、続けてください。勘違いしました。いい答え:)
HyperNeutrino

1

Haskell67 64バイト

The input is flipped: 0 means remove right, and 1 remove left:

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

Try it online!

"Ungolfed"

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


1

C, 68 63 bytes

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

This makes use of the dynamic field width specification in a printf() format string. The function is called like this:

#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});
}

Save 5 bytes by removing int s=0; and putting s; before the f(w,i). Like so
MD XF

1

JavaScript (ES6), 64 bytes

Anonymous function taking parameters in currying syntax (a)(b). In the b array an empty string represents removing from right and a space represents removing from left.

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

Using 1 and 0 like in the examples the score is 70

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

Test

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 bytes

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

Try it online!

Takes input $a as the optional integer and $b as the array of 1 and 0s. (Note that my array of 1 and 0 is flip-flopped from the challenge's.) Constructs the initial line of # and leaves that on the pipeline. Then loops from 0 to $a. Each iteration, we output a possibly-incremented number of spaces, followed by a pre-decremented number of #. Yes, this will spit out a blank trailing newline at the end, since we're looping up to $a rather than the number of items in the list.

All the individual strings are left on the pipeline and output with a newline separator between them is implicit at program completion.


0

C#, 181 bytes

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;}

Try it online!

Full/Formatted Version:

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

Charcoal, 17 bytes

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

Try it online! Link is to nearest verbose version of code. Explanation:

FN«

The first input gives the number of loop iterations.

P×#⁺¹ι

Since loop indices default to zero-indexed, we add one here to get the correct number of #s.

¿I§⮌ηι

Starting from the bottom of the tornado and working up saves a byte, but we then need to reverse the second input so that we can index the current digit.

If the current digit is a 1, move up. This makes the previous row have an extra # at the end.

If the current digit is a 0, move up and left. This makes the previous row have an extra # at the start.


0

C#, 159 bytes

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);}))

Explanation

 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
                    }));

Try it online!


0

PHP, 136 bytes

$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);}

Save in a php file and test with php file.php 8 '1,0,0,0,1,0,0'. Output:

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

Alas, getting the input ready is half of the job.

Another version (158 bytes) using str_repeat instead of printf and...goto of all things:

$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;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.