Rozbiórka budynków


11

Wyzwanie

Napisz pełny program / funkcję, aby wyburzyć dany budynek z szybkością 1 piętra na sekundę .

WEJŚCIE

Dane wejściowe to budowanie poprzez STDIN (lub jakikolwiek inny sposób wywoływany w Twoim języku) lub ARGUMENT funkcji. t = 0 s

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

dane wejściowe obejmują:

  • | oznacza początek i koniec podłogi.
  • {, }oznacza podłogę materiałami wybuchowymi.
  • # to okno do dekoracji.
  • jest przestrzeń, która jest wszędzie wewnątrz podłóg, gdzie jej #nie ma.
  • T oznacza ziemię (nie można jej rozebrać).
  • * oznacza zdetonowaną podłogę.

Reguły wprowadzania:

  • budowanie zaczyna się od góry z jednym |i kończy na ziemi (bez no ( T) = no ( char used in ground floor)).
  • okno #jest w każdym dziwnym miejscu na każdym piętrze.
  • T oznacza koniec twojego wpisu.
  • tylko jedna podłoga składa się z materiałów wybuchowych.
  • każda podłoga jest wykonana z nieparzystego nie. znaków.
  • gdy schodzisz po podłogach, podłogi mogą być równej wielkości z poprzedniej podłogi lub mogą być o 2 znaki większe.
  • Dane wejściowe można traktować jako tablicę charslub strings.

Wynik :

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  

Reguły wyjściowe:

  • każde piętro kończy się jedną newlinepostacią.
  • ziemia może / może nie mieć końca nowej linii.
  • wysyłaj budynek (lub co z niego zostało) co 0,5 s.
  • Wyjście przypomina animację, która jest modyfikowana co 0,5 sekundy i jest wyświetlana.
    (Możesz również opublikować pliki GIF z odpowiedzią)

To jest Code-Golf, więc kod w najkrótszych bajtach wygrywa!
ostatnia data złożenia to dokładnie 5 dni od teraz

(Ale wiesz co? Zwycięstwo to nie wszystko, możesz spróbować tego wyzwania w swoim ulubionym języku, nawet po ogłoszeniu zwycięzcy:]).

EDYCJA: Zmieniłem sposób, w jaki przyjmujesz dane wejściowe (właściwie moje złe).


Jakie odpowiedzi mają zostać opublikowane po upływie 1 godziny ?
Dennis,

1 godzina od momentu mojego postu. aby uzyskać co najmniej 1 godzinę na rozwiązanie wszelkich wątpliwości związanych z pytaniami.
Mukul Kumar

8
Nie jestem pewien, czy społeczność byłaby skłonna egzekwować tego rodzaju ograniczenia. Jeśli nie masz pewności, że specyfikacja jest solidna, możesz opublikować wersję roboczą wyzwania w naszej piaskownicy, aby uzyskać opinię przed opublikowaniem jej na głównej.
Dennis,

@dennis Hmm ... usunięto
Mukul Kumar,

Dwa pytania: (1) Czy możemy założyć, że na żadnej podłodze nie ma spacji? (2) Czy możemy założyć, że po ziemi nie ma już linii wejściowych?
H Walters,

Odpowiedzi:


4

Vim, 41 38 bajtów

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

Tutaj ^jest używany w dosłownym kodzie; ␍ jest używany dla CTRL-M.

Wyjaśnienie

qw:sl 500m␍qśpi pół sekundy, nagrywając pół sekundy jako makro w. /{␍przesuwa się na podłogę z materiałami wybuchowymi. qqrozpoczyna rejestrowanie makra q, które rekurencyjnie wywoła się.

jkporusza się w dół i w górę; generuje to błąd, jeśli jesteś w ostatniej linii (na ziemi); błąd kończy makro rekurencyjne. ^v$r*zamienia wszystko od pierwszego znaku niebiałego do końca linii na *. @wczeka pół sekundy, a następnie ddusuwa bieżące piętro. :-␍przesuwa się o piętro bez kończenia makra, jeśli jesteś na górnej linii. @wnastępnie czeka kolejne pół sekundy i @qwywołuje makro q (początkowo puste).

q@q zatrzymuje rejestrowanie makra q, a następnie wywołuje je, wyzwalając rekurencję.

Animacja

vim rozbiórka


Głodowałem, żeby zobaczyć gif !!
Mukul Kumar

Zauważyłem, że nikt inny nie podarował gifa, ale powiedziałeś „nie krępuj się”, więc dla mojego postu było to koniecznością! W każdym razie moja odpowiedź mogłaby być dalej „golfa”, gdyby została przepisana w V.
H Walters,

my answer could be "golfed" further... nie jest to , że wystarczy? : P
Mukul Kumar

4

JavaScript (ES6), 208 198 bajtów

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 bajtów

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, to bałagan / długi, ale to wyzwanie ma tyle irytujących rzeczy dla Javy. Drukowanie wielu linii; Thread.sleep(500)co wymaga throws Exception; zastępując podciąg między dwoma ogranicznikami równą ilością *; itd.
Wszystko to sprawia, że ​​program jest dość duży. Można go z pewnością trochę golfa, może nawet o połowę z innym podejściem, ale przynajmniej jest teraz odpowiedź. ;)

Nie golfowany:

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

Kod testowy:

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

Wypróbuj tutaj. (Na ideone wysyła natychmiast i ignorujesleep..)


Złapanie wyjątku może zaoszczędzić kilka bajtów. A może try{...}finally{return;}?
Neil,

@Neil Dzięki, ale udało mi się połączyć obie metody, więc teraz mam jedenthrows Exception
Kevin Cruijssen

2

Haskell, 245 221 bajtów

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

Przykład użycia:

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

Jak to działa:

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

Uwaga: istnieje również threadDelayze GHC.Conczamiast usleepod System.Posix.Unistdktórej jest trochę krótsza, ale działa tylko z GHCkompilatorem, więc nie byłoby ogólna Haskellodpowiedź.


2

DO, 314 287 281 271 bajtów

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 Po zmianie !=do -i uniknięcia literały char gdy jest to możliwe, jak również isspace(wiele dzięki H Walters). Ale niezgolfowany kod pozostaje niezmieniony.

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 bajtów po zastosowaniu śpiączki i usunięciu {}po dwóch 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 bajtów po niewielkiej optymalizacji, usuwaniu niepotrzebnych nawiasów, a także zmianie lokalnych zmiennych na globalne (z automatyczną inicjalizacją 0) i b[0]przez *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);}

Kod testowy z nie golfowym 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
Możesz zdefiniować na s,e,tzewnątrz globalnie w ten sposóbs,e,t;
Mukul Kumar,

@MukulKumar na pewno?
Mark Yisri,

Tak, śmiało i spróbuj ..., także iz innymi.
Mukul Kumar,

Spróbuję też przeprowadzić inną optymalizację i skorzystać z waszych sugestii
VolAnd

@MukulKumar Dzięki za radę ... -23 bajty
VolAnd

1

Perl, 153 bajty

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}

Używa polecenia GNU sleep do oczekiwania na 500 milisekund.

Wersja bez golfa

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 bajtów

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

pobiera dane wejściowe jako listę ciągów z argumentów wiersza poleceń (bez znaku nowej linii!)

zapisz do pliku, uruchom z php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

awaria

<?
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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.