ডমিনোসের মতো পড়েন


22

আপনি 80 টি অক্ষরের প্রস্থের টার্মিনালের ভিতরে বাস করেন live আপনি বিরক্ত, তাই আপনি ডমিনোস খেলার সিদ্ধান্ত নিন। না, স্ক্র্যাবলের মতো দেখতে বিরক্তিকর ধরণের নয়, মজাদার ধরণের যেখানে আপনি তাদের এক সেকেন্ডে পড়তে দেখতে একটি ঘন্টা ব্যয় করেন।

টার্মিনালগুলিতে, ডমিনোসগুলি এর মতো দেখায়:

|   upright domino
\   left-tilted domino
/   right-tilted domino
__  fallen domino

যেমনটি আমরা সকলেই জানি, যদি একটি ঝুঁকানো ডোমিনো একটি খাঁটিটিকে স্পর্শ করে, তবে দ্বিতীয় ডোমিনোটিও কাত হয়ে যায়। এটির একমাত্র ব্যতিক্রম হ'ল যদি দুটি টিল্টড ডোমিনয়েস এটি স্পর্শ করে:

|\ --> \\        /| --> //        /|\ --> /|\

আপনার টার্মিনালের মহাকর্ষীয় ধ্রুবক সামঞ্জস্য করুন যাতে এই রূপান্তরটি 100 এমএস লাগে।

যদি একটি কাতানো ডোমিনো অন্য ডোমিনো বা টার্মিনালের দেয়াল দ্বারা সমর্থিত হয় তবে এর যাত্রা শেষ হবে।

কাতানো ডোমিনোসের কোনওটিতেই নেই

\||||____||||/__                /|\    /\    /|\                __\||||____||||/

(৮০ টি অক্ষর) স্থানান্তরিত হবে, যেহেতু দুটি বহিরাগত টিল্টড ডোমিনোস টার্মিনালের দেয়াল দ্বারা সমর্থিত এবং অন্যরা সমস্ত অন্যান্য ডোমিনোস দ্বারা সমর্থিত।

তবে, যদি ঝুঁকির দিকের স্থানটি খালি থাকে তবে ডোমিনো নীচে নেমে যায়:

| \\ --> |__\        // | --> /__|

টার্মিনাল। মহাকর্ষীয় ধ্রুবক. আপনি পয়েন্ট পেতে…

অবশেষে, বাম দিক থেকে একটি হালকা বাতাস রয়েছে, তাই ডান-কাত হওয়া ডমিনোয়গুলি বাম-কাত হওয়াগুলির চেয়ে দ্রুত পড়ে:

|/ \| --> |__\|

কার্য

একটি প্রোগ্রাম / ফাংশন লিখুন যা টার্মিনালে ডমিনোস খেলে একটি অ্যানিমেশন দেখায়।

আপনার কোড নিম্নলিখিত করা উচিত:

  1. ডোমিনোজের প্রাথমিক অবস্থার প্রতিনিধিত্ব করে ইনপুট থেকে একটি স্ট্রিং পড়ুন।

    এই স্ট্রিংটিতে ৮০ টির বেশি অক্ষর থাকবে না এবং কেবল উপরে বর্ণিত ডোমিনয়েস এবং খালি জায়গাগুলি সমন্বিত থাকবে।

  2. রাষ্ট্রটি মুদ্রণ করুন এবং 100 এমএসের জন্য অপেক্ষা করুন।

  3. উপরে বর্ণিত হিসাবে রাষ্ট্রের রূপান্তর করুন।

  4. যদি রাষ্ট্র পরিবর্তন হয় তবে 2 এ ফিরে যান।

অতিরিক্ত বিধি

  • ইনপুট স্ট্রিংয়ের দৈর্ঘ্য টার্মিনালের প্রস্থকে প্রভাবিত করে না; এমনকি যদি স্ট্রিংটি 80 টি অক্ষরের চেয়ে কম হয় তবে টার্মিনালের দেয়ালগুলি এখনও 80 টি অক্ষর আলাদা।

  • প্রতিবার দ্বিতীয় পদক্ষেপ কার্যকর করা হলে, পূর্বের রাজ্যটিকে ওভাররাইট করে একই স্থানে রাজ্যের মুদ্রণ করা উচিত।

  • যেহেতু কিছু ভাষা ঠিক 100 এমএস অপেক্ষা করতে অক্ষম, তাই 50 এবং 1000 এমএসের মধ্যে যে কোনও পরিমাণ অপেক্ষা করতে নির্দ্বিধায় অনুভব করুন।

  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।

উদাহরণ

  • প্রাথমিক অবস্থার জন্য

     ||\/||
    

    নিম্নলিখিত মুদ্রণ করুন (একের পর এক):

     ||\/||
     |\\//|
     \\\///
    __\\//__
    
  • প্রাথমিক অবস্থার জন্য

    /||||\
    

    নিম্নলিখিত মুদ্রণ করুন

    /||||\
    //||\\
    ///\\\
    
  • প্রাথমিক অবস্থার জন্য

    /|||\
    

    নিম্নলিখিত মুদ্রণ করুন

    /|||\
    //|\\
    
  • প্রাথমিক অবস্থার জন্য

    |/ \|/ \|/ \|/ \|
    

    নিম্নলিখিত মুদ্রণ করুন:

    |__\|__\|__\|__\|
    
  • প্রাথমিক অবস্থায় (৮০ টি অক্ষর)

    \||||____||||/__                /|\    /\    /|\                __\||||____||||/
    

    নিম্নলিখিত মুদ্রণ করুন

    \||||____||||/__                /|\    /\    /|\                __\||||____||||/
    

উত্তর:


13

রেটিনা , 87 86 85 বাইট

1 বাইট সঞ্চয় করার জন্য ডেনিসকে ধন্যবাদ।

^.{0,79}$
$0 
:`^
<ESC>c
(`/ | \\
__
/\|(?!\\)
//a
(?<!/)\|\\
\\
$
aaaaa
a
aaaa
(a+)+b|a
<empty>

<ESC>প্রকৃত নিয়ন্ত্রণ অক্ষর (0x1 বি) দ্বারা প্রতিস্থাপন করা উচিত। <empty>একটি খালি ট্রেলিং লাইন উপস্থাপন করে। তারপরে আপনি -sপতাকা সহ একটি ফাইল থেকে উপরের কোডটি চালাতে পারেন run

কোডটির জন্য একটি টার্মিনাল প্রয়োজন যা এএনএসআই এস্কেপ কোডগুলিকে সমর্থন করে। আমি রেটিনার আউটপুটে লাইন ফিডটি দমন করতে পারি না তাই <ESC>cপ্রতিবারের সাথে আমার পুরো কনসোলটি সাফ করা দরকার । আমি রেটিনা চালানোর জন্য মনো ব্যবহার করে ব্যাশে কোডটি পরীক্ষা করেছি।

ব্যাখ্যা

^.{0,79}$
$0 

ইনপুটটিতে 80 টিরও কম অক্ষর থাকলে আমরা একটি স্থান যুক্ত করে শুরু করি। এটি এমন যাতে /ডান প্রান্তে আলাদাভাবে চিকিত্সা করা উচিত নয়।

:`^
<ESC>c

এখন আমরা <ESC>cস্ট্রিংকে প্রিপেন্ড করি , এটি টার্মিনাল সাফ করার জন্য এএনএসআই এস্কেপ কোড। সুতরাং প্রতিবার স্ট্রিংটি মুদ্রিত হলে এটি টার্মিনালের শীর্ষে করবে। :`এই প্রতিকল্পন, অর্থাত্ প্রারম্ভিক কনফিগারেশন ফল প্রিন্ট আউট করতে অক্ষিপট নির্দেশ দেয়।

(`/ | \\
__

(`একটি লুপ শুরু হয়। যেহেতু কোনও মিল নেই ), লুপটি প্রোগ্রামের শেষ পর্যায়ে যাওয়ার জন্য ধরে নেওয়া হয়। প্রতিটি পুনরাবৃত্তি ডমিনোস পড়ার এক ধাপ অনুকরণ করে এবং তারপরে কিছুটা "ঘুম" দেয়। এই প্রথম পর্যায়ে প্রতিস্থাপন করা হয় /এবং তার \পরে একটি স্থান __। এটি স্বয়ংক্রিয়ভাবে কেসটি / \সঠিকভাবে পরিচালনা করে , কারণ মিলগুলি ওভারল্যাপ করতে পারে না এবং বাম থেকে ডানে অনুসন্ধান করা হয়। সুতরাং /<sp>মিলেছে করা হবে এবং পরিণত মধ্যে __যেমন যে \মিলেছে করা যাবে না, এবং আমরা সঠিক পেতে __\

/\|(?!\\)
//a

এটি প্রদত্ত /|রূপান্তরিত //হয় এর \পাশে আর কোনও নেই । আমরা aএমন একটি সংযোজন করি যাতে এই নতুনটি /পরবর্তী পর্যায়ে বিভ্রান্ত হয় না (যা এই পরিবর্তন সম্পর্কে "জানেন না")।

(?<!/)\|\\
\\

বিপরীত অবস্থা: পালা |\মধ্যে \\প্রদান করা কোন ব্যাপার /পাশে। আমাদের aএখানে কোনও রাখার দরকার নেই, কারণ সিমুলেশনটির এই পদক্ষেপটি আমরা শেষ করেছি।

ঘুমের অংশ এখন ...

$
aaaaa

aকোডের শেষে আরও 5 টি যুক্ত করে।

a
aaaa

প্রত্যেককে a4 aটি করে তোলে , সুতরাং আমরা aশেষে 20 টি পেতে পারি get

(a+)+b|a
<empty>

এখন মজার অংশ ... আমরা বিপর্যয়কর ব্যাকট্র্যাকিংয়ের সাহায্যে কিছুটা ঘুমিয়েছি(a+)+গ্রুপটির পুনরাবৃত্তির মধ্যে একটি ম্যাচ বিভক্ত করার জন্য একটি ক্ষতিকারক পরিমাণ রয়েছে । কারণ bব্যর্থ ম্যাচ কারণ, ইঞ্জিন পরিত্যাগ এবং সিদ্ধান্ত নেওয়ার যে পূর্ববর্তীদের সমাহারের প্রতি একক এক চেষ্টা করবে (a+)+bমেলে না। বিশের aদশকের শেষে যা অর্ধেক সেকেন্ডের মতো লাগে।

একই সময়ে, আমরা রেজেক্সকে একটি একক সাথে মেলানোর অনুমতি দিই a, তবে কেবল ব্যাকট্র্যাকিংয়ের পরে । যখন এটি মেলে, আমরা একে খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করি, আমরা স্ট্রিং aথেকে একটি কারণে বা অন্য কারণে সন্নিবেশিত সমস্ত গুলি সরিয়ে ফেলি।

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


6

জাভাস্ক্রিপ্ট (ES6), 206 148 129 158 বাইট

অবশেষে আমি এটিকে একটি নিচু জায়গায় পৌঁছে দিয়েছি তবে এটি কনসোলটি সাফ করবে না বা কোনও অতিরিক্ত স্থান যুক্ত করবে না; এই সমস্যাগুলি এখন সংশোধন করা হয়েছে।

c=console;d=s=>{c.clear(s[79]||(s+=' ')),c.log(s),t=s[R='replace'](/\/ | \\/g,'__')[R](/\/\|/g,'//a')[R](/\|\\/g,'\\\\')[R](/a/g,'');t!=s&&setTimeout(d,99,t)}

বিকল্প 153 বাইট সংস্করণ যা নোড.জেএস এ কাজ করা উচিত:

d=s=>{s[79]||(s+=' '),console.log("\033c"+s),t=s[R='replace'](/\/ | \\/g,'__')[R](/\/\|/g,'//a')[R](/\|\\/g,'\\\\')[R](/a/g,'');t!=s&&setTimeout(d,99,t)}

আইএমএইচও, এটি খেলতে বেশ মজাদার। একটি HTML সংস্করণ এখানে চেষ্টা করুন:

গল্ফ করার জন্য সম্ভবত আরও ভাল জায়গা আছে। পরামর্শ স্বাগত!


আমার চালিত 10 মিনিটের জন্য নষ্ট হওয়া ডেমোটির জন্য +1 এবং র্যান্ডমাইজার ফাংশনটির জন্য +1 তবে ডেনিস যেমন উল্লেখ করেছেন, এটি প্রথম পরীক্ষার ক্ষেত্রে ব্যর্থ। চেষ্টা করুন /বা /|এবং আপনি দেখতে পাবেন টাইলটি যেমনভাবে পড়ে তেমনভাবে পড়ে না।
dberm22

@ ডেনিস এই সমস্যাগুলি দেখানোর জন্য ধন্যবাদ। আমি বিশ্বাস করি যে আমি এখনই দু'জনকে ঠিক করেছি।
ETH প্রোডাকশনগুলি

নোড চর্বিযুক্ত তীর সম্পর্কে খুশি নয়, তবে এটি অন্যথায় ভাল কাজ করে। আপনি \0333 বাইট সংরক্ষণ করে আক্ষরিক ESC বাইট দ্বারা প্রতিস্থাপন করতে পারেন ।
ডেনিস

2

পার্ল 5, 154 146

2 রেজেক্সের মধ্যে রাষ্ট্র বজায় রাখতে একটি অস্থায়ী চরিত্র ব্যবহার করতে হয়েছিল।
ঝুঁকি মোকাবেলায় / / এর মতো কিছু | | / / / এর পরিবর্তে / / / \ as হিসাবে শেষ হবে \ \।

$_=substr(pop.' ',0,80);$|++;while($}ne$_){print"$_\r";$}=$_;s@ \\|/ @__@g;s@/\|(?=[^\\])@/F@g;s@([^/])\|\\@$1\\\\@g;tr@F@/@;select($\,$\,$\,0.1)}

পরীক্ষা

$ perl dominos.pl '|\ |\/|||\/|'
|\__\//|\\/__

1
আপনি যদি স্ল্যাশ ব্যতীত অন্য একটি ডিলিমিটার ব্যবহার করেন - যেমন s, \\|/ ,__,gপরিবর্তে আপনি বেশ কয়েকটি ব্যাকস্ল্যাশগুলি নির্মূল করতে পারেন s/ \\|\/ /__/g
hobbs

ভালো পরামর্শ. সেই কৌশল সম্পর্কে ভুলে গেছেন। এবং কিছু বাইট অতিরিক্ত অবহেলিত সেট ব্যবহার করে কাটা হয়েছিল।
LukStorms

2

ES6 , 220 218 195 বাইট

minified

f=d=>{var e,c=console;if(!d[79])d+=' ';c.clear();c.log(d);e=d;d=d[R='replace'](/\/\|\\/g,'a')[R](/\/ | \\/g,'__')[R](/\/\|/g,'//')[R](/\|\\/g,'\\\\')[R]('a','/|\\');if(e!=d)setTimeout(f,100,d);};

আরও পঠনযোগ্য

f=d=> {
    var e,
    c=console;
    if(!d[79])
        d+=' ';
    c.clear();
    c.log(d);
    e=d;
    d = d[R='replace'](/\/\|\\/g, 'a')  //Substitute '/|\' with 'a' so it doesn't get replaced
        [R](/\/ |  \\/g, '__')     //Replace '/ ' and ' \' with '__'
        [R](/\/\|/g, '//')    //Replace '/|' with '//'
        [R](/\|\\/g, '\\\\')  //Replace '|\' with '\\'
        [R]('a', '/|\\');     //Put '/|\' back
    if(e!=d)
        setTimeout(f,100,d);
};

2
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! 1. আপনি কেন ES6 স্বরলিপি ব্যবহার করছেন তা আমি নিশ্চিত নই। () = > {এবং }()কেবল আপনার কোড থেকে সরানো যেতে পারে। ২. আমি মনে করি না সতর্কতা বাক্সগুলি কোনও অ্যানিমেশনের জন্য একটি গ্রহণযোগ্য আউটপুট ফর্ম্যাট। আপনি হয় আপনার জেএসকে এইচটিএমএল এম্বেড করতে পারেন বা প্রয়োজনীয় পরিবর্তন করতে পারেন যাতে এটি কমান্ড লাইন থেকে কাজ করে। ৩. উভয় ক্ষেত্রেই আপনার কোডটি প্রায় অপেক্ষা করতে হবে। এক রাজ্য এবং পরের মুদ্রণের মধ্যে 100 এমএস।
ডেনিস

2
পিপিসিজিতে আপনাকে স্বাগতম! আপনার গল্ফিং উন্নত করতে সহায়তা করার জন্য আমি এই পোস্টটি এবং এই পোস্টটি চেক করার পরামর্শ দেব ।
23

গল্ফিং টিপসের পরামর্শ এবং লিঙ্কগুলির জন্য আপনাকে ধন্যবাদ। এটি এখনও কিছুটা দীর্ঘ, তবে আমি এটি কিছুটা সংক্ষিপ্ত করে টাইমার যুক্ত করেছি। আমি টিপসটি আরও গভীরতার সাথে যাব এবং আমি কী সংক্ষিপ্ত করতে পারি তা দেখতে পাবো।
ব্যবহারকারী3000806

1
এটি এখন একটি টার্মিনালে কাজ করা উচিত, তবে এটি এখনও পুরানোটির উপরে আপডেট হওয়া রাষ্ট্রটি মুদ্রণ করবে না। লিনাক্সে, আপনি console.log("^[c"+d)পরিবর্তে কল করে এটি ঠিক করতে পারেন , যেখানে ^[ESC অক্ষর (এক বাইট)।
ডেনিস

1
আপনাকে প্রথমে পরিবর্তন করেন তাহলে .replaceথেকে [R='replace'], তারপর পরবর্তী প্রতিটি এক [R], এই নিচে বেশ একটু কাটা হবে। আপনি setTimeout(f,100,d)বর্তমান সেটআপের জায়গায় ব্যবহার করে কয়েকটি বাইট সংরক্ষণ করতে পারেন ।
ETH প্রোডাকশনস

2

সি #, 335 বাইট

ভাষার দুর্দান্ত পছন্দ নয়।

আমি 50 এবং 1000 এর মধ্যে দ্বি-সংখ্যা নির্বাচন করতে দেরি করার অপব্যবহার করেছি।

স্পষ্টতার জন্য নতুন লাইন এবং ইন্ডেন্টেশন যুক্ত হয়েছে:

namespace System.Threading{
    class P{
        static void Main(string[]z){
            var c=@"/|\,/|\,/|,//,|\,\\,/ ,__, \,__".Split(',');
            for(string a=z[0].PadRight(80),b="";a!=b;){
                Console.Clear();
                Console.Write(b=a);
                Thread.Sleep(99);
                a="";
                for(int i,j;(i=a.Length)<80;)
                    a+=(j=Array.FindIndex(c,d=>b.Substring(i).StartsWith(d)))%2==0
                        ?c[j+1]
                        :b.Substring(i,1);
            }
        }
    }
}

1

পিএইচপি, 175 বাইট

$i=sprintf("%-80s",$argv[1]);$p='preg_replace';do{echo($o=$i)."\r";$i=$p('(/\|\\\\(*SKIP)(?!)|(?|(/)\||\|(\\\\)))','$1$1',$p('(/ | \\\\)','__',$i));usleep(1e5);}while($i!=$o);

আন minified:

$input = sprintf("%-80s",$argv[1]);
do {
  echo $input."\r";
  $old = $input;
  $input = preg_replace('(/ | \\\\)','__',$input);
  $input = preg_replace('(/\|\\\\(*SKIP)(?!)|(?|(/)\||\|(\\\\)))','$1$1',$input);
  usleep(100000);
}
while( $input != $old);

মূলত রেজেক্স গল্ফ প্রথমে যে কোনও পড়ন্ত ডোমিনয়েস স্থান পেয়েছে তাকে ফ্ল্যাট করে (এবং বাম থেকে ডান মিলের ক্রমের কারণে "বায়ু" প্রবাহিত হবে)। তারপরে কুরুচিপূর্ণ অংশ আসে (আপনি স্ল্যাশ দেওয়ার জন্য অভিশাপ দিন!)

  • মিল /|\, তারপর এড়িয়ে যান।
  • ম্যাচ (/)|এবং সাথে প্রতিস্থাপন//
  • ম্যাচ |(\)এবং সাথে প্রতিস্থাপন\\

এতে ডমিনোস পড়ে যায়। শেষ অবধি, পরবর্তী পদক্ষেপের জন্য কেবল 100 মাইল অপেক্ষা করুন।

()রেজেক্সে ডিলিমিটার হিসাবে ব্যবহার করার অর্থ এসকে /পালানোর দরকার নেই যা ন্যূনতম সহায়তা করে!


আপনাকে 100 টির পরিবর্তে 50ms অপেক্ষা করার অনুমতি দেওয়া হয়েছে, 1 চর সংরক্ষণ করে;) পিএইচপি কি 10 ^ 5 এর অনুমতি দেয়?
ব্লুকাটি

1

পসিক্স শেল + সেড, 144

sed 's/^.\{1,79\}$/& /;s/.*/printf '"'&\\r'"';sleep .1/;h;:;s,/|\\,/:\\,g;s,\(/ \| \\\),__,g;s,/|,//,g;s,|\\,\\\\,g;H;t;x;y/:/|/;s/\\/\\\\/g'|sh

এটি দুটি অংশে। ডোমিনোসকে টপল করার মূল কাজ হ'ল স্ট্যান্ডার্ড sedপ্যাটার্ন রিপ্লেসমেন্ট, হোল্ড স্পেসে লাইন জমা করে। আমরা অস্থায়ীভাবে চালু /|\মধ্যে /:\রক্ষা, শেষে পুনরুদ্ধার।

s/^.\{0,79\}$/& /
h

:
s,/|\\,/:\\,g
s,\(/ \| \\\),__,g
s,/|,//,g
s,|\\,\\\\,g
H
t

x
y/:/|/

যেহেতু sedবিলম্ব সন্নিবেশ করার কোনও উপায় পাওয়া যায় নি (আমি টার্মিনফো / টার্মক্যাপে দেখেছি, তবে কোনও মানক উপায় খুঁজে পাইনি), তাই printf "...\r"; sleep .1 প্রতি 100 মিমিতে একটি লাইন মুদ্রণের জন্য আমি প্রতিটি লাইন মোড়ানো করি । কমান্ডের অক্ষরগুলি টপলিংয়ের কোনও বিকল্প দ্বারা স্পর্শ করা যাবে না বলে আমি আসলে এটি প্রথম করি do

সমস্ত পরিবেশে সেট সহ dashএবং GNU ব্যবহার করে পরীক্ষিত ।coreutilsPOSIXLY_CORRECT

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.