Construye un tornado


31

Según yo, un tornado se ve así:

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

Este tornado comienza con el ancho n, y en cada línea siguiente, se elimina un carácter de izquierda o derecha, dependiendo de la entrada.

Entrada

La entrada será una lista de algún tipo de dos valores únicos (también funciona una cadena de dos caracteres únicos) y un entero positivo opcional para indicar el ancho inicial. Si no se toma el entero opcional, entonces el ancho inicial es 1 mayor que la longitud de la lista. Deje que el ancho inicial sea n.

Como hacer un tornado

En mi ejemplo, elijo que mi lista contenga 1sys 0, aunque puede elegir dos valores constantes distintos o una cadena de dos caracteres constantes distintos.

La primera fila consistirá nen caracteres que no sean espacios en blanco (puede elegir cualquier carácter consistente; elijo #para mi ejemplo).

Luego, para cada número de la lista, si el número es 0, elimine el carácter izquierdo y cree una nueva fila; si es a 1, elimine el carácter correcto y cree una nueva fila.

Por lo tanto, el tornado anterior es la salida para 8, [1, 0, 0, 0, 1, 0, 0].

Salida

La salida puede ser una lista de cadenas, una lista de listas de caracteres o una cadena de varias líneas. Se permite el espacio en blanco al final de cada línea y se permite una nueva línea al final.

Casos de prueba

Estos casos de prueba incluyen el ancho inicial y las listas de uso 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 prueba largo

Reglas

  • Se aplican lagunas estándar
  • ¡El código más corto en bytes gana!
  • El fondo no tiene que ser un espacio (olvidé especificar esto antes).
  • Su idioma solo tiene que admitir números (anchos) que pueda manejar, pero si su intérprete fue reescrito con un tamaño de número mayor, tiene que funcionar teóricamente.

Implementación de referencia


3
Parece de sus ejemplos que el comienzo siempre será 1 mayor que la longitud de la lista. ¿Podríamos tener un ejemplo donde esto no sea así? ¿Puede el ancho inicial ser menor que la longitud de la lista?
Charlie

@CarlosAlejo No ... Eso no tiene sentido entonces porque entonces no tendrás suficientes elementos para eliminar al final ...
HyperNeutrino

44
Las gafas que @HyperNeutrino solía ver su primer tornado: i.imgur.com/TzMm94a.png
Urna de pulpo mágico

@MagicOctopusUrn ... lol
HyperNeutrino

Respuestas:



9

Python 2 , 66 59 bytes

-7 bytes gracias a Arnold Palmer

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

Pruébalo en línea!

0quitar de la derecha, 1quitar de la izquierda


1
ninja'd me: ((((
Koishore Roy

Mismo aquí hombre: /
Arnold Palmer

Ahorre 7 bytes reemplazándolos len(z)+1con xsi "entero positivo opcional" significa que no tiene que usarlo. La redacción de la pregunta hace que parezca que está permitido ya que dice "Si no se toma el entero opcional" versus "Si no se da el entero opcional".
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>es 0x1B, <CR>es 0x0D, <C-v>es 0x16. Y <ESC>OHes una secuencia multibyte que representa la tecla INICIO.

La entrada se utiliza acomo el valor "eliminar a la izquierda" y bcomo el valor "eliminar a la derecha".

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

No hay enlace TIO, desafortunadamente. No pude hacerlo funcionar bajo V. Pruebe copiando el código en tornado.vim (reemplazando <ESC>, etc. con sus bytes reales) y ejecutándolo de la siguiente manera:

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

-3 bytes debido a la sugerencia de Neil.


¿No puedes usar en ^lugar de ␛OH?
Neil

@Neil ^va al primer personaje no en blanco. ␛OHva al primer personaje.
Ray

1
Ah, lo siento, quería decir 0no me ...
Neil

@Neil En ese caso, sí, debería estar haciendo eso. Gracias.
Ray

5

05AB1E , 11 9 bytes

-2 bytes gracias a Erik the Outgolfer

0×=²v¨yú=

Eliminar de la izquierda: 1
Eliminar de la derecha:0

Pruébalo en línea!

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ηOtiene mucho potencial pero no puedo entenderlo en 11 bytes.
Urna mágica de pulpo

Mantenga la última versión y reemplazar ðy×ìcon de -2.
Erik the Outgolfer

4

Retina , 30 28 bytes

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

Pruébalo en línea! Toma solo una cadena de 0s y 1s y calcula el ancho en función de la cadena. Explicación: La primera etapa toma la cadena de entrada y la duplica una vez para cada punto límite, insertando una #en ese punto. La segunda etapa luego cambia todos los dígitos después del #más #s, creando el triángulo. La tercera etapa elimina todos los restantes y cambia los ceros a espacios que dan como resultado el "bamboleo" del torndao.


3

J, 32 bytes

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

sin golf

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

Pruébalo en línea!


19 bytes ' #'#~0(,.#\.)@,+/\, donde la entrada se invierte de la muestra ya que el desafío le permite elegir los dos valores distintos.
millas

@miles ty para este y tu otro comentario. realmente los aprecio y por favor sigan viniendo.
Jonás


3

R , 85 82 bytes

3 bytes guardados gracias a Giuseppe

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

Pruébalo en línea!

Explicación:

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

¡Sabía que hacer una matriz no era la mejor opción!
Giuseppe

1
82 bytes - recorté {}y usé una nueva línea literal en lugar de'\n'
Giuseppe

3

Haskell, 50 bytes

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

Pruébalo en línea!

Si la lista de entrada puede ser una lista de nombres de funciones, podemos guardar un byte

Haskell, 49 bytes

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

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

Pruébalo en línea!

Cómo 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

editar: guardado 1 byte gracias a xnor

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

Pruébalo en línea!

1 para eliminar desde la izquierda, 0 para eliminar desde la derecha.


1
Creo que puedes hacerlo s=" "*i+s[:-1]con el intercambio izquierdo y derecho.
xnor

2

R , 116 109 102 bytes

-5 bytes gracias a user2390246 (y otros 2 me salvé)

Superado por el usuario 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,,'')}

Pruébalo en línea!

Devuelve una función anónima que toma ny un vector lcon 0para eliminar de la izquierda y 1para eliminar de la derecha, e imprime el resultado en la consola con el formato correcto.


1
Puede ahorrar un poco al calcular el final de la línea, ya que sabe que el número de #s será n-i + 1: ¡ Pruébelo en línea! Aunque hay un enfoque un poco mejor si solo imprime línea por línea en lugar de construir una matriz: codegolf.stackexchange.com/a/133720/66252
user2390246

@ user2390246 muy agradable! Me las arreglé para eliminar otro par de bytes también :)
Giuseppe

2

Japt , 14 13 bytes

-1 byte gracias a @ETH

å+ uP £X+QpV´

La entrada es la matriz, luego el tamaño. Los valores de matriz son ""o " ", que representan la eliminación de la derecha o la izquierda, respectivamente. Utiliza en "lugar de #y devuelve como una matriz de cadenas.

La idea aquí era crear primero una matriz del relleno izquierdo para cada línea, de ahí las cadenas de entrada. Luego, cada línea obtiene la "s agregada, utilizando el hecho de que la cantidad de "s disminuye en 1 cada vez.

Pruébalo en línea!

Todos usan la -Rbandera para formatear la salida uniéndola con nuevas líneas.

Explicación

å+ uP £X+QpYnV

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

å+ uP

Reduzca acumulativamente la matriz de entrada ( å) con concatenación de cadenas ( +). Esto da como resultado la matriz de cada valor intermedio de la reducción. Luego, anteponga ( u) una cadena vacía ( P) a la matriz.

£X+

Asigna £cada valor a sí mismo ( X) concatenado con ...

QpV´

El carácter de comillas ( Q) repetido ( p) V--( ) veces. Esto también disminuye Vcada vez.


Bueno uno Creo que puede guardar un byte cambiando YnVa
ETHproductions

@ETHproductions ¡Genial, gracias! Me olvidé por completo de usar ++o --en Japt.
Justin Mariner

2

ArnoldC , 3132 bytes

ArnoldC no tiene concatenaciones de cadenas, por lo que genera un tornado de 8sy usa 1s para espaciarlo. ArnoldC también solo admite enteros de hasta 16 bits, por lo que se desborda con una entrada de más de 7 dígitos. (Por lo tanto, solo hará mini-tornados)

1está a la izquierda, cualquier otro dígito está a la derecha (aunque no lo recomendaría 0, ya que no puede comenzar con eso).

Entrada: 1221122

Salida:

88888888
18888888
18888881
18888811
11888811
11188811
11188111
11181111

Código de golf:

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

Pruébalo en línea!

Código no protegido (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

Desafortunadamente, no creo que esta respuesta sea válida porque restringe demasiado la entrada y modifica la salida de una manera que no está permitida (usando un fondo sin espacios en blanco). ¡Lo siento!
HyperNeutrino

@HyperNeutrino Bastante justo, esto es lo mejor que puedes obtener de ArnoldC.
TemporalWolf

Eso es lamentable. Lamento perder su tiempo y esfuerzo, pero creo que tendrá que eliminar esto ya que no es válido según las especificaciones del desafío. Puede preguntarle a Meta si cree que esta es una elección incorrecta y la comunidad puede decidir qué hacer. Gracias :)
HyperNeutrino

1
@HyperNeutrino No estoy convencido de que ArnoldC sea automáticamente inválido: funciona para todo el rango de enteros válidos admitidos por ArnoldC, y no está "abusando" al usar un espacio más pequeño: si escribiste en soporte de 32 bits para ArnoldC, mi respuesta funcionaría sin cambios con esa precisión. Las reglas no especifican requisitos para los caracteres de relleno, ni la altura mínima del tornado que debe ser alcanzable. Pero abriré una pregunta sobre meta si lo prefiere.
TemporalWolf

1
Tienes razón. Muy bien, continúe; Yo juzgué mal. Buena respuesta :)
HyperNeutrino

1

Haskell , 67 64 bytes

La entrada se voltea: 0significa eliminar a la derecha y 1eliminar a la izquierda:

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

Pruébalo en línea!

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

Esto hace uso de la especificación de ancho de campo dinámico en una printf()cadena de formato. La función se llama así:

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

Ahorre 5 bytes quitando int s=0;y poniendo s;antes de f(w,i). Como así
MD XF

1

JavaScript (ES6), 64 bytes

Función anónima que toma parámetros en la sintaxis de curry (a) (b). En la matriz b, una cadena vacía representa la eliminación desde la derecha y un espacio representa la eliminación desde la izquierda.

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

Usando 1 y 0 como en los ejemplos, la puntuación es 70

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

Prueba

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}

Pruébalo en línea!

Toma la entrada $acomo el entero opcional y $bcomo la matriz de 1y 0s. (Tenga en cuenta que mi matriz de 1y 0es flip-flop de los desafíos.) Construye la línea inicial #y la deja en la tubería. Luego recorre de 0a $a. En cada iteración, generamos un número de espacios posiblemente incrementado, seguido de un número de decrementos previamente decrementados #. Sí, esto escupirá una nueva línea en blanco al final, ya que estamos haciendo un ciclo en $alugar de la cantidad de elementos en la lista.

Todas las cadenas individuales se dejan en la tubería y la salida con un separador de nueva línea entre ellas está implícita al finalizar el 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;}

Pruébalo en línea!

Versión completa / formateada:

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

Carbón , 17 bytes

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

Pruébalo en línea! El enlace es a la versión detallada más cercana del código. Explicación:

FN«

La primera entrada da el número de iteraciones de bucle.

P×#⁺¹ι

Dado que los índices de bucle tienen un índice cero, agregamos uno aquí para obtener el número correcto de #s.

¿I§⮌ηι

Comenzar desde la parte inferior del tornado y avanzar ahorra un byte, pero luego debemos invertir la segunda entrada para poder indexar el dígito actual.

Si el dígito actual es a 1, muévase hacia arriba. Esto hace que la fila anterior tenga un extra #al final.

Si el dígito actual es a 0, muévase hacia arriba y hacia la izquierda. Esto hace que la fila anterior tenga un extra #al comienzo.


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

Explicación

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

Pruébalo en línea!


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

Guardar en un archivo php y probar con php file.php 8 '1,0,0,0,1,0,0'. Salida:

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

Por desgracia, preparar la entrada es la mitad del trabajo.

Otra versión (158 bytes) usando en str_repeatlugar de printfy ... gotode todas las cosas:

$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;}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.