การรื้อถอนอาคาร


11

ท้าทาย

เขียนโปรแกรม / เต็มฟังก์ชั่นที่จะรื้อถอนอาคารที่ได้รับในอัตรา1 ชั้นต่อวินาที

INPUT

อินพุตคือสิ่งปลูกสร้างผ่านSTDIN (หรืออะไรก็ตามที่ถูกเรียกในภาษาของคุณ) หรือผ่านฟังก์ชั่น ARGUMENT t = 0 วิ

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

การป้อนข้อมูลประกอบด้วย:

  • | เครื่องหมายเริ่มต้นและสิ้นสุดของพื้น
  • {, }เครื่องหมายชั้นกับวัตถุระเบิด
  • # เป็นหน้าต่างที่ใช้สำหรับตกแต่ง
  • คือพื้นที่ซึ่งมีอยู่ทุกหนทุกแห่งภายในชั้นที่#ไม่มี
  • T ทำเครื่องหมายพื้นดิน (ไม่สามารถทำลายได้)
  • * ทำเครื่องหมายพื้นระเบิด

กฎการป้อนข้อมูล:

  • สิ่งปลูกสร้างเริ่มจากด้านบนหนึ่ง|และสิ้นสุดบนพื้นดิน (โดยไม่มี ( T) = no ( char used in ground floor))
  • มีหน้าต่าง#อยู่ทุกที่แปลก ๆ ทุกชั้น
  • T ทำเครื่องหมายจุดสิ้นสุดของการป้อนข้อมูลของคุณ
  • เพียงหนึ่งชั้นประกอบด้วยวัตถุระเบิด
  • ทุกชั้นทำจากคี่ไม่มี ของตัวอักษร
  • ในขณะที่คุณขึ้นไปบนพื้นชั้นอาจมีขนาดเท่ากันกับชั้นก่อนหน้าหรืออาจใหญ่กว่า2ตัวอักษร
  • การป้อนข้อมูลสามารถนำมาเป็นอาร์เรย์ของหรือcharsstrings

ผลผลิต:

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 s

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

t = 6.5 วิ

*******
TTTTTTT  

t = 7 วิ

TTTTTTT  

กฎเอาท์พุท:

  • ทุกชั้นลงท้ายด้วยnewlineตัวละครตัว หนึ่ง
  • กราวด์อาจ / อาจไม่มีการขึ้นบรรทัดใหม่
  • เอาท์พุทอาคาร (หรืออะไรที่เหลืออยู่ของมัน) ทุกๆ 0.5 วินาที
  • เอาต์พุตเหมือนภาพเคลื่อนไหวที่ปรับเปลี่ยนทุก 0.5 วินาทีและแสดงขึ้น
    (นอกจากนี้คุณสามารถโพสต์ GIF ด้วยคำตอบของคุณ)

นี่คือCode-Golfดังนั้นโค้ดในจำนวนไบต์ที่สั้นที่สุดจะชนะ!
วันสุดท้ายของการส่งคือ 5 วันนับจากนี้

(แต่คุณรู้อะไรไหมการชนะไม่ใช่ทุกอย่างอย่าลังเลที่จะลองความท้าทายนี้ในภาษาที่คุณชื่นชอบแม้ว่าจะมีการประกาศผู้ชนะ:]

แก้ไข:ฉันเปลี่ยนวิธีที่คุณป้อนข้อมูล (ไม่ดีจริง ๆ )


อะไรคือคำตอบที่ควรจะได้รับการโพสต์หลังวันที่ 1 ชั่วโมงจากนี้เกี่ยวกับอะไร?
เดนนิส

1 ชั่วโมงนับจากเวลาโพสต์ของฉัน เพื่อให้ฉันได้รับอย่างน้อย 1 ชั่วโมงเพื่อแก้ไขข้อสงสัยที่เกี่ยวข้อง
Mukul Kumar

8
ฉันไม่แน่ใจว่าชุมชนยินดีที่จะบังคับใช้ข้อ จำกัด ประเภทนี้หรือไม่ หากคุณไม่แน่ใจว่าข้อมูลจำเพาะของคุณมั่นคงคุณสามารถโพสต์ร่างการท้าทายในแซนด์บ็อกซ์ของเราเพื่อรับข้อเสนอแนะก่อนโพสต์ไว้บนหลัก
เดนนิส

@dennis Hmm ... ลบแล้ว
Mukul Kumar

คำถามสองข้อ: (1) เราคิดว่าไม่มีช่องว่างต่อท้ายที่ชั้นใดหรือไม่? (2) เราอาจสมมติว่าไม่มีสายอินพุตอีกหลังจากพื้นดินหรือไม่
H Walters

คำตอบ:


4

เป็นกลุ่ม, 41 38 ไบต์

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

ที่นี่^ใช้สำหรับคาเร็ตตัวอักษร ␍ใช้สำหรับ CTRL-M

คำอธิบาย

qw:sl 500m␍qหลับครึ่งวินาทีในขณะที่บันทึกครึ่งวินาทีหลับเป็นมาโครที่มี /{␍ย้ายไปกองกับพื้นด้วยวัตถุระเบิด qqเริ่มบันทึกมาโคร q ซึ่งจะเรียกตนเองว่าวนซ้ำ

jkเลื่อนขึ้นและลง; สิ่งนี้จะสร้างข้อผิดพลาดหากคุณอยู่ในบรรทัดสุดท้าย (กราวด์); ข้อผิดพลาดยกเลิกแมโครซ้ำ ^v$r*แทนที่ทุกอย่างจากอักขระที่ไม่ใช่ช่องว่างตัวแรกไปยังจุดสิ้นสุดของบรรทัดด้วย * ของ @wรอครึ่งวินาทีจากนั้นddลบพื้นปัจจุบัน :-␍เลื่อนขึ้นชั้นโดยไม่ต้องยกเลิกแมโครหากคุณอยู่ในบรรทัดบนสุด @wจากนั้นรออีกครึ่งวินาทีและ@qเรียกมาโคร q (เริ่มแรกว่าง)

q@q หยุดการบันทึกแมโคร q จากนั้นเรียกมันเรียกการเรียกซ้ำ

นิเมชั่น

การรื้อถอนเป็นกลุ่ม


ฉันกำลังหิวเพื่อดู gif !!
Mukul Kumar

ฉันสังเกตเห็นว่าไม่มีใครใส่ gif เข้าไป แต่คุณบอกว่า "รู้สึกฟรี" ดังนั้นสำหรับโพสต์ของฉันมันเป็นสิ่งที่ต้องทำ! อย่างไรก็ตามคำตอบของฉันอาจเป็น "golfed" เพิ่มเติมหากเขียนใหม่ใน V.
H Walters

my answer could be "golfed" further... ไม่ว่าเพียงพอหรือไม่ : P
Mukul Kumar

4

JavaScript (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

Java 7, 589 477 476 bytes

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; แทนที่สตริงย่อยระหว่างสองตัวคั่นด้วยเงินจำนวนเท่ากัน*; ฯลฯ
ทั้งหมดนี้ทำให้โปรแกรมมีขนาดค่อนข้างใหญ่ .. มันสามารถเล่นกอล์ฟได้อย่างละเอียดยิ่งขึ้นบางทีอาจลดลงครึ่งหนึ่งด้วยวิธีการที่แตกต่างกัน แต่อย่างน้อยก็มีคำตอบในตอนนี้ ;)

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

รหัสทดสอบ:

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

ลองที่นี่ (บน ideone มันจะแสดงผลออกมาทันทีและไม่สนใจsleep.. )


การจับข้อยกเว้นอาจช่วยให้คุณไม่กี่ไบต์ หรืออาจจะtry{...}finally{return;}?
Neil

@ Neil ขอบคุณ แต่ฉันได้รวมวิธีการทั้งสองดังนั้นตอนนี้ฉันมีหนึ่งเดียวthrows Exception
Kevin Cruijssen

2

Haskell, 245 221 ไบต์

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 Walters) แต่รหัส 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);}

-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 Kumar

@MukulKumar คุณแน่ใจเหรอ?
Mark Yisri

ใช่แน่นอนไปข้างหน้าและลอง ... รวมถึงiกับคนอื่น ๆ
Mukul Kumar

ฉันจะลองเพิ่มประสิทธิภาพอื่น ๆ และใช้คำแนะนำของคุณเช่นกัน
VolAnd

@MukulKumar ขอบคุณสำหรับคำแนะนำ ... -23 bytes
VolAnd

1

Perl, 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.