Construir um tornado


31

De acordo com mim, um tornado se parece com isso:

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

Esse tornado começa com largura ne, em cada linha seguinte, um caractere é removido da esquerda ou da direita, dependendo da entrada.

Entrada

A entrada será uma lista de algum tipo de dois valores exclusivos (uma sequência de dois caracteres exclusivos também funciona) e um número inteiro positivo opcional para indicar a largura inicial. Se o número inteiro opcional não for utilizado, a largura inicial será 1 maior que o comprimento da lista. Seja a largura inicial n.

Como fazer um tornado

No meu exemplo, escolhi minha lista para conter 1s e 0s, embora você possa escolher dois valores constantes distintos ou uma sequência de dois caracteres constantes distintos.

A primeira linha será composta por ncaracteres que não sejam espaços em branco (você pode escolher qualquer caractere consistente; eu escolho #no meu exemplo).

Em seguida, para cada número da lista, se o número for 0, remova o caractere esquerdo e crie uma nova linha; se for um 1, remova o caractere certo e crie uma nova linha.

Assim, o tornado acima é a saída para 8, [1, 0, 0, 0, 1, 0, 0].

Saída

A saída pode ser uma lista de cadeias, uma lista de listas de caracteres ou uma cadeia de linhas múltiplas. O espaço em branco à direita em cada linha é permitido e uma nova linha à direita no final é permitida.

Casos de teste

Esses casos de teste incluem a largura inicial e usam listas de 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]

Caso de teste longo

Regras

  • Aplicam-se brechas padrão
  • O menor código em bytes vence!
  • O plano de fundo não precisa ser um espaço (esqueci de especificar isso anteriormente).
  • Seu idioma precisa apenas suportar números (larguras) que ele possa manipular, mas se o seu intérprete tiver sido reescrito com um tamanho de número maior, ele deverá funcionar teoricamente.

Implementação de referência


3
Parece a partir de seus exemplos que o início de sempre será 1 maior que o comprimento da lista. Poderíamos ter um exemplo em que isso não é verdade? A largura inicial pode ser menor que o comprimento da lista?
30717 Charlie

@CarlosAlejo Não ... Isso não faz sentido, então porque então você não terá elementos suficientes para remover no final ...
HyperNeutrino

4
Os óculos que @HyperNeutrino usou para ver seu primeiro tornado: i.imgur.com/TzMm94a.png
Magic Octopus Urn

@MagicOctopusUrn ... lol
HyperNeutrino

Respostas:



9

Python 2 , 66 59 bytes

-7 bytes graças a Arnold Palmer

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

Experimente online!

0remover da direita, 1remover da esquerda


1
ninja'd me: (((
Koishore Roy 20/17/17

O mesmo aqui homem: /
Arnold Palmer

Economize 7 bytes substituindo len(z)+1por xse "número inteiro positivo opcional" significa que você não precisa usá-lo. A redação da pergunta faz parecer que isso é permitido, pois diz "Se o número inteiro opcional não for utilizado" versus "Se o número inteiro opcional não for fornecido".
Arnold Palmer

6

vim, 85 82 bytes

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. E <ESC>OHé uma sequência multibyte representando a tecla HOME.

A entrada usa acomo o valor "remover à esquerda" e bcomo "remover à direita".

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

Nenhum link TIO, infelizmente. Não consegui fazê-lo funcionar no V. Teste, copiando o código para tornado.vim (substituindo <ESC>, etc, por seus bytes reais) e executando da seguinte maneira:

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

-3 bytes devido à sugestão de Neil.


Você não pode usar em ^vez de ␛OH?
Neil

@ Neil ^vai para o primeiro caractere que não está em branco. ␛OHvai para o primeiro caractere.
Raio

1
Ah, desculpe, eu quis dizer 0que não ...
Neil

@ Neil Nesse caso, sim, eu deveria estar fazendo isso. Obrigado.
Raio

5

05AB1E , 11 9 bytes

-2 bytes graças a Erik the Outgolfer

0×=²v¨yú=

Remover da esquerda: 1
Remover da direita:0

Experimente online!

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ηOtem muito potencial, mas não consigo descobrir com menos de 11 bytes.
Magic Octopus Urn

Manter a última versão e substituir ðy×ìcom a -2.
Erik the Outgolfer

4

Retina , 30 28 bytes

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

Experimente online! Toma apenas uma sequência de 0s e 1s e calcula a largura com base na sequência. Explicação: O primeiro estágio pega a sequência de entrada e a duplica uma vez para cada ponto de limite, inserindo #a nesse ponto. O segundo estágio altera todos os dígitos depois de #para mais #s, criando o triângulo. O terceiro stange então apaga todos os restantes e muda os zeros para espaços que resultam na "oscilação" do torndao.


3

J, 32 bytes

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

destroçado

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

Experimente online!


19 bytes ' #'#~0(,.#\.)@,+/\, onde a entrada é invertida da amostra, pois o desafio permite escolher os dois valores distintos.
miles

@miles ty para este e seu outro comentário. realmente apreciá-los e por favor, mantenha-os chegando.
Jonah


3

R , 85 bytes

3 bytes salvos graças a Giuseppe

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

Experimente online!

Explicação:

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

Eu sabia que fazer uma matriz não era a melhor opção!
21717 Giuseppe

1
82 bytes - rapou {}e utilizado uma nova linha literal em vez de'\n'
Giuseppe

3

Haskell, 50 bytes

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

Experimente online!

Se a lista de entrada puder ser uma lista de nomes de funções, podemos salvar um byte

Haskell, 49 bytes

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

Exemplo de uso: h 5 [g,f,f,g].

Experimente online!

Como funciona:

           '#'<$[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 bytes

edit: economizou 1 byte graças ao xnor

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

Experimente online!

1 para remover da esquerda, 0 para remover da direita.


1
Eu acho que você pode fazer s=" "*i+s[:-1]com a esquerda e a direita trocadas.
Xnor

2

R , 116 109 102 bytes

-5 bytes graças a user2390246 (e outros 2 eu me salvei)

Superado pelo usuário2390246

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,,'')}

Experimente online!

Retorna uma função anônima que leva ne um vetor lcom 0para a remoção da esquerda e 1para a remoção da direita, e imprime o resultado para o console com a formatação direita.


1
Você pode economizar um pouco no cálculo do final da linha, pois sabe que o número de #s será n-i + 1: experimente online! Apesar de haver uma abordagem um pouco melhor se você apenas imprimir linha por linha, em vez de construir uma matriz: codegolf.stackexchange.com/a/133720/66252
user2390246

@ user2390246 muito bom! Eu consegui raspar um outro par de bytes bem :)
Giuseppe

2

Japt , 14 13 bytes

-1 byte graças a @ETH

å+ uP £X+QpV´

Entrada é a matriz, depois o tamanho. Os valores da matriz são ""or " ", que representam a remoção da direita ou da esquerda, respectivamente. Usa em "vez de #e retorna como uma matriz de seqüências de caracteres.

A idéia aqui era primeiro criar uma matriz do preenchimento esquerdo para cada linha, daí as seqüências de entrada. Então, cada linha recebe os "s adicionados, usando o fato de que a quantidade de" s diminui 1 em cada vez.

Experimente online!

Todos eles usam o -Rsinalizador para formatar a saída juntando-o a novas linhas.

Explicação

å+ uP £X+QpYnV

Implícito: U= matriz de entrada, V= número de entrada.

å+ uP

Reduza cumulativamente a matriz de entrada ( å) com concatenação de string ( +). Isso resulta na matriz de cada valor intermediário da redução. Em seguida, acrescente ( u) uma sequência vazia ( P) à matriz.

£X+

Mapeie £cada valor para si mesmo ( X) concatenado com ...

QpV´

O caractere de citação ( Q) repetido ( p) V--( ) vezes. Isso também diminui a Vcada vez.


Um bom. Eu acho que você pode salvar um byte mudando YnVpara
ETHproductions

@ETHproductions Incrível, obrigado! Eu esqueci totalmente de usar ++ou --no Japt.
23617 Justin Mariner

2

ArnoldC , 3132 bytes

O ArnoldC não possui concatenações de strings, portanto, isso cria um tornado de se 8usa 1s para espaçá-lo. O ArnoldC também suporta apenas números inteiros de até 16 bits, portanto, excede a entrada com mais de 7 dígitos. (Então ele só fará mini-tornados)

1 fica à esquerda, qualquer outro dígito está certo (embora eu não recomendo 0 , pois você não pode começar com isso.)

Entrada: 1221122

Saída:

88888888
18888888
18888881
18888811
11888811
11188811
11188111
11181111

Código de golfe:

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

Experimente online!

Código não destruído (5178 bytes):

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

Infelizmente, não acho que essa resposta seja válida porque restringe muito a entrada e modifica a saída de uma maneira que não é permitida (usando um plano de fundo que não é um espaço em branco). Desculpe!
HyperNeutrino

@HyperNeutrino É justo o suficiente, é o melhor que você pode obter da ArnoldC.
TemporalWolf

Isso é lamentável. Desculpe desperdiçar seu tempo e esforço, mas acredito que você terá que excluir isso, pois é inválido pelas especificações do desafio. Você pode perguntar ao Meta se acredita que essa é a escolha errada e a comunidade pode decidir o que fazer. Obrigado :)
HyperNeutrino

1
@HyperNeutrino Não estou convencido O ArnoldC é automaticamente inválido: funciona para todo o intervalo de números inteiros válidos suportados pelo ArnoldC e não está "abusando" dele usando um espaço menor: se você escreveu em suporte de 32 bits para o ArnoldC, minha resposta funcionaria sem alterações com essa precisão. As regras não especificam requisitos para caracteres de preenchimento, nem tornado de altura mínima que deve ser possível. Mas vou abrir uma pergunta sobre meta, se você preferir.
TemporalWolf

1
Você está certo. Justo, continue; Eu julguei mal. Resposta agradável :)
HyperNeutrino

1

Haskell , 67 64 bytes

A entrada é invertida: 0significa remover à direita e 1remover à esquerda:

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

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

Isso faz uso da especificação de largura do campo dinâmico em uma printf()sequência de formato. A função é chamada assim:

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

Salve 5 bytes removendo int s=0;e colocando s;antes do f(w,i). Como assim
MD XF

1

JavaScript (ES6), 64 bytes

Função anônima que aceita parâmetros na sintaxe de curry (a) (b). Na matriz b, uma cadeia vazia representa a remoção da direita e um espaço representa a remoção da esquerda.

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

Usando 1 e 0, como nos exemplos, a pontuação é 70

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

Teste

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}

Experimente online!

Recebe a entrada $acomo o número inteiro opcional e $bcomo a matriz de 1e 0s. (Observe que minha matriz de 1e 0é flip-flop dos desafios.) Constrói a linha inicial de #e a deixa no pipeline. Em seguida, passa de 0para $a. A cada iteração, produzimos um número de espaços possivelmente incrementado, seguido por um número pré-decrementado de #. Sim, isso cuspirá uma nova linha em branco no final, pois estamos repetindo$a o número de itens da lista em vez do número.

Todas as seqüências individuais são deixadas no pipeline e a saída com um separador de nova linha entre elas fica implícita na conclusão do programa.


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

Experimente online!

Versão completa / formatada:

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

Carvão , 17 bytes

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

Experimente online! O link está na versão detalhada do código mais próxima. Explicação:

FN«

A primeira entrada fornece o número de iterações de loop.

P×#⁺¹ι

Como os índices de loop são padronizados como zero-indexados, adicionamos um aqui para obter o número correto de #s.

¿I§⮌ηι

Começando na parte inferior do tornado e processando economiza um byte, mas precisamos inverter a segunda entrada para poder indexar o dígito atual.

Se o dígito atual for a 1, mova para cima. Isso faz com que a linha anterior tenha um extra #no final.

Se o dígito atual for a 0, mova para cima e para a esquerda. Isso faz com que a linha anterior tenha um extra #no início.


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

Explicação

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

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

Salve em um arquivo php e teste com php file.php 8 '1,0,0,0,1,0,0'. Saída:

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

Infelizmente, preparar a entrada é metade do trabalho.

Outra versão (158 bytes) usando em str_repeatvez de printfe ... gotode todas as coisas:

$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;}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.