ব্রেইনফ ** কে ডিবাগার


13

আপনার চ্যালেঞ্জটি হ'ল এইভাবে ইনপুট নেওয়া (একটি হ্যালো ওয়ার্ল্ড প্রোগ্রাম):

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

এবং একটি প্রম্পট আউটপুট (যা হবে "> "):

>

তারপরে ব্যবহারকারী প্রম্পটে কোনও কিছু প্রবেশ করতে পারবেন। আপনার সাধারণ ডিবাগারের অবশ্যই এই আদেশগুলি থাকতে হবে:

  • S - পদক্ষেপ

    • Lপদক্ষেপের পরে বর্তমান অবস্থানটি (দেখুন ) আউটপুট করুন ।
    • S(a positive integer) - অনেক জায়গা যে পদক্ষেপ
  • L - অবস্থান

    • "অবস্থান" শব্দটি সর্বদা আপনি প্রোগ্রামে কোথায় আছেন তা বোঝায় (অর্থাত্ নির্দেশ নির্দেশক)।
    • এর মতো ফর্ম্যাট করা:

        v
      +++++++[>+++++++<-]>.
      

      এর অর্থ এই যে প্রোগ্রামটির বর্তমান অবস্থানটি তৃতীয় স্থানে রয়েছে +

  • G(an integer) - যাও

    • এর অর্থ আপনি সেই স্থানে না পৌঁছা পর্যন্ত পদক্ষেপ রাখুন। আপনি যদি প্রোগ্রামটির শেষে পৌঁছে যান এবং আপনি সেখানে না পেয়ে থাকেন তবে কেবল প্রোগ্রামটি থেকে প্রস্থান করুন।
    • Negativeণাত্মক পূর্ণসংখ্যার অর্থ শেষ থেকে অনেকগুলি অক্ষর। হ্যাঁ, এর অর্থ এটি -0পৃথক 0এবং -1শেষ চরিত্রের থেকে দ্বিতীয়।
    • এই আদেশের জন্য কিছু আউটপুট করবেন না।
  • D - অ্যারে ডাম্প

    • ফর্ম্যাট করা মত 1, 2, 3, 4, 5
    • যদি অ্যারে হয় তবে 1, 2, 3, 0, 0, 0, 0, 0, ...কেবল আউটপুট 1, 2, 3
    • D(a positive integer) (a positive integer) - এই দুটি পজিশনের মধ্যে সমস্ত অ্যারে আইটেম ফেলে দিন (অন্তর্ভুক্ত)
  • (a positive integer) - বর্তমানে অ্যারে অবস্থিত আইটেম আউটপুট

  • P- আউটপুট বি এফ পয়েন্টার ইনডেক্স (জিনিস আপনি পরিবর্তন >এবং <)।

প্রোগ্রামটি যখন ইনপুটটির অনুরোধ করে, তখন প্রম্পটটি দেখান "I> "। (আপনি একবারে একটি অক্ষর ইনপুট করতে পারেন))

যখন এটি কিছু আউটপুট করে, দেখান "O> " + (the output)। কমান্ডগুলির মধ্যে একাধিক আউটপুটগুলি অবশ্যই এক সাথে জড়িত থাকে (যেমন আপনি এটি করতে পারবেন না > G-0 O> H O> e O> l O> l O> o ..., এটি হতে হবে > G-0 O> Hello, World!)।

"সম্পন্ন" আউটপুট এবং প্রোগ্রামের শেষে পৌঁছে একবার প্রস্থান করুন।


নমুনা রান:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
> S
1
> S
2
> S2
4
> S0
4
> L
    v
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
> D
4
> 0
4
> D10 15
0, 0, 0, 0, 0, 0
> G-0
O> Hello, World!
Done

নমুনা রান লুপ এবং Pনির্দেশের মাধ্যমে পদক্ষেপ দেখায় (গণনা করে 3*2+1)

+++[>++<-]>+
> S3
3
> L
   v
+++[>++<-]>+
> S3
6
> L
      v
+++[>++<-]>+
> P
1
> S3
9
> L
         v
+++[>++<-]>+
> S
3
> L
   v
+++[>++<-]>+
> D
2, 2
>

নমুনা রান I / O দেখায়

>+[>,---------------------------------]<[<]>[>.]
> G37
I> H
I> e
I> l
I> l
I> o
I> !
> D
0, 39, 68, 75, 75, 78
> G-0
O> 'DKKN
Done

এটি , তাই সংক্ষিপ্ততম কোডটি জিতবে।

উত্তর:


3

পিএইচপি - 1008

<?php
$_=trim(fread(STDIN,1e5));$z=$p=0;$t=$l=[];$q='';function s(){global$p,$t,$l,$_,$q,$z;switch($_[$z++]){case'>':$p++;break;case'<':$p--;break;case'+':@$t[$p]++;break;case'-':@$t[$p]--;break;case'.':$q.=chr($t[$p]);break;case',':echo"I>";$t[$p]=ord(trim(fread(STDIN,2)));break;case'[':$l[]=$z;if(!isset($t[$p])||$t[$p]==0){$c=1;while($c>0){$b=$_[$z++];if($b=='[')$c++;elseif($b==']')$c--;}array_pop($l);}break;case']':$z=array_pop($l)-1;break;}if($z==strlen($_)){if($q)echo'O>'.$q."\n";die("Done\n");}}for(;;){echo">";$c=trim(fread(STDIN,1e5));$g=strlen($c);switch($c[0]){case'L':echo str_repeat(' ',$z)."v\n".$_."\n";break;case'D':if($g)$x=$t;else{list($a,$b)=explode(' ',substr($c,1));$x=array_slice($t,$a-1,$b);}echo implode(', ',$x)."\n";break;case'S':if($g)s();for($i=0;$i<substr($c,1);$i++)s();echo $z."\n";break;case'G':if($c[1]=='-')$x=strlen($_)-substr($c,2);else$x=substr($c,1);while($z!=$x)s();break;case'P':echo$p."\n";default:if(is_numeric($c))echo$t[$c]."\n";}if($q)echo'O>'.$q."\n";$q='';}

যে কক্ষগুলি কখনই লেখা হয় নি সেগুলির আউটপুট কিছুটা পৃথক:

[timwolla@/data/workspace/php/PCG]php pcg-22585.php
+
>D15 20

>

বড় সংস্করণ:

<?php
$_=trim(fread(STDIN,1024));
$z=$p=0;
$t=$l=[];
$q='';

function step() {
    global $p, $t,$l,$_,$q,$z;
    switch ($_[$z++]){
        case '>': 
            $p++; 
        break;
        case '<': 
            $p--; 
        break;
        case '+': 
            @$t[$p]++; 
        break;
        case '-': 
            @$t[$p]--; 
        break;
        case '.': 
            $q.=chr($t[$p]); 
        break;
        case ',': 
            echo "I>";
            $t[$p] = ord(trim(fread(STDIN, 2)));
        break;
        case '[': 
            $l[] = $z;
            if (!isset($t[$p]) || $t[$p] == 0) { 
                $counter = 1; 
                while ($counter > 0) { 
                    $char = $_[$z++]; 
                    if ($char == '[') $counter++;
                    else if ($char == ']') $counter--;
                }
                array_pop($l);
            }
        break;
        case ']': 
            $z = array_pop($l)-1;
        break;
    }
    if($z==strlen($_)) {
        if ($q) echo 'O>'.$q."\n";
        die("Done\n");
    }
}

for(;;){
    echo ">";
    $c=trim(fread(STDIN,100));
    switch ($c[0]) {
        case 'L':
            echo str_repeat(' ', $z)."v\n".$_."\n";
        break;
        case 'D':
            if(strlen($c) == 1)$x=$t;
            else {
                list($a,$b)=explode(' ',substr($c,1));
                $x=array_slice($t,$a-1,$b);
            }
            echo implode(', ', $x)."\n";
        break;
        case 'S':
            if(strlen($c)==1)step();
            for($i=0;$i<substr($c,1);$i++)step();
            echo $z."\n";
        break;
        case 'G':
            if($c[1]=='-')$x=strlen($_)-substr($c,2);
            else $x=substr($c,1);
            while ($z!=$x)step();
        break;
        case 'P':
            echo $p."\n";
        default:
            if(is_numeric($c)) echo $t[$c]."\n";
    }
    if ($q) {
        echo 'O>'.$q."\n";
        $q='';
    }
}

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