Turing-simulator
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ånd:<br />
Hver celle skal være separeret med mellemrum.<br />
<input type="text" name="tape" value="<?=$_POST['tape']?$_POST['tape']:'* 1 0 1 0 1 *';?>" />
<br />
<br />
Start bånd fra <select name="headstart"><option value="l">Venstre</option><option value="r" <?=$_POST['headstart']=="r"?'selected="selected"':''; ?>>Højre</option></select>
<br />
<br />
<br />
Kildekode:<br />
Først kommer tilstandens navn, hvilken data der forventes, hvilken data der skal skrives, hvilken retning der skal gåes i (<tt>L</tt>=venstre, <tt>R</tt>=højre, <tt>-</tt>=bliv) og hvilken tilstand der opnåes (bemærk de to specielle states, <tt>start</tt> og <tt>halt</tt>: <tt>start</tt> er startstate, <tt>halt</tt> afslutter). Data skal væ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ærk: Der laves max. 5000 gennemkørsler af hensyn til eventuelle uendelige lø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