Bina Yıkımı


11

Meydan okuma

Belirli bir binayı saniyede 1 kat hızında yıkmak için tam bir program / işlev yazın .

GİRİŞ

Girdi bir olan bina içinden STDIN (veya kendi dilinizde denir ne olursa olsun) veya bir içinden ARGUMENT bir işlevin. t = 0 s

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

girdi içeriği:

  • | zeminin başlangıcını ve sonunu işaretler.
  • {, }zemini patlayıcılarla işaretler.
  • # dekorasyon amaçlı bir pencere.
  • yerlerin içinde her yerde olmayan alandır #.
  • T yere işaret eder (yıkılamaz).
  • * patlatılan zemini işaretler.

Giriş kuralları:

  • bina üstten bir ile başlar |ve yerde biter (no ( T) = no ( char used in ground floor)).
  • #her kattaki her yerde bir pencere var.
  • T girdinizin sonunu belirtir.
  • sadece bir kat patlayıcıdan oluşur.
  • her kat tek no. karakter.
  • zeminden aşağıya doğru yükseldikçe, zeminler ya önceki zeminin boyutuna eşit olabilir ya da 2 karakter daha büyük olabilir.
  • Giriş charsveya dizisi olarak alınabilir strings.

Çıktı :

t = 0,5 sn.

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

t = 1 s

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

t = 1,5 sn

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

t = 2 s

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

t = 2,5 sn

   *
 |# #|
|# # #|
|# # #|
|# # #|
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  

Çıktı kuralları:

  • her kat bir newlinekarakterle biter .
  • zeminde bir satırsonu olabilir / olmayabilir.
  • her 0.5 saniyede bir bina (ya da ne kaldı) çıktı.
  • Çıktı , her 0,5 saniyede bir değiştirilen ve görüntülenen animasyon gibidir.
    (Ayrıca cevabınızla GIF yayınlamaktan çekinmeyin)

Bu bir Kod Golf yani kısa bayt kod kazanır!
son gönderim tarihi tam olarak 5 gündür

(Ama biliyor musunuz? Kazanmak her şey değildir, bir kazanan ilan edildikten sonra bile en sevdiğiniz dilde bu meydan okumayı denemekten çekinmeyin:]).

EDIT: Giriş alma şeklinizi değiştirdim (benim kötü aslında).


Şu andan itibaren 1 saat sonra hangi cevapların gönderilmesi gerekiyor ?
Dennis

Mesajımdan 1 saat sonra. böylece herhangi bir soru ile ilgili şüpheleri düzeltmek için en az 1 saat olsun.
Mukul Kumar

8
Topluluğun bu tür bir sınırlama uygulamak isteyip istemediğinden emin değilim. Spesifikasyonunuzun sağlam olduğundan emin değilseniz , ana taslağa göndermeden önce geri bildirim almak için sınama taslağını sanal alanımıza gönderebilirsiniz .
Dennis

@dennis Hmm ... kaldırıldı
Mukul Kumar

İki soru: (1) Herhangi bir katta sondaki boşluk olmadığını varsayabilir miyiz? (2) Zeminden sonra başka girdi satırı olmadığını varsayabilir miyiz?
H Walters

Yanıtlar:


4

Vim, 41 38 bayt

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

Burada, ^gerçek bir caret için kullanılır; CTRL-M için ␍ kullanılır.

açıklama

qw:sl 500m␍qyarım saniye uyurken, yarım saniye uykuyu makro w olarak kaydeder. /{␍patlayıcı ile yere hareket eder. qqözyinelemeli olarak kendini çağıracak olan q makrosunu kaydetmeye başlar.

jkaşağı ve yukarı hareket eder; son satırdaysanız (toprak) bu bir hata oluşturur; hata özyinelemeli makroyu sonlandırır. ^v$r*boşluk olmayan ilk karakterden satırın sonuna kadar olan her şeyi * ile değiştirir. @wyarım saniye ddbekledikten sonra mevcut katı siler. :-␍en üst sıradaysanız makroyu sonlandırmadan bir kat yukarı taşır. @wsonra yarım saniye daha bekler ve @qq makrosunu çağırır (başlangıçta boş).

q@q q makrosunu kaydetmeyi durdurur, sonra çağırır ve özyinelemeyi tetikler.

Animasyon

vim yıkım


Bir gif görmek için açlıktan ölüyordum !!
Mukul Kumar

Kimsenin bir gif koymadığını fark ettim, ama "çekinmeyin" dedin, bu yüzden yazım için bir zorunluluktu! Her neyse, V'de yeniden yazılırsa cevabım daha da "golf edilebilir"
H Walters

my answer could be "golfed" further... bu yeterli değil mi? : P
Mukul Kumar

4

JavaScript (ES6), 208 198 bayt

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 bayt

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

Tamam, bu bir karmaşa / uzun, ama bu meydan okuma Java için çok sinir bozucu şeyler var .. Çok satırlı yazdırma; Thread.sleep(500)hangi gerektirir throws Exception; iki sınırlayıcı arasındaki bir alt dizeyi eşit miktarda *; vb
Bütün bu program oldukça büyük olmasına neden olur .. Bu defintely biraz daha, belki de farklı bir yaklaşımla yarıya golfed olmak, ama en azından artık bir yanıtı var olabilir. ;)

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

Test kodu:

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

Burada deneyin. (İdeal olarak bir kerede çıktı verir vesleep..


Kural dışı durumu yakalamak size birkaç bayt kazandırabilir. Ya da belki try{...}finally{return;}?
Neil

@Neil Teşekkürler, ancak her iki yöntemi de birleştirmeyi başardım, bu yüzden şimdi bir single'ım varthrows Exception
Kevin Cruijssen

2

Haskell, 245221 bayt

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

Kullanım örneği:

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

Nasıl çalışır:

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

Not: Ayrıca orada threadDelaydan GHC.Concyerine usleepgelen System.Posix.Unistdhangi biraz daha kısa biraz olduğunu, ancak yalnızca çalışır GHCbir jenerik olmaz böylece derleyici Haskellcevap.


2

C 314 287 281 271 bayt

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 değiştirdikten sonra !=etmek -ve mümkün olduğunda iyi olarak, kömür değişmezleri kaçınarak isspace(H Walters çok teşekkür). Ancak çözülmemiş kod değişmeden kalır.

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

Koma uygulandıktan sonra -6 bayt ve {}ikiden sonra silme 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 bayt az optimizasyon sonra, gereksiz parantez kaldırılması, yanı sıra yerel değişkenleri küresel (otomatik 0 başlatma ile) ve b[0]tarafından değiştirin *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);}

Test edilmemiş test kodu 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
s,e,tDışarıda küresel olarak şöyle tanımlayabilirsinizs,e,t;
Mukul Kumar

@MukulKumar emin misin?
Mark Yisri

Evet, devam edin ve deneyin ..., ibaşkalarıyla da ekleyin .
Mukul Kumar

Başka optimizasyonları deneyeceğim ve önerilerinizi de kullanacağım
VolAnd

@MukulKumar Tavsiye ettiğiniz için teşekkür ederiz ... -23 bytes
VolAnd

1

Perl, 153 bayt

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}

Bu, 500 milisaniye beklemek için GNU uyku komutunu kullanır.

Ungolfed sürümü

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 bayt

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

girdiyi komut satırı bağımsız değişkenlerinden dize listesi olarak alır (yeni satır karakteri yok!)

dosyaya kaydet, ile çalıştır php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

Yıkmak

<?
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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.