건물 철거


11

도전

주어진 건물을 초당 1 층 의 속도로 철거하기위한 전체 프로그램 / 기능을 작성하십시오 .

입력

입력은입니다 건물 을 통해 STDIN (또는 언어라고 무엇이든) 또는 통해 반대론 함수의. t = 0 s

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

입력은 다음으로 구성됩니다.

  • | 바닥의 ​​시작과 끝 표시.
  • {, }마크 폭발물 바닥.
  • # 장식용 창입니다.
  • 공간은 공간 #이없는 바닥 내부 어디에나 있습니다.
  • T 지면 표시 (철거 불가).
  • * 폭발 된 바닥을 표시합니다.

입력 규칙 :

  • 건물은 하나부터 시작 |하여지면에서 끝납니다 (no ( T) = no ( char used in ground floor)).
  • 창문 #은 모든 층 내부의 모든 이상한 곳에 있습니다.
  • T 입력의 끝을 표시합니다.
  • 하나 층 폭발물로 구성되어 있습니다.
  • 모든 층은 홀수 로 만들어집니다 . 문자
  • 바닥을 내려갈 때 바닥 은 이전 바닥 과 크기 거나 2 자 더 클 수 있습니다 .
  • 입력은 chars또는 의 배열로 취할 수 있습니다 strings.

출력 :

t = 0.5 초

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

t = 1 초

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

t = 1.5 초

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

t = 2 초

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

t = 2.5 초

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

t = 3 초

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

t = 3.5 초

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

t = 4 초

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

t = 4.5 초

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

t = 6.5 초

*******
TTTTTTT  

t = 7 초

TTTTTTT  

출력 규칙 :

  • 모든 층은 하나의 newline문자로 끝납니다 .
  • 지면에는 줄 바꿈 문자가 없을 수도 있습니다.
  • 0.5 초마다 건물 (또는 남은 것)을 출력합니다.
  • 출력 은 0.5 초마다 수정되어 표시되는 애니메이션과 같습니다.
    (또한 답변으로 GIF를 게시하십시오)

이것은 Code-Golf 이므로 최단 바이트의 코드가 승리합니다!
마지막 제출 날짜는 지금부터 정확히 5 일입니다.

(그러나 당신은 무엇을 알고 있습니까? 승리는 모든 것이 아닙니다. 우승자가 선언 된 후에도 좋아하는 언어 로이 도전을 자유롭게 시도하십시오 :]).

편집 : 나는 당신이 입력하는 방법을 바꿨습니다 (실제로 내 잘못).


1 시간 후에 답변이 게시되는 것으로 무엇입니까 ?
Dennis

내 게시물에서 1 시간 후 질문 관련 의심을 수정하는 데 최소 1 시간이 걸립니다.
Mukul Kumar

8
커뮤니티가 이러한 종류의 제한을 기꺼이 시행 할 것인지 확실하지 않습니다. 사양이 확실하지 않은 경우 샌드 박스 에 챌린지 초안을 게시하여 기본에 게시 하기 전에 피드백을받을 수 있습니다.
Dennis

@dennis 흠 ... 제거됨
Mukul Kumar

두 가지 질문이 있습니다. (1) 어떤 바닥에도 후행 공백이 없다고 가정 할 수 있습니까? (2) 지상 이후에 더 이상 입력 라인이 없다고 가정 할 수 있습니까?
H Walters

답변:


4

Vim, 41 38 바이트

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

여기서는 ^문자 캐럿에 사용됩니다. ␍는 CTRL-M에 사용됩니다.

설명

qw:sl 500m␍q0.5 초의 절전 모드를 매크로 w로 기록하면서 0.5 초의 절전 모드를 해제합니다. /{␍폭발물과 함께 바닥으로 이동합니다. qq매크로 q를 기록하기 시작합니다.이 매크로는 재귀 적으로 호출됩니다.

jk위아래로 움직입니다. 마지막 줄에 있으면 오류가 발생합니다 (접지). 오류는 재귀 매크로를 종료합니다. ^v$r*공백이 아닌 첫 문자부터 줄 끝까지의 모든 것을 *로 바꿉니다. @w0.5 초간 기다렸다가 dd현재 층 을 삭제합니다. :-␍맨 위 줄에 있으면 매크로를 종료하지 않고 바닥 위로 이동합니다. @w그런 다음 0.5 초 더 기다린 다음 @qq 매크로를 호출합니다 (처음 비어 있음).

q@q 매크로 q 기록을 중지 한 다음 호출하여 재귀를 트리거합니다.

생기

Vim 철거


나는 gif를보고 싶어했다!!
Mukul Kumar

나는 아무도 다른 GIF를 넣지 않았 음을 알았지 만 "자유롭게"라고 말했기 때문에 내 게시물에는 필수였습니다! 어쨌든, V로 다시 쓰면 대답이 더 "골프"될 수 있습니다.
H Walters

my answer could be "golfed" further...하지 정도는? : P
Mukul Kumar

4

자바 스크립트 (ES6), 208 198 바이트

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

자바 7, 589 477476 바이트

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

좋아, 그것은 엉망 / 길지만,이 도전에는 Java에 대한 많은 성가신 것들이 있습니다. 인쇄 멀티 라인; Thread.sleep(500)어느 것이 필요합니다 throws Exception; 두 분리 문자 사이의 서브 스트링을 같은 양으로 대체 *; 등등.이
모든 것이 프로그램을 꽤 크게 만듭니다 .. 그것은 확실히 더 많은 골프를 쳤을 수도 있고, 다른 접근법으로 반으로 줄 수도 있지만, 적어도 지금은 대답이 있습니다. ;)

언 골프 드 :

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

테스트 코드 :

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

여기에서 시도하십시오. (ideon에서는 한 번에 출력하고sleep..을무시합니다.)


예외를 잡으면 몇 바이트를 절약 할 수 있습니다. 아니면 try{...}finally{return;}?

감사합니다 @Neil,하지만 난 그래서 지금은 싱글, 두 가지 방법을 통합 관리했습니다throws Exception
케빈 Cruijssen

2

하스켈, 245221 바이트

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

사용 예 :

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

작동 방식 :

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

참고 : 또한 거기 threadDelay에서 GHC.Conc대신 usleep에서 System.Posix.Unistd하는 것은 조금 짧은 비트,하지만 그것은 단지와 함께 작동 GHC이 일반적인되지 않을 것, 그래서 컴파일러 Haskell대답.


2

씨, 314 287 281 271 바이트

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 변경 이후 !=-그리고 가능한 경우뿐만 아니라, 문자 리터럴을 회피 isspace(H 월터스에 감사드립니다). 그러나 ungolfed 코드는 변경되지 않습니다.

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

쉼표를 적용하고 {}2 이후를 삭제 한 후 -6 바이트 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 바이트, 불필요한 괄호 제거, 로컬 변수를 전역 (자동 0 초기화) 및 b[0]로 변경 *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);}

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
당신은 정의 할 수 있습니다 s,e,t다음과 같이 외부 세계s,e,t;
Mukul을 쿠마

@MukulKumar 확실합니까?
마크 이스리

그래도 계속 시도해보십시오 ... 또한 i다른 사람들과 함께하십시오.
Mukul Kumar

나는 다른 최적화를 시도하고 당신의 제안도 사용할 것입니다
VolAnd

@MukulKumar 조언을 주셔서 감사합니다 ... -23 바이트
VolAnd

1

펄, 153 바이트

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}

이것은 GNU sleep 명령을 사용하여 500 밀리 초 동안 기다립니다.

언 골프 버전

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 바이트

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

명령 행 인수에서 문자열 목록으로 입력을받습니다 (개행 문자 없음).

파일로 저장하고 다음으로 실행 php <filename> ' |' ' |#|' ' {#}' ' |# #|' '|# # #|' '|# # #|' '|# # #|' 'TTTTTTT'

고장

<?
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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.