Membangun Demolition


11

Tantangan

Tuliskan program / fungsi lengkap untuk Menghancurkan bangunan yang diberikan pada tingkat 1 lantai per detik .

MEMASUKKAN

Input adalah bangunan melalui STDIN (atau apa pun yang disebut dalam bahasa Anda) atau melalui ARGUMEN fungsi. t = 0 dtk

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

input terdiri dari:

  • | tanda awal dan akhir lantai.
  • {, }Menandai lantai dengan bahan peledak.
  • # adalah jendela untuk dekorasi.
  • adalah ruang, yang ada di mana-mana di dalam lantai di mana #tidak ada.
  • T menandai tanah (tidak dapat dihancurkan).
  • * menandai lantai yang diledakkan.

Aturan input:

  • bangunan dimulai dari atas dengan satu |dan berakhir di tanah (tanpa ( T) = tidak ( char used in ground floor)).
  • sebuah jendela #ada di setiap tempat aneh di dalam setiap lantai.
  • T menandai akhir input Anda.
  • hanya satu lantai yang terdiri dari bahan peledak.
  • setiap lantai terbuat dari no aneh . karakter.
  • saat Anda naik ke lantai, lantai bisa berukuran sama dengan lantai sebelumnya atau bisa 2 karakter lebih besar.
  • Input dapat diambil sebagai array dari charsatau strings.

Keluaran:

t = 0,5 dtk

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

t = 1 dtk

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

t = 1,5 dtk

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

t = 2 dtk

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

t = 2,5 dtk

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

t = 3 dtk

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

t = 3,5 dtk

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

t = 4 dtk

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

t = 4,5 dtk

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

t = 6,5 s

*******
TTTTTTT  

t = 7 dtk

TTTTTTT  

Aturan keluaran:

  • setiap lantai berakhir dengan satu newlinekarakter.
  • ground mungkin / mungkin tidak memiliki baris baru.
  • output bangunan (atau apa yang tersisa) setiap 0,5 detik.
  • Output seperti animasi yang dimodifikasi setiap 0,5 detik dan ditampilkan.
    (Juga merasa bebas untuk mengirim GIF dengan jawaban Anda)

Ini adalah Golf-Kode sehingga kode dalam byte terpendek menang!
tanggal pengiriman terakhir adalah tepat 5 hari dari sekarang

(Tapi tahukah Anda? Menang bukanlah segalanya, jangan ragu untuk mencoba tantangan ini dalam bahasa favorit Anda, bahkan setelah pemenang dinyatakan:]).

EDIT: Saya mengubah cara Anda mengambil input (sebenarnya buruk saya).


Apa jawaban yang seharusnya diposting setelah 1 jam dari sekarang ?
Dennis

1 jam dari waktu posting saya. sehingga saya mendapatkan setidaknya 1 jam untuk memperbaiki keraguan terkait pertanyaan.
Mukul Kumar

8
Saya tidak yakin apakah masyarakat mau menerapkan pembatasan semacam ini. Jika Anda tidak yakin bahwa spesifikasi Anda solid, Anda dapat memposting draft tantangan di kotak pasir kami untuk mendapatkan umpan balik sebelum mempostingnya di utama.
Dennis

@dennis Hmm ... dihapus
Mukul Kumar

Dua pertanyaan: (1) Bolehkah kita berasumsi tidak ada spasi spasi di lantai? (2) Bolehkah kita berasumsi tidak ada lagi jalur input setelah pentas?
H Walters

Jawaban:


4

Vim, 41 38 byte

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

Di sini, ^digunakan untuk tanda sisipan harfiah; ␍ digunakan untuk CTRL-M.

Penjelasan

qw:sl 500m␍qtidur setengah detik, sementara merekam tidur setengah detik sebagai makro w. /{␍pindah ke lantai dengan bahan peledak. qqmulai merekam makro q, yang secara rekursif akan memanggil dirinya sendiri.

jkbergerak ke bawah dan ke atas; ini menghasilkan kesalahan jika Anda berada di baris terakhir (ground); kesalahan mengakhiri makro rekursif. ^v$r*mengganti semuanya mulai dari karakter non-spasi pertama hingga akhir baris dengan *. @wtunggu setengah detik, lalu ddhapus lantai saat ini. :-␍bergerak naik lantai tanpa menghentikan makro jika Anda berada di baris teratas. @wkemudian tunggu setengah detik lagi, dan @qpanggil q makro (awalnya kosong).

q@q berhenti merekam makro q, lalu memanggilnya, memicu rekursi.

Animasi

pembongkaran vim


Saya kelaparan melihat gif !!
Mukul Kumar

Saya perhatikan tidak ada orang lain yang memasukkan gif, tetapi Anda berkata "jangan ragu", jadi untuk posting saya itu adalah suatu keharusan! Bagaimanapun, jawaban saya bisa "diinjak" lebih jauh jika ditulis ulang dalam V.
H Walters

my answer could be "golfed" further... bukankah itu cukup? : 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, ini berantakan / panjang, tetapi tantangan ini memiliki begitu banyak hal yang mengganggu untuk Java .. Mencetak multi-line; Thread.sleep(500)yang membutuhkan throws Exception: mengganti substring antara dua pembatas dengan jumlah yang sama *; dll.
Semua ini menyebabkan program menjadi cukup besar .. Ini bisa menjadi golf lagi, bahkan mungkin dibelah dua dengan pendekatan yang berbeda, tetapi setidaknya ada jawaban sekarang. ;)

Tidak Disatukan:

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

Kode uji:

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

Coba di sini. (Pada ideone itu output sekaligus dan mengabaikansleep..)


Menangkap pengecualian dapat menghemat beberapa byte. Atau mungkin try{...}finally{return;}?
Neil

@Neil Terima kasih, tapi saya sudah berhasil menggabungkan kedua metode, jadi sekarang saya punya satuthrows 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

Contoh penggunaan:

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

Bagaimana itu bekerja:

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

Catatan: ada juga threadDelaydari GHC.Concbukan usleepdari System.Posix.Unistdyang kecil memagut lebih pendek, tetapi hanya bekerja dengan GHCcompiler, sehingga tidak akan menjadi generik Haskelljawaban.


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 setelah mengubah !=ke -dan menghindari literal arang bila mungkin, serta isspace(banyak terima kasih kepada H Walters). Namun kode yang tidak diubah tetap tidak berubah.

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 setelah menerapkan koma dan penghapusan {}setelah dua 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 setelah sedikit optimasi, menghapus tanda kurung yang tidak perlu, serta mengubah variabel lokal menjadi global (dengan inisialisasi otomatis 0) dan b[0]oleh *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);}

Kode uji dengan 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
Anda dapat mendefinisikan di s,e,tluar secara global seperti inis,e,t;
Mukul Kumar

@MukulKumar Anda yakin?
Mark Yisri

Ya tentu silakan dan coba saja ..., juga sertakan idengan yang lain.
Mukul Kumar

Saya akan mencoba beberapa pengoptimalan lainnya dan menggunakan saran Anda juga
VolAnd

@MukulKumar Terima kasih atas sarannya ... -23 byte
VolAnd

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}

Ini menggunakan perintah tidur GNU untuk menunggu 500 milidetik.

Versi tidak disatukan

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

mengambil input sebagai daftar string dari argumen baris perintah (tidak ada karakter baris baru!)

simpan ke file, jalankan dengan php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

kerusakan

<?
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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.