Demolición de edificios

11

Desafío

Escriba un programa / función completa para demoler un edificio determinado a razón de 1 piso por segundo .

ENTRADA

La entrada es un edificio a través de STDIN (o como se llame en su idioma) o a través de un ARGUMENTO de una función. t = 0 s

   |
  |#|
  {#}
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

la entrada consiste en:

  • | marca el inicio y el final de un piso.
  • {, }marca el piso con explosivos.
  • # Es una ventana que es para decoración.
  • es el espacio, que está en todas partes dentro de los pisos donde #no hay.
  • T marca el terreno (no puede ser demolido).
  • * marca el piso detonado.

Reglas de entrada:

  • el edificio comienza desde arriba con uno |y termina en el suelo (sin no ( T) = no ( char used in ground floor)).
  • hay una ventana #en cada lugar extraño dentro de cada piso.
  • T marca el final de su entrada.
  • solo un piso consta de explosivos.
  • cada piso está hecho de un número impar . de caracteres
  • A medida que asciende por los pisos, los pisos pueden ser del mismo tamaño que el piso anterior o pueden ser 2 caracteres más grandes.
  • La entrada se puede tomar como una matriz de charso strings.

Salida:

t = 0.5 s

   |
  |#|
  ***
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 1 s

   |
  |#|
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 1.5 s

   |
  ***
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 2 s

   |
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 2.5 s

   *
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 3 s

 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 3.5 s

 *****
|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 4 s

|# # #|
|# # #|
|# # #|
TTTTTTT  

t = 4.5 s

*******
|# # #|
|# # #|
TTTTTTT  

t = 6.5 s

*******
TTTTTTT  

t = 7 s

TTTTTTT  

Reglas de salida:

  • Cada piso termina con un newlinepersonaje.
  • el suelo puede / no tener una nueva línea final.
  • sacar el edificio (o lo que queda de él) cada 0.5 s.
  • La salida es como una animación que se modifica cada 0.5 sy se muestra.
    (También puedes publicar GIF con tu respuesta)

Este es un Code-Golf, por lo que gana el código en bytes más cortos.
la última fecha de envío es exactamente 5 días a partir de ahora

(¿Pero sabes qué? Ganar no lo es todo, siéntete libre de probar este desafío en tu idioma favorito, incluso después de que se haya declarado un ganador:]).

EDITAR: Cambié la forma en que toma la entrada (mi mal en realidad).

Mukul Kumar
fuente
¿Qué se supone que se publicarán las respuestas después de 1 hora a partir de ahora ?
Dennis
1 hora desde el momento de mi publicación. para que tenga al menos 1 hora para rectificar cualquier duda relacionada con las preguntas.
Mukul Kumar el
8
No estoy seguro de si la comunidad estaría dispuesta a imponer este tipo de limitación. Si no está seguro de que su especificación sea sólida, puede publicar el borrador del desafío en nuestro sandbox para obtener comentarios antes de publicarlo en main.
Dennis
@dennis Hmm ... eliminado
Mukul Kumar
Dos preguntas: (1) ¿Podemos suponer que no hay espacios en blanco al final en ningún piso? (2) ¿Podemos suponer que no hay más líneas de entrada después del suelo?
H Walters

Respuestas:

4

Vim, 41 38 bytes

qw:sl 500m␍q/{␍qqjk^v$r*@wdd:-␍@w@qq@q

Aquí, ^se usa para un caret literal; ␍ se usa para CTRL-M.

Explicación

qw:sl 500m␍qduerme medio segundo, mientras graba el sueño de medio segundo como macro w. /{␍se mueve al piso con explosivos. qqcomienza a grabar la macro q, que se llamará recursivamente a sí misma.

jkse mueve hacia abajo y hacia arriba; esto genera un error si estás en la última línea (tierra); el error termina la macro recursiva. ^v$r*reemplaza todo, desde el primer carácter sin espacios en blanco hasta el final de la línea con * 's. @wespera medio segundo, luego ddelimina el piso actual. :-␍sube un piso sin terminar la macro si estás en la línea superior. @wluego espera otro medio segundo y @qllama a la macro q (inicialmente vacía).

q@q deja de grabar la macro q, luego la llama, desencadenando la recursividad.

Animación

vim demolición

H Walters
fuente
¡Me moría de hambre por ver un gif!
Mukul Kumar
Me di cuenta de que nadie más había puesto un gif, pero dijiste "siéntete libre de hacerlo", ¡así que para mi publicación fue imprescindible! De todos modos, mi respuesta podría "jugar más" si se reescribe en V.
H Walters
my answer could be "golfed" further... ¿no es eso suficiente? : P
Mukul Kumar
4

JavaScript (ES6), 208 198 bytes

f=
(t,s=f=>setTimeout(f,500),v=t.value.split(/(\S.*\n)/),i=v.findIndex(s=>/}/.test(s)),c=_=>t.value=v.join``,d=_=>c(v.splice(--i,2),v[3]&&s(e,i?--i:++i)),e=_=>c(v[i]=v[i].replace(/./g,'*'),s(d)))=>s(e)
<textarea id=t rows=9>
   |
  |#|
  {#}
 |# #|
|# # #|
|# # #|
|# # #|
TTTTTTT
</textarea><input type=button value=Go! onclick=f(t)>

Neil
fuente
2

Java 7, 589 477 476 bytes

import java.util.*;void x(List<String>b,int x)throws Exception{Thread.sleep(500);int i=0,l=b.size(),z=x;String w;for(;i<l;i++){System.out.println(w=b.get(i));if(w.contains("{"))x=i;}System.out.println();w=b.get(x);i=w.contains("*")?1:0;if(i>0)b.remove(x);else b.set(x,z<0?r(w,'{','}'):r(w,'|','|'));if(l>1)x(b,i>0&x>0?x-1:x);}String r(String s,char y,char z){int a,b;return s.substring(0,a=s.indexOf(y))+s.substring(a,b=s.lastIndexOf(z)+1).replaceAll(".","*")+s.substring(b);}

Ok, es un desastre / largo, pero este desafío tiene muchas cosas molestas para Java ... Imprimir varias líneas; Thread.sleep(500)que requiere a throws Exception; reemplazar una subcadena entre dos delimitadores con una cantidad igual de *; etc.
Todo esto hace que el programa sea bastante grande. Definitivamente se puede jugar un poco más, tal vez incluso reducirlo a la mitad con un enfoque diferente, pero al menos ahora hay una respuesta. ;)

Sin golf:

void x(List<String>b, int x) throws Exception{
  Thread.sleep(500);
  int i = 0,
      l = b.size(),
      z = x;
  String w;
  for(;i<l; i++){
    System.out.println(w=b.get(i));
    if(w.contains("{")){
      x = i;
    }
  }
  System.out.println();
  w = b.get(x);
  i = s.contains("*")
       ? 1
       : 0;
  if(i>0){
    b.remove(x);
  }
  else{
    b.set(x, z < 0
              ? r(s, '{', '}')
              : r(s, '|', '|'));
  }
  if(l>1){
    x(b, i > 0 & x > 0
          ? x-1
          : x);
  }
}

String r(String s, chary, char z){
    int a, b;
    return s.substring(0, a=s.indexOf(y)) + s.substring(a, b=s.lastIndexOf(z) + 1).replaceAll(".", "*") + s.substring(b);
}

Código de prueba:

import java.util.*;

class M{
  void x(List<String>b,int x)throws Exception{Thread.sleep(500);int i=0,l=b.size(),z=x;String w;for(;i<l;i++){System.out.println(w=b.get(i));if(w.contains("{"))x=i;}System.out.println();w=b.get(x);i=w.contains("*")?1:0;if(i>0)b.remove(x);else b.set(x,z<0?r(w,'{','}'):r(w,'|','|'));if(l>1)x(b,i>0&x>0?x-1:x);}String r(String s,char y,char z){int a,b;return s.substring(0,a=s.indexOf(y))+s.substring(a,b=s.lastIndexOf(z)+1).replaceAll(".","*")+s.substring(b);}

  public static void main(String[] a){
    try{
        List<String> l = new ArrayList(){{
            add("   |   ");
            add("  |#|  ");
            add("  |#|  ");
            add(" {# #} ");
            add("|# # #|");
            add("|# # #|");
            add("|# # #|");
            add("TTTTTTT");
        }};
        new M().c(l, -1);
    }
    catch(Exception e){}
  }
}

Pruébalo aquí. (En ideone sale de inmediato e ignora elsleep..)

Kevin Cruijssen
fuente
Capturar la excepción puede ahorrarle unos pocos bytes. O tal vez try{...}finally{return;}?
Neil
@Neil Gracias, pero he logrado fusionar ambos métodos, así que ahora tengo unothrows Exception
Kevin Cruijssen, el
2

Haskell, 245 221 bytes

import System.Posix.Unistd
r=reverse
c#l|(i,j)<-span(<'!')l=i++(c<$j)
f[b]=[[b]]
f s|(h@(a:b),d:c)<-break(elem '{')s=(h++'*'#d:c):(h++c):f(init h++'{'#last h:c)|1<2=r<$>(f$r s)
mapM((usleep 500000>>).mapM putStrLn).init.f

Ejemplo de uso:

mapM((usleep 500000>>).mapM putStrLn).init.f $ ["  |"," {#}"," |#|","|# #|","|# #|","TTTTT"]

Cómo funciona:

c#l|(i,j)<-span(<'!')l=i++(c<$j)    -- helper function that takes a char c and
                                    -- a string l and keeps the leading spaces
                                    -- of l and replaces the rest with c

                                    -- f takes a building (list of strings) and
                                    -- makes the sequence of collapsing buildings
                                    -- as a list of list of strings
f[b]=[[b]]                          -- base case. Stop when there's only a single
                                    -- floor left
f s                                 -- if the building has at least two floors
   |(h@(a:b),d:c)<-break(elem '{')s --   if there is at least one floor above the
                                    --   explosion
        =(h++'*'#d:c) :             --     return the current building with the
                                    --     floor to explode replaced by *
        (h++c) :                    --     followed by the current building with
                                    --     the exploded floor removed 
        f(init h++'{'#last h:c)     --     followed by a recursive call
                                    --     with the next to explode floor marked
                                    --     with '{'
   |1<2=r<$>(f$r s)                 --   if all top floors have exploded, reverse
                                    --   the left over floors, let them explode
                                    --   and reverse the floors of each building
                                    --   again.

                      f             -- let the building collapse
                 init               -- f comes with an additional building with
                                    -- a single floor of * only -> drop it
mapM(     )                         -- for every building
     (usleep 500000>>)              --   delay 0.5 sec
             mapM putStrLn          --   and print the floors

Nota: también hay threadDelayde GHC.Conclugar de usleeppartir de System.Posix.Unistdque es un poco más corto, pero sólo funciona con el GHCcompilador, por lo que no sería un genérico Haskellrespuesta.

nimi
fuente
2

C, 314 287 281 271 bytes

s,e,t,i;f(char**b){char*p;do{system("CLS");i=0;do{while(!(p=b[i]))i++;if(!*b&&e==1)e=i;while(*p<33)putchar(*p++);if(!t)e=*p=='{'?i:e,s+=2;do{putchar(e==i&&t%2&&*p>16?'*':*p);}while(*p&&*p++>16);}while(*b[i++]-84);if(t++%2)b[e]=0,*b&&e>0?e--:e++;Sleep(500);}while(t<s-1);}

-10 después de cambiar !=a -y evitando literales de char cuando es posible, así como isspace(muchas gracias a H Walters). Pero el código no protegido permanece sin cambios.

s,e,t,i;f(char**b){char*p;do{system("CLS");i=0;do{while(!(p=b[i]))i++;if(!*b&&e==1)e=i;while(isspace(*p))putchar(*p++);if(!t)e=*p=='{'?i:e,s+=2;do{putchar(e==i&&t%2&&*p>0xF?'*':*p);}while(*p&&*p++>0xF);}while(*b[i++]!='T');if(t++%2)b[e]=0,*b&&e>0?e--:e++;Sleep(500);}while(t<s-1);}

-6 bytes después de aplicar coma y eliminación de {}después de dos if.

s,e,t,i;f(char**b){char*p;do{system("CLS");i=0;do{while(!(p=b[i]))i++;if(!*b&&e==1)e=i;while(isspace(*p))putchar(*p++);if(!t){s+=2;e=*p=='{'?i:e;}do{putchar(e==i&&t%2&&*p>0xF?'*':*p);}while(*p&&*p++>0xF);}while(*b[i++]!='T');if(t++%2){b[e]=0;e=*b&&e>0?e-1:e+1;}Sleep(500);}while(t<s-1);}

-26 bytes después de una pequeña optimización, eliminar paréntesis innecesarios, así como cambiar las variables locales a globales (con inicialización automática 0) y b[0]por *b.

f(char**b){int s=0,e=0,t=0;char*p;do{system("CLS");int i=0;do{if(!t){s+=2;if(strchr(b[i],'}'))e=i;printf(b[i]);}else{while(!(p=b[i]))i++;if(!b[0]&&e==1)e=i;do{putchar((e==i&&t%2&&!isspace(*p))?'*':*p);}while(*p&&*p++!='\n');}}while(b[i++][0]!='T');if(t%2){b[e]=0;e=(b[0]&&e)?e-1:e+1;}t++;Sleep(500);}while(--s>1);}

Código de prueba con ungolfed f:

#include <stdio.h>
#include <windows.h> // to use Sleep and system

s, e, t, i;
f(char**b)
{
    char*p;
    do{
        system("CLS");
        i = 0;
        do
        {
            while (!(p=b[i]))i++; // skip demolished floors
            if (!*b && e==1) e = i;
            while (isspace(*p)) putchar(*p++); // print spaces 
            if (!t){ s += 2; e = *p == '{' ? i : e; } // find a bomb and count steps at the first iteration
            do{
                putchar(e == i && t%2 &&*p>0xF ? '*' : *p); // print floor or * for next floor at odd step
            } while (*p && *p++ >0xF); // >0xF is instead of !='\n'
        } while (*b[i++] != 'T'); // until the ground
        if (t++ % 2)
        {
            b[e] = 0; // delete the demolished floor
            e = *b&&e>0 ? e-1 : e+1; // and determine next floor to be demolished
        }
        Sleep(500);
    } while (t<s-1);
}

int main(void)
{
    char * arr[] = { "   |\n",
                     "  |#|\n",
                     "  {#}\n",
                     " |# #|\n",
                     "|# # #|\n",
                     "|# # #|\n",
                     "|# # #|\n",
                     "TTTTTTT" };
    f(arr);
}
VolAnd
fuente
1
Puede definir el s,e,texterior de manera global de esta maneras,e,t;
Mukul Kumar el
@MukulKumar, ¿estás seguro?
Mark Yisri
Sí, adelante, pruébalo ..., también inclúyelo icon otros.
Mukul Kumar
Voy a tratar de alguna otra optimización y el uso de sus sugerencias, así
Voland
@MukulKumar Gracias por el consejo ... -23 bytes
VolAnd
1

Perl, 153 bytes

for(@a=<>;$a[$i]!~/{/;$i++){}for(;$a[0]!~/^T/;`sleep .5`){if($P=!$P){$a[$i]=~s/(\S.*\S|\S)/"*" x length($1)/e}else{splice(@a,$i,1);if($i){$i--}}print@a}

Esto usa el comando GNU sleep para esperar 500 milisegundos.

Versión sin golf

for(@a=<>;$a[$i]!~/{/;$i++){}
for(;$a[0]!~/^T/;`sleep .5`){
    if($P=!$P){
       $a[$i]=~s/(\S.*\S|\S)/"*" x length($1)/e
    } else { 
       splice(@a,$i,1);
       if($i){$i--}
    }
    print @a
 }
Adán
fuente
1

PHP, 286 282 274 234 229 bytes

<?for($a=$argv,array_shift($a);!strstr($a[+$i++],"{"););while($a[0][0]!=T){$x=&$a[$i-=$i>0];$x=str_pad(substr($x,0,strspn($x," ")),strlen($x),"*");eval($p='echo join("\n",$a),"\n\n";usleep(5e5);');array_splice($a,$i,1);eval($p);}

toma la entrada como una lista de cadenas de los argumentos de la línea de comando (¡sin caracteres de nueva línea!)

guardar en archivo, ejecutar con php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

Descompostura

<?
for($a=$argv,array_shift($a);   // import input
    !strstr($a[+$i++],"{"););   // find explosives
while($a[0][0]!=T)              // loop while ground not reached:
{
    $x=&$a[$i-=$i>0];               // move up if possible, reference floor
    $x=str_pad(
        substr($x,0,strspn($x," ")  // keep leading spaces
    ),strlen($x),"*");              // replace rest with asterisks
                                    // print and wait
    eval($p='echo join("\n",$a),"\n\n";usleep(5e5);');
    array_splice($a,$i,1);          // remove current floor
    eval($p);                       // print and wait
}
Titus
fuente