Débogueur Brainf ** k


13

Votre défi consiste à prendre des commentaires comme celui-ci (un programme Hello World):

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

Et affichez une invite (qui sera "> "):

>

L'utilisateur peut alors saisir quoi que ce soit à l'invite. Votre débogueur simple doit avoir ces commandes:

  • S - étape

    • Afficher l'emplacement actuel (voir L) après avoir effectué un pas.
    • S(a positive integer) - étape que de nombreux espaces
  • L - emplacement

    • Le terme «emplacement» fait toujours référence à l'endroit où vous vous trouvez dans le programme (c'est-à-dire le pointeur d'instruction).
    • Formaté comme ceci:

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

      Cela signifie que l'emplacement actuel du programme est au troisième +.

  • G(an integer) - aller à

    • Cela signifie continuer à marcher jusqu'à ce que vous arriviez à cet endroit. Si vous atteignez la fin du programme et que vous n'y êtes pas arrivé, quittez simplement le programme.
    • Un entier négatif signifie que beaucoup de caractères à partir de la fin. Oui, cela signifie que -0c'est différent de 0, et -1c'est l'avant-dernier caractère.
    • Ne rien afficher pour cette commande.
  • D - tableau de vidage

    • Formaté comme 1, 2, 3, 4, 5
    • Si le tableau l'est 1, 2, 3, 0, 0, 0, 0, 0, ..., uniquement en sortie 1, 2, 3.
    • D(a positive integer) (a positive integer) - vider tous les éléments du tableau entre ces deux positions (inclus)
  • (a positive integer) - afficher l'élément actuellement à cette position du tableau

  • P- afficher l'index du pointeur BF (la chose que vous changez avec >et <).

Lorsque le programme demande une entrée, affichez l'invite "I> ". (Vous pouvez saisir un caractère à la fois.)

Quand il sort quelque chose, montrez "O> " + (the output). Plusieurs sorties entre les commandes doivent être chaînées ensemble (c'est-à-dire que vous ne pouvez pas le faire > G-0 O> H O> e O> l O> l O> o ..., cela doit être > G-0 O> Hello, World!).

Sortie "Terminé" et quittez une fois que vous atteignez la fin du programme.


Exemple d'exécution:

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

Exemple de parcours montrant les étapes et les Pinstructions (calcule 3*2+1)

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

Exemple d'exécution montrant les E / S

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

C'est le , donc le code le plus court gagnera.

Réponses:


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

La sortie des cellules qui n'ont jamais été écrites est légèrement différente:

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

>

Grande version:

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

J'ai réparé le troisième testcase.
Poignée de porte
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.