বিল্ডিং ধ্বংস


11

চ্যালেঞ্জ

প্রতি সেকেন্ডে 1 তল হারে প্রদত্ত বিল্ডিংকে ধ্বংস করতে একটি সম্পূর্ণ প্রোগ্রাম / ফাংশন লিখুন ।

ইনপুট

ইনপুট একটি হল ভবন মাধ্যমে stdin (অথবা যাই হোক না কেন আপনার ভাষায় বলা হয়) অথবা একটি মাধ্যমে ARGUMENT টি একটি ফাংশন আছে। t = 0 s

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

ইনপুট থাকে:

  • | চিহ্নগুলি একটি মেঝের শুরু এবং শেষ।
  • {, }বিস্ফোরক দিয়ে মেঝে চিহ্নিত।
  • # একটি উইন্ডো যা সজ্জা জন্য হয়।
  • স্পেস, যা মেঝে যেখানে #নেই সেখানে ভিতরে সর্বত্র ।
  • T চিহ্ন স্থল (ধ্বংস করা যায় না)।
  • * বিস্ফোরিত মেঝে চিহ্নিত করে।

ইনপুট বিধি:

  • বিল্ডিংটি একের সাথে শুরু হয় |এবং মাটিতে শেষ হয় (না ( T) = না ( char used in ground floor) দিয়ে।
  • একটি জানালা #প্রতিটি মেঝে ভিতরে প্রতিটি বিজোড় জায়গায় হয়।
  • T আপনার ইনপুট এর শেষ চিহ্নিত করে।
  • শুধুমাত্র একটি তল বিস্ফোরক নিয়ে গঠিত।
  • প্রতিটি তল বিজোড় নং দিয়ে তৈরি চর
  • আপনি মেঝেতে আরোহণের সময় মেঝেগুলি পূর্ববর্তী তলের সমান আকারের হতে পারে বা 2 টি বড় হতে পারে ।
  • ইনপুটটি charsবা এর অ্যারে হিসাবে নেওয়া যেতে পারে strings

আউটপুট:

t = 0.5 s

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

t = 1 এস

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

t = 1.5 s

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

t = 2 s

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

t = 2.5 s

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

TTTTTTT  

আউটপুট নিয়ম:

  • প্রতিটি তল একটি newlineঅক্ষর দিয়ে শেষ হয় ।
  • গ্রাউন্ডে / চলমান নতুন লাইন নাও থাকতে পারে।
  • বিল্ডিং আউটপুট (বা এর কি বাকি) প্রতি 0.5 এস।
  • আউটপুটটি অ্যানিমেশনের মতো যা প্রতি 0.5 এস স্ক্রিনে পরিবর্তিত হয় এবং প্রদর্শিত হয়।
    (এছাড়াও আপনার উত্তর সহ জিআইএফ পোস্ট করতে নির্দ্বিধায়)

এটি একটি কোড-গল্ফ তাই সংক্ষিপ্ততম বাইটের কোডটি জয়!
জমা দেওয়ার শেষ তারিখ এখন থেকে ঠিক 5 দিন

(তবে আপনি কী জানেন? বিজয়ী সবকিছুই নয়, বিজয়ী ঘোষণার পরেও নিজের পছন্দসই ভাষায় এই চ্যালেঞ্জটি ব্যবহার করতে দ্বিধা বোধ করবেন:])।

সম্পাদনা: আপনি ইনপুট নেওয়ার পদ্ধতিটি আমি বদলেছি (আসলে আমার খারাপ)।


কি উত্তর এখন থেকে 1 ঘন্টা পর পোস্ট করা অনুমিত হয় সম্পর্কে?
ডেনিস

আমার পোস্টের সময় থেকে 1 ঘন্টা যাতে কোনও প্রশ্ন সম্পর্কিত সন্দেহ সংশোধন করতে আমি কমপক্ষে 1 ঘন্টা পাই।
মুকুল কুমার

8
আমি নিশ্চিত নই যে সম্প্রদায় এই ধরণের সীমাবদ্ধতা প্রয়োগ করতে রাজি হবে কিনা। যদি আপনি নিশ্চিত হন না যে আপনার স্পেসিফিকেশনটি শক্তিশালী, তবে আপনি আমাদের স্যান্ডবক্সে চ্যালেঞ্জের খসড়াটি পোস্ট করতে পারেন প্রধানত পোস্ট করার আগে প্রতিক্রিয়া জানাতে ।
ডেনিস

@ এডনিস হুম ... অপসারণ করা হয়েছে
মুকুল কুমার

দুটি প্রশ্ন: (1) আমরা কি ধরে নিতে পারি যে কোনও তলায় কোনও পেছনের সাদা জায়গা নেই? (২) আমরা কি ধরে নিতে পারি মাটির পরে আর কোনও লাইন ইনপুট নেই?
এইচ ওয়াল্টার্স

উত্তর:


4

ভিম, 41 38 বাইট

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

এখানে, ^একটি আক্ষরিক কেরেটের জন্য ব্যবহৃত হয়; C সিটিআরএল-এম এর জন্য ব্যবহৃত হয়।

ব্যাখ্যা

qw:sl 500m␍qঅর্ধেক সেকেন্ড ঘুমায়, যখন অর্ধেক দ্বিতীয় ঘুমকে ম্যাক্রো ডাব্লু হিসাবে রেকর্ড করে। /{␍বিস্ফোরক সঙ্গে মেঝে সরানো। qqম্যাক্রো কি রেকর্ডিং শুরু করে, যা পুনরাবৃত্তভাবে নিজেকে কল করবে।

jkনীচে এবং উপরে সরানো; আপনি শেষ লাইনে (স্থল) থাকলে এটি একটি ত্রুটি তৈরি করে; ত্রুটি পুনরাবৃত্তি ম্যাক্রো সমাপ্ত করে। ^v$r*প্রথম অ-হোয়াইটস্পেস অক্ষর থেকে শুরু করে লাইনের শেষ অবধি সবকিছুকে * এর সাথে প্রতিস্থাপন করে। @wআধ সেকেন্ড অপেক্ষা করে, তারপরে ddবর্তমান তলটি মুছে ফেলবে। :-␍আপনি যদি শীর্ষ লাইনে থাকেন তবে ম্যাক্রোটি বন্ধ না করে একটি তল সরিয়ে দেয়। @wতারপরে আরও অর্ধেক সেকেন্ড অপেক্ষা করে এবং @qq ম্যাক্রো (প্রাথমিকভাবে খালি) কল করে।

q@q ম্যাক্রো কি রেকর্ড করা বন্ধ করে, তারপরে এটিকে কল করে, পুনরাবৃত্তিটি ট্রিগার করে।

অ্যানিমেশন

ভিম ধ্বংস


আমি একটি জিআইএফ দেখতে অনাহার ছিল !!
মুকুল কুমার

আমি লক্ষ্য করেছি যে অন্য কেউ জিআইফ রাখেনি, তবে আপনি বলেছিলেন "নির্দ্বিধায়", সুতরাং আমার পোস্টটির জন্য এটি অবশ্যই আবশ্যক ছিল! যাইহোক, আমার উত্তরটি আরও "গল্ফড" হতে পারে যদি ভি তে আবার লেখা হয়
এইচ ওয়াল্টার্স

my answer could be "golfed" further... নয় যে যথেষ্ট? : পি
মুকুল কুমার

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 477 476 বাইট

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

ঠিক আছে, এটি একটি বিশৃঙ্খলা / দীর্ঘ, তবে এই চ্যালেঞ্জটিতে জাভাটির জন্য অনেকগুলি বিরক্তিকর জিনিস রয়েছে .. বহু-লাইন মুদ্রণ করা; 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){}
  }
}

এখানে চেষ্টা করুন। (আদর্শে এটি একবারে আউটপুট দেয় এবং উপেক্ষা করেsleep..)


ব্যতিক্রমটি ধরা আপনার কয়েকটি বাইট সংরক্ষণ করতে পারে। নাকি try{...}finally{return;}?
নীল

@ নীল ধন্যবাদ, তবে আমি উভয় পদ্ধতি একত্রিত করতে পেরেছি, এখন আমার একক আছেthrows Exception
কেভিন ক্রুইজসেন

2

হাস্কেল, 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 (এইচ ওয়াল্টার্সকে অনেক ধন্যবাদ)। তবে অবারিত কোড অপরিবর্তিত রয়েছে।

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

বিশ্বব্যাপী (সঙ্গে স্বয়ংক্রিয় 0 আরম্ভের) এবং সামান্য অপ্টিমাইজেশান পর -26 বাইট, অপসারণ অপ্রয়োজনীয় প্রথম বন্ধনী, সেইসাথে পরিবর্তন স্থানীয় ভেরিয়েবল 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);}

অবহেলিতদের সাথে টেস্ট কোড 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;
মুকুল কুমার

@ মুকুলকুমার আপনি কি নিশ্চিত?
ইয়িশ্রি

অবশ্যই নিশ্চিতভাবে এগিয়ে যান এবং চেষ্টা করুন ..., iঅন্যদের সাথেও অন্তর্ভুক্ত করুন ।
মুকুল কুমার

আমি আরও কিছু অপ্টিমাইজেশান চেষ্টা করব এবং আপনার পরামর্শগুলিও ব্যবহার করব
ভোল্যাণ্ড এবং

পরামর্শের জন্য @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}

এটি 500 মিলিসেকেন্ডের জন্য অপেক্ষা করতে GNU স্লিপ কমান্ড ব্যবহার করে।

উদার সংস্করণ

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

পিএইচপি, 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.