Turing-simulator

Af Morten Skyt

Vis kildekode
Download kildekode
Licenseret kildekode: Nej, brug den som du lyster.

index.php

<?php

?>
<h1>Turing-simulator</h1>
<h2>Af <a href="../">Morten Skyt</a></h2>
<a href="index.php?source">Vis kildekode</a><br />
<a href="src.zip">Download kildekode</a><br />
Licenseret kildekode: Nej, brug den som du lyster.
<br /><br />
<?php
if (isset($_GET['source'])) {
  
?>
  <h3>index.php</h3>
    <?=highlight_file("index.php");?>
    <h3>turingsim.php</h3>
    <?=highlight_file("turingsim.php");?>
    <?php
    
die();
}
?>

<form method="post" action="?#resultat">
B&aring;nd:<br />
Hver celle skal v&aelig;re separeret med mellemrum.<br />
<input type="text" name="tape" value="<?=$_POST['tape']?$_POST['tape']:'* 1 0 1 0 1 *';?>" />
<br />
<br />
Start b&aring;nd fra <select name="headstart"><option value="l">Venstre</option><option value="r" <?=$_POST['headstart']=="r"?'selected="selected"':''?>>H&oslash;jre</option></select>
<br />
<br />
<br />
Kildekode:<br />
F&oslash;rst kommer tilstandens navn, hvilken data der forventes, hvilken data der skal skrives, hvilken retning der skal g&aring;es i (<tt>L</tt>=venstre, <tt>R</tt>=h&oslash;jre, <tt>-</tt>=bliv) og hvilken tilstand der opn&aring;es (bem&aelig;rk de to specielle states, <tt>start</tt> og <tt>halt</tt>: <tt>start</tt> er startstate, <tt>halt</tt> afslutter). Data skal v&aelig;re mellemrumssepareret.<br />
<textarea name="src" cols="100" rows="30"><?php
if ($_POST['src']) echo $_POST['src'];
else {
?>start * * R cmd_blah
cmd_blah 1 0 - halt<?php
}?></textarea>
<br />
<br />
<input type="submit" />
</form>
<br />
<br />
<hr />
<a name="resultat" />Resultat:<br />
Bem&aelig;rk: Der laves max. 5000 gennemk&oslash;rsler af hensyn til eventuelle uendelige l&oslash;kker!<br />
<br />
<pre><?php include 'turingsim.php'?></pre>
1

turingsim.php

<?php
// Turing-maskine simulator
// Version 0.1.1 beta, 11/11-2006
// - Semantiske rettelser 
// 
// Version 0.1 beta, 27/10-2006
// - Første version
// 
// Lavet af Morten Skyt, m@mortenskyt.com
// 
// Kildekoden er ikke licenseret - brug den som du lyster.

if(!(($srcOrig=$_POST['src']) && ($tapeOrig=$_POST['tape']))) {
    die(
"Mangler data");
}


// læg kilden i et multidimensionelt array
$srcLines explode("\n",$srcOrig);
foreach(
$srcLines as $srcLine) {
    list(
$func,$cond,$act,$dir,$goto) = explode(" ",$srcLine);
    
$src[] = array("func" => strtolower(trim($func)),
                   
"cond" => strtolower(trim($cond)),
                   
"act" => strtolower(trim($act)),
                   
"dir" => strtolower(trim($dir)),
                   
"goto" => strtolower(trim($goto)));
}

// læg båndet i et multidimensionelt array
$tape explode(" ",trim($tapeOrig));

// ryd op
unset($func,$cond,$act,$dir,$goto);




// startdata
$func "start";
$head $_POST['headstart']=="r"?count($tape)-1:0// sæt læse/skrive-hoved til slutningen af båndet


// okay, kør programmet!
for($i=0$func != "halt" && $i<5000$i++) {
    
// er der data i denne celle?
    
if (!isset($tape[$head]))
      
$tape[$head] = "*"// så må cellen indeholde en stjerne
    
    // hvilken data er i denne celle?
    
$curCell $tape[$head];
    
    
// løb gennem kommandoer og lav array over kommandoer der kan bruges her
    
unset($curFuncs$curFunc);
    foreach(
$src as $line) {
      if (
$line["func"] == $func)
        
$curFuncs[] = $line;
    }
    
    echo 
"Hovedposition: ".$head.", vaerdi: ".$tape[$head].", kommando: $func\n";
    echo 
"Hoved: ";
    foreach(
$tape as $tapecell) {
        echo 
$tapecell " ";    
    }
    echo 
"\n\n";
    
    
// find korrekt kommando
    
foreach($curFuncs as $curFuncTmp) {
        if (
$curFuncTmp["cond"] == $tape[$head]) {
          
$curFunc $curFuncTmp;
          break;
        }
    }
    
    
// kør kommando
    
if (!$curFunc)
      die(
"Advarsel: Der var ingen traek for dette input.\n\n");
    
    
// skriv på båndet
    
$tape[$head] = ($curFunc["act"]);
    
    
// flyt hovedet
    
if ($curFunc["dir"] == "r")
      
$head++;
    elseif (
$curFunc["dir"] == "l")
      
$head--;
    elseif (
$curFunc["dir"] != "-")
      die(
"Kritisk fejl: Ugyldig retning baandhovedet skal gaa i.\n\n");
    
    
// sæt funktion til næste funktion
    
$func $curFunc["goto"];
    
}

// endelig hovedposition
echo "Hovedposition: ".$head.", vaerdi: ".$tape[$head].", kommando: $func\n";
echo 
"Hoved: ";
foreach(
$tape as $tapecell) {
    echo 
$tapecell " ";    
}
echo 
"\n\n";

?>
1