updated@20:40msk 20nov209
source:code.txt
<form action="t.php" method="POST">
<p><textarea rows="10" cols="45" name="text"><? echo @$_POST['text'];?></textarea></p>
<p><input type="text" name="word" value="<? echo @$_POST['word'];?>"></p>
<p><input type="submit" value="Отправить"></p>
</form>
<?
//header("Content-type: text/plain");
if ($_SERVER['QUERY_STRING']=='about'){
echo "
Это <s>запорожец</s> машина Тьюринга. <br>
Пример и формат записи входа.
<pre>
q1|q2 0r|q2 1r
q2|q0 1L|q1 0r </pre>
<br> Входное слово: 111101
<br>
Contact: ...
"; die ();
}
function check($v){
if (!in_array($v['mov0'],array('L','R','S'))) return 'L,R or S in mov0 please';
if (!in_array($v['mov1'],array('L','R','S'))) return 'L,R or S in mov1 please';
if (!in_array($v['ret0'],array('0','1'))) return '0 or 1 in ret0 please';
if (!in_array($v['ret1'],array('0','1'))) return '0 or 1 in ret1 please';
if (strlen($v['id'])<1) return 'commandnameID empty';
if (strlen($v['go0'])<1) return 'commandnameGo0 empty';
if (strlen($v['go1'])<1) return 'commandnameGo1 empty';
return true;
}
function cv($v){
for ($i=0; $i<strlen($v);$i++) if (($v{$i}!=='0')AND($v{$i}!=='1')) return false;
return true;
}
function out($w,$ptr,$c){
ksort($w);
foreach ($w as $k=>$v) if ($k==$ptr) echo "<sub>$c</sub><u>$v</u>"; else echo $v;
echo "\n";
return 1;
}
if (!$_POST) die();
$first='';
$word=$_POST['word'];
if (!cv($word)) die ('bad word');
$list= $_POST['text'];
$list=str_replace("\r",'',$list);
$list = explode("\n", $list);
$cmd=array();
foreach ($list as $k){
if (trim($k)=='') continue;
$v=array();
$s=$k;
While(strpos($s,' ')!==false) $s=str_replace(' ',' ',$s);
//id
$p=strpos($s,'|');
$v['id']=substr($s,0,$p);
$s=substr($s,$p+1);
//go0
$p=strpos($s,' ');
$v['go0']=substr($s,0,$p);
$s=substr($s,$p+1);
//do0
$p=strpos($s,'|');
$v['do0']=substr($s,0,$p);
$s=substr($s,$p+1);
//go1
$p=strpos($s,' ');
$v['go1']=substr($s,0,$p);
$s=substr($s,$p+1);
//do1
//$p=strpos($s,'|');
$v['do1']=$s;
//$s=substr($s,$p+1);
/*preg_match("!(.*?)|(.*?)/s(.*?)|(.*?)/s(.*?)!",$k,$ok);
var_dump($ok);
list($v['all'],$v['id'],$v['go0'],$v['do0'],$v['go1'],$v['do1']) = $ok;
*/
$v['ret0']=strtoupper($v['do0']{0});
$v['mov0']=strtoupper($v['do0']{1});
$v['ret1']=strtoupper($v['do1']{0});
$v['mov1']=strtoupper($v['do1']{1});
if ($first=='') $first=$v['id'];
unset($v['do0'],$v['do1']);
ksort($v);
$r=check($v);
if ($r!==true) die ($r);
//var_dump($v);
$cmd[$v['id']]=$v;
}
echo '<pre>';
echo "T\t|\t 0\t\t|\t 1\t\t\n<hr>";
foreach ($cmd as $v) echo "{$v['id']}\t|{$v['go0']}\t {$v['ret0']}\t{$v['mov0']}\t|{$v['go1']}\t {$v['ret1']}\t{$v['mov1']}\t\n";
echo "-------------------\n";
$w=array();
for ($i=0; $i<strlen($word);$i++) $w[$i]=$word{$i};
$ptr=0;
$loop=0;
$c=$first;
while ($loop<100){
out($w,$ptr,$c);
if (!isset($cmd[$c])) { echo 'nocmd>ostanoff'; break; }
$newval=$cmd[$c]['ret'.$w[$ptr]];
$newptr=$cmd[$c]['mov'.$w[$ptr]];
$c=$cmd[$c]['go'.$w[$ptr]];
$w[$ptr]=$newval;
if ($newptr=="S") {echo 'ostanoff'; break;}
if ($newptr=="L") $ptr--;
if ($newptr=="R") $ptr++;
if (!isset($w[$ptr])) $w[$ptr]='0';
$loop++;
}
if ($loop>99) echo "/n Terminated; more than 100 loops/movs";
echo '</pre>';
?>
1