Demolizione di edifici


11

Sfida

Scrivi un programma / funzione completo per demolire un determinato edificio al ritmo di 1 piano al secondo .

INGRESSO

L'input è un edificio tramite STDIN (o come viene chiamato nella tua lingua) o tramite un ARGOMENTO di una funzione. t = 0 s

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

l'input è costituito da:

  • | segna l'inizio e la fine di un piano.
  • {, }segna il pavimento con esplosivi.
  • # è una finestra che è per la decorazione.
  • è lo spazio, che è ovunque all'interno dei piani dove #non c'è.
  • T segna terra (non può essere demolito).
  • * segna il pavimento fatto esplodere.

Regole di input:

  • l'edificio inizia dall'alto con uno |e termina a terra (con no ( T) = no ( char used in ground floor)).
  • una finestra #è in ogni luogo strano all'interno di ogni piano.
  • T segna la fine dell'input.
  • solo un piano è costituito da esplosivi.
  • ogni piano è realizzato con uno strano numero. di caratteri.
  • mentre scendi i piani, i piani possono avere le stesse dimensioni di quello del piano precedente o possono essere 2 caratteri più grandi.
  • L'input può essere preso come una matrice di charso strings.

Produzione :

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  

Regole di uscita:

  • ogni piano termina con un newlinepersonaggio.
  • il terreno può / potrebbe non avere una nuova riga finale.
  • produrre l'edificio (o ciò che ne rimane) ogni 0,5 s.
  • L'output è come un'animazione che viene modificata ogni 0,5 se viene visualizzata.
    (Sentiti anche libero di pubblicare GIF con la tua risposta)

Questo è un Code-Golf quindi vince il codice nei byte più brevi!
l'ultima data di invio è esattamente tra 5 giorni

(Ma sai cosa? Vincere non è tutto, sentiti libero di provare questa sfida nella tua lingua preferita, anche dopo che un vincitore è stato dichiarato:]).

EDIT: ho cambiato il modo in cui prendi l'input (il mio male in realtà).


Quali sono le risposte che dovrebbero essere pubblicate dopo 1 ora circa?
Dennis,

1 ora dal momento del mio post. in modo che ottenga almeno 1 ora per correggere eventuali dubbi relativi alla domanda.
Mukul Kumar,

8
Non sono sicuro che la comunità sarebbe disposta a far rispettare questo tipo di limitazione. Se non sei sicuro che le tue specifiche siano solide, puoi pubblicare la bozza della sfida nella nostra sandbox per ottenere feedback prima di pubblicarla sulla pagina principale.
Dennis,

@dennis Hmm ... rimosso
Mukul Kumar il

Due domande: (1) Possiamo supporre che non ci sia spazio bianco finale su nessun piano? (2) Possiamo supporre che non ci siano più linee di input dopo il terreno?
H Walters,

Risposte:


4

Vim, 41 38 byte

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

Qui, ^viene utilizzato per un cursore letterale; ␍ è utilizzato per CTRL-M.

Spiegazione

qw:sl 500m␍qdorme mezzo secondo, mentre registra il sonno di mezzo secondo come macro w. /{␍si sposta a terra con esplosivi. qqinizia a registrare la macro q, che si chiamerà in modo ricorsivo.

jksi sposta su e giù; questo genera un errore se ti trovi sull'ultima riga (terra); l'errore termina la macro ricorsiva. ^v$r*sostituisce tutto, dal primo carattere non bianco alla fine della riga con * 's. @wattende mezzo secondo, quindi ddelimina il piano corrente. :-␍si sposta su un piano senza terminare la macro se si è nella riga superiore. @wquindi attende un altro mezzo secondo e @qchiama la macro q (inizialmente vuota).

q@q interrompe la registrazione della macro q, quindi la chiama, attivando la ricorsione.

Animazione

demolizione vim


Stavo morendo di fame per vedere una gif !!
Mukul Kumar,

Ho notato che nessun altro ha fatto una gif, ma hai detto "sentiti libero di", quindi per il mio post è stato un must! Ad ogni modo, la mia risposta potrebbe essere "giocata a golf" ulteriormente se riscritta in V.
H Walters,

my answer could be "golfed" further... non è che sufficiente? : P
Mukul Kumar,

4

JavaScript (ES6), 208 198 byte

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


2

Java 7, 589 477 476 byte

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, è un casino / lungo, ma questa sfida ha tante cose fastidiose per Java. Stampa multi-linea; Thread.sleep(500)che richiede un throws Exception; sostituendo una sottostringa tra due delimitatori con una quantità uguale di *; ecc.
Tutto ciò fa sì che il programma sia piuttosto grande .. Può sicuramente essere giocato a golf un po 'di più, forse anche dimezzato con un approccio diverso, ma almeno adesso c'è una risposta. ;)

Ungolfed:

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

Codice di prova:

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

Provalo qui. (Su ideone esce subito e ignora ilsleep..)


La cattura dell'eccezione potrebbe farti risparmiare qualche byte. O forse try{...}finally{return;}?
Neil,

@Neil Grazie, ma sono riuscito a unire entrambi i metodi, quindi ora ne ho uno singolothrows Exception
Kevin Cruijssen,

2

Haskell, 245 221 byte

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

Esempio di utilizzo:

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

Come funziona:

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: c'è anche threadDelayda GHC.Concinvece di usleepda System.Posix.Unistdcui è un po 'più breve, ma funziona solo con il GHCcompilatore, quindi non sarebbe una Haskellrisposta generica .


2

C, 314 287 281 271 byte

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 dopo aver cambiato !=a -ed evitando letterali char quando è possibile, così come isspace(mille grazie a H Walters). Ma il codice non salvato rimane invariato.

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 byte dopo aver applicato il coma e la cancellazione di {}dopo due 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 byte dopo poca ottimizzazione, rimozione delle parentesi non necessarie, nonché modifica delle variabili locali in globali (con inizializzazione automatica 0) e b[0]di *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);}

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

1
Puoi definire l' s,e,testerno a livello globale in questo modos,e,t;
Mukul Kumar il

@MukulKumar sei sicuro?
Mark Yisri,

Sicuramente vai avanti e provalo ..., includilo anche icon altri.
Mukul Kumar,

Proverò qualche altra ottimizzazione e userò anche i tuoi suggerimenti
VolAnd

@MukulKumar Grazie per il consiglio ... -23 byte
Vol

1

Perl, 153 byte

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}

Questo utilizza il comando GNU sleep per attendere 500 millisecondi.

Versione Ungolfed

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
 }

1

PHP, 286 282 274 234 229 byte

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

accetta input come elenco di stringhe dagli argomenti della riga di comando (nessun carattere di nuova riga!)

salva su file, esegui con php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

abbattersi

<?
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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.