Xây dựng phá hủy


11

Thử thách

Viết một chương trình / chức năng đầy đủ để Phá hủy một tòa nhà nhất định ở mức 1 tầng mỗi giây .

ĐẦU VÀO

Đầu vào là một tòa nhà thông qua STDIN (hoặc bất cứ thứ gì được gọi bằng ngôn ngữ của bạn) hoặc thông qua ARGUMENT của một chức năng. t = 0 s

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

đầu vào bao gồm:

  • | đánh dấu bắt đầu và kết thúc của một sàn.
  • {, }đánh dấu sàn bằng chất nổ.
  • # là một cửa sổ dành cho trang trí.
  • là không gian, ở khắp mọi nơi trong các tầng #không có ở đó.
  • T đánh dấu mặt đất (không thể bị phá hủy).
  • * đánh dấu sàn kích nổ.

Quy tắc đầu vào:

  • tòa nhà bắt đầu từ trên cùng với một |và kết thúc trên mặt đất (với no ( T) = no ( char used in ground floor)).
  • một cửa sổ #ở mọi nơi kỳ lạ bên trong mỗi tầng.
  • T đánh dấu sự kết thúc của đầu vào của bạn.
  • chỉ có một tầng bao gồm chất nổ.
  • mỗi tầng được làm bằng số lẻ . của ký tự.
  • khi bạn leo xuống các tầng, các tầng có thể có kích thước bằng với tầng trước hoặc có thể lớn hơn 2 ký tự.
  • Đầu vào có thể được lấy như một mảng của charshoặc strings.

Đầu ra:

t = 0,5 s

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

t = 1 giây

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

t = 1,5 s

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

t = 2 giây

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

t = 2,5 giây

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

t = 3 giây

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

t = 3,5 giây

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

t = 4 giây

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

t = 4,5 giây

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

t = 6,5 s

*******
TTTTTTT  

t = 7 giây

TTTTTTT  

Quy tắc đầu ra:

  • mỗi tầng kết thúc với một newlinenhân vật.
  • mặt đất có thể / có thể không có một dòng mới.
  • đầu ra tòa nhà (hoặc những gì còn lại của nó) cứ sau 0,5 giây.
  • Đầu ra giống như hình ảnh động được sửa đổi cứ sau 0,5 giây và được hiển thị.
    (Cũng cảm thấy tự do để gửi GIF với câu trả lời của bạn)

Đây là Code-Golf để mã theo byte ngắn nhất sẽ thắng!
ngày nộp cuối cùng chính xác là 5 ngày kể từ bây giờ

(Nhưng bạn biết gì không? Chiến thắng không phải là tất cả, hãy thử thách thức này bằng ngôn ngữ yêu thích của bạn, ngay cả sau khi người chiến thắng đã được tuyên bố:]).

EDIT: Tôi đã thay đổi cách bạn nhận đầu vào (thực sự xấu của tôi).


Câu trả lời nào được cho là sẽ được đăng sau 1 giờ kể từ bây giờ ?
Dennis

1 giờ kể từ thời điểm đăng bài của tôi. để tôi nhận được ít nhất 1 giờ để khắc phục mọi nghi ngờ liên quan đến câu hỏi.
Mukul Kumar

8
Tôi không chắc liệu cộng đồng có sẵn sàng thực thi loại hạn chế này hay không. Nếu bạn không chắc chắn rằng thông số kỹ thuật của bạn là vững chắc, bạn có thể đăng dự thảo thử thách trong hộp cát của chúng tôi để nhận phản hồi trước khi đăng lên trang chính.
Dennis

@dennis Hmm ... đã bị xóa
Mukul Kumar

Hai câu hỏi: (1) Chúng ta có thể cho rằng không có khoảng trắng ở bất kỳ tầng nào không? (2) Chúng ta có thể cho rằng không còn dòng đầu vào nào sau mặt đất không?
H Walters

Câu trả lời:


4

Vim, 41 38 byte

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

Ở đây, ^được sử dụng cho một caret nghĩa đen; Được sử dụng cho CTRL-M.

Giải trình

qw:sl 500m␍qngủ nửa giây, trong khi ghi lại nửa giây ngủ dưới dạng macro w. /{␍di chuyển đến sàn với chất nổ. qqbắt đầu ghi macro q, sẽ gọi đệ quy chính nó.

jkdi chuyển xuống và lên; điều này tạo ra lỗi nếu bạn ở dòng cuối cùng (mặt đất); lỗi chấm dứt macro đệ quy. ^v$r*thay thế mọi thứ từ ký tự không phải khoảng trắng đầu tiên đến cuối dòng bằng * 's. @wĐợi nửa giây, sau đó ddxóa sàn hiện tại. :-␍di chuyển lên một tầng mà không chấm dứt macro nếu bạn ở dòng trên cùng. @wsau đó đợi nửa giây nữa và @qgọi macro q (ban đầu trống).

q@q dừng ghi macro q, sau đó gọi nó, kích hoạt đệ quy.

Hoạt hình

phá hủy vim


Tôi đã chết đói để xem một gif !!
Mukul Kumar

Tôi nhận thấy không ai khác đặt gif vào, nhưng bạn nói "cứ thoải mái", vì vậy đối với bài đăng của tôi thì đó là điều bắt buộc! Nhưng dù sao, câu trả lời của tôi có thể bị "đánh gôn" hơn nữa nếu được viết lại trong V.
H Walters

my answer could be "golfed" further... không phải là đủ? : 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, đó là một mớ hỗn độn / dài, nhưng thách thức này có quá nhiều điều khó chịu đối với Java .. In nhiều dòng; Thread.sleep(500)trong đó yêu cầu a throws Exception; thay thế một chuỗi con giữa hai dấu phân cách với số lượng bằng nhau *; v.v ...
Tất cả điều này làm cho chương trình trở nên khá lớn .. Nó chắc chắn có thể được đánh gôn thêm, thậm chí có thể giảm một nửa với một cách tiếp cận khác, nhưng ít nhất đã có câu trả lời ngay bây giờ. ;)

Ung dung:

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

Mã kiểm tra:

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

Hãy thử nó ở đây. (Trên ideone, nó xuất ra cùng một lúc và bỏ quasleep..)


Nắm bắt ngoại lệ có thể giúp bạn tiết kiệm một vài byte. Hoặc có thể try{...}finally{return;}?
Neil

@Neil Cảm ơn, nhưng tôi đã quản lý để hợp nhất cả hai phương pháp, vì vậy bây giờ tôi có một phương thức duy nhấtthrows 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

Ví dụ sử dụng:

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

Làm thế nào nó hoạt động:

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

Lưu ý: có cũng threadDelaytừ GHC.Concthay vì usleeptừ System.Posix.Unistdđó là một chút cắn ngắn hơn, nhưng nó chỉ hoạt động với các GHCtrình biên dịch, vì vậy nó sẽ không là một chung Haskellcâu trả lời.


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 sau khi đổi !=sang -và tránh các ký tự char khi có thể, cũng như isspace(cảm ơn H Walters). Nhưng mã không mã hóa vẫn không thay đổi.

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 sau khi áp dụng hôn mê và xóa {}sau hai 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 sau khi tối ưu hóa ít, loại bỏ các dấu ngoặc đơn không cần thiết, cũng như thay đổi các biến cục bộ thành toàn cục (với khởi tạo tự động 0) và b[0]bằng cách *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);}

Mã kiểm tra với vô danh 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
Bạn có thể định nghĩa s,e,tbên ngoài toàn cầu như thế nàys,e,t;
Mukul Kumar

@MukulKumar bạn có chắc không?
Đánh dấu Yisri

Phải chắc chắn đi trước và thử nó ..., cũng bao gồm ivới những người khác.
Mukul Kumar

Tôi cũng sẽ thử một số tối ưu hóa khác và cũng sử dụng các đề xuất của bạn
VolAnd

@MukulKumar Cảm ơn lời khuyên ... -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}

Điều này sử dụng lệnh ngủ GNU để chờ trong 500 mili giây.

Phiên bản ung dung

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

lấy đầu vào làm danh sách các chuỗi từ các đối số dòng lệnh (không có ký tự dòng mới!)

lưu vào tập tin, chạy với php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

phá vỡ

<?
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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.