Brainf ** k Trình gỡ lỗi


13

Thử thách của bạn là lấy đầu vào như thế này (một chương trình Hello World):

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

Và xuất ra một dấu nhắc (sẽ là "> "):

>

Người dùng sau đó có thể nhập bất cứ điều gì tại dấu nhắc. Trình gỡ lỗi đơn giản của bạn phải có các lệnh sau:

  • S - bươc

    • Xuất vị trí hiện tại (xem L) sau khi bước.
    • S(a positive integer) - bước nhiều không gian
  • L - vị trí

    • Thuật ngữ "vị trí" luôn đề cập đến vị trí của bạn trong chương trình (nghĩa là con trỏ lệnh).
    • Định dạng như thế này:

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

      Điều này có nghĩa là vị trí hiện tại của chương trình là ở vị trí thứ ba +.

  • G(an integer) - đi đến

    • Điều này có nghĩa là tiếp tục bước cho đến khi bạn đến vị trí đó. Nếu bạn đến cuối chương trình và bạn chưa đến đó, chỉ cần thoát khỏi chương trình.
    • Một số nguyên âm có nghĩa là nhiều ký tự từ cuối. Vâng, điều này có nghĩa -0là khác với 0, và -1là nhân vật thứ hai cuối cùng.
    • Đừng xuất bất cứ thứ gì cho lệnh này.
  • D - đổ mảng

    • Định dạng như 1, 2, 3, 4, 5
    • Nếu mảng là 1, 2, 3, 0, 0, 0, 0, 0, ..., chỉ đầu ra 1, 2, 3.
    • D(a positive integer) (a positive integer) - kết xuất tất cả các mục mảng giữa hai vị trí đó (bao gồm)
  • (a positive integer) - xuất mục hiện tại vị trí mảng đó

  • P- xuất chỉ mục của con trỏ BF (thứ bạn thay đổi ><).

Khi chương trình yêu cầu đầu vào, hiển thị lời nhắc "I> ". (Bạn có thể nhập một ký tự một lần.)

Khi nó xuất ra một cái gì đó, hiển thị "O> " + (the output). Nhiều đầu ra giữa các lệnh phải được nối lại với nhau (nghĩa là bạn không thể làm được > G-0 O> H O> e O> l O> l O> o ..., nó phải như vậy > G-0 O> Hello, World!).

Xuất "Xong" và thoát khi bạn kết thúc chương trình.


Chạy mẫu:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
> 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

Chạy mẫu cho thấy bước qua các vòng và Phướng dẫn (tính toán 3*2+1)

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

Chạy mẫu hiển thị 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

Đây là , vì vậy mã ngắn nhất sẽ giành chiến thắng.

Câu trả lời:


3

PHP - 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='';}

Đầu ra cho các ô không bao giờ được viết hơi khác nhau:

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

>

Phiên bản lớn:

<?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='';
    }
}

Tôi đã sửa cái testcase thứ ba.
Doorknob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.