//Nebylo-li zadano startovaci slovo, pak je nahrazeno znakem "_".
//Overuje podle regularniho vyrazu, zda bylo startovaci slovo zadano korektne.
function StartWord(&$StartS)
{
if ($StartS==""): $StartS="_";
else:
if (!EReg("^[0-9a-zA-Z ]+$",$StartS)): Header ("Content-Type: text/html; charset=windows-1250");
echo "Startovací slovo nebylo zadáno korektně! Počet dlaždic, tvořících Wangovo dláždění bez bílých dlaždic je: ".(($MaxX+2)*($MaxY+2))." (".($MaxX+2)."x".($MaxY+2).").
Počet dlaždic tvořících Wangovo dláždění bez bílých dlaždic je: "?>
if (EReg("^q[0-9]{1,2}.$",$i11)): $i11i=SubStr($i11,1,(StrLen($i11)-2));
$i11n=SubStr($i11,-1,1);
echo "q".$i11i."".$i11n;
else: echo $i11;
endif; ?> if (EReg("^q[0-9]{1,2}.$",$i12)): $i12i=SubStr($i12,1,(StrLen($i12)-2));
$i12n=SubStr($i12,-1,1);
echo "q".$i12i."".$i12n;
else: echo $i12;
endif; ?> if (EReg("^q[0-9]{1,2}.$",$i13)): $i13i=SubStr($i13,1,(StrLen($i13)-2));
$i13n=SubStr($i13,-1,1);
echo "q".$i13i."".$i13n;
else: echo $i13;
endif; ?> if (EReg("^q[0-9]{1,2}.$",$i14)): $i14i=SubStr($i14,1,(StrLen($i14)-2));
$i14n=SubStr($i14,-1,1);
echo "q".$i14i."".$i14n;
else: echo $i14;
endif; ?>
";
exit;
endif;
endif;
}
//Zajisti, aby zadane pravidlo bylo kompletni, tj. nechybela leva nebo prava strana.
function Match($L,$P)
{
if (($L=="" && $P<>"") || ($L<>"" && $P=="")): $n=0;
else:
if ($L=="" && $P==""): $n=1;
else: $n=2;
endif;
endif;
return $n;
}
//Vraci chybu v pripade nekorektne zadaneho pravidla viz funkce Match.
function Error($LevePr, $PravePr)
{
$Incr=0;
$Incr1=0;
for($i=0; $i
";
exit;
endif;
if ($Incr1>1): Header ("Content-Type: text/html; charset=windows-1250");
echo "Chybí levá nebo pravá část ".$Incr1." pravidel!
";
exit;
endif;
}
//Zjistuje, zda nektera pravidla nemaji shodne leve strany. TS by pak nebyl deterministicky.
function Deterministic($RLP)
{
for ($i=0; $i
" ;
exit;
endif;
endif;
endfor;
endfor;
}
//Upravuje zvlast levou a pravou stranu pravidel na tvar vhodny k reprezentaci dlazdic.
//Overuje podle regularniho vyrazu, zda byla korektne zadana leva i prava strana pravidla.
//Kontroluje zda je poslednim znakem prave casti pravidla znak L, R nebo S.
function Reduce($LevePr,$PravePr,&$RLevePr,&$RPravePr)
{
for($i=0; $i
";
exit;
endif;
$RLevePr[]=$x.$y;
endif;
if ($PravePr[$i]<>""):
list($a,$b,$c)=explode(",",$PravePr[$i]);
if (!EReg("^q[0-9]{1,2},[0-9a-zA-Z_]{1},[LRS]{1}$",$PravePr[$i])): Header ("Content-Type: text/html; charset=windows-1250");
echo "Pravá strana pravidla ".$PravePr[$i]." nebyla zadána korektně!
";
exit;
endif;
switch ($c)
{
case "R": $RPravePr[]=" ,".$a.$c.",".$b;
break;
case "L": $RPravePr[]=$a.$c.", ,".$b;
break;
case "S": $RPravePr[]=" , ,".$a.$b;
break;
// default: Header ("Content-Type: text/html; charset=windows-1250");
// echo "Pravá strana pravidla ".$PravePr[$i]." nebyla zadána korektně! Posledním znakem musí být jeden ze znaků R, L nebo S.
";
// exit;
}
endif;
endfor;
}
//Pokud nebylo nalezeno prvni pravidlo, vrati hodnotu -1, jinak vrati hodnotu odpovidajici indexu prvniho pravidla.
function FirstRule($LPrav,$PrvniZ)
{
$x=-1;
for($i=0; $i
";
exit;
endif;
}
//Pokud nebylo nalezeno posledni pravidlo, ulozi se do pole KPrav hodnota -1, jinak se do pole ukladaji
//indexy pravidel s pravou stranou obsahujici koncovy stav q99.
function LastRule($PPrav,&$KPrav)
{
$Incr=0;
for($i=0; $i
";
exit;
endif;
$KoncPrav=array();
LastRule($RPravePr,$KoncPrav);
if ($KoncPrav[0]==-1): Header ("Content-Type: text/html; charset=windows-1250");
echo "Nebylo nalezeno pravidlo s koncovým stavem q99!
";
exit;
endif;
LRestriction($RPravePr,$RLevePr,$PrvniZn);
$Rules=array(); $DlazdiceStr2=array();
Rules($RLevePr,$RPravePr,$FirstRuleIndex,$Rules,$DlazdiceStr2);
$Incr=0;
$Konec=0;
$DlazdiceStr3=array();
$MaxX=0;
$MaxY=1;
while ($Konec==0):
list($x1,$x2,$x3,$x4,$x5,$x6)=explode(",",$DlazdiceStr2[$Incr]);
//Hlava se pohybuje smerem doprava.
if (SubStr($x3,-1,1)=="R"):
//Hledam dlazdici o souradnicich x5-1,x6+1 v DlazdiceStr2.
$DlazdicePom="";
$Incr1=0;
while ($DlazdicePom=="" && $Incr1<(Count($DlazdiceStr2))):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdiceStr2[$Incr1]);
if ($g5==($x5-1) && $g6==($x6+1)): $DlazdicePom=$DlazdiceStr2[$Incr1];
endif;
$Incr1++;
endwhile;
//Hledam dlazdici o souradnicich x5-1,x6+1 v DlazdicePom0.
if ($DlazdicePom==""):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdicePom0);
if ($g5==($x5-1) && $g6==($x6+1)): $DlazdicePom=$DlazdicePom0;
endif;
endif;
//Dlazdice o souradnicich x5-1,x6+1 nebyla nalezena, tak hledam dlazdice o souradnicich x5-z,x6+1.
if ($DlazdicePom==""):
$DlazdicePom1="";
$z=2;
while ($DlazdicePom1=="" && $z<=$x5):
$Incr3=0;
while ($DlazdicePom1=="" && $Incr3<(Count($DlazdiceStr0))):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdiceStr0[$Incr3]);
if ($g5==($x5-$z) && $g6==($x6+1)): $DlazdicePom1=$DlazdiceStr0[$Incr3];
endif;
$Incr3++;
endwhile;
$Incr4=0;
while ($DlazdicePom1=="" && $Incr4<(Count($DlazdiceStr2))):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdiceStr2[$Incr4]);
if ($g5==($x5-$z) && $g6==($x6+1)): $DlazdicePom1=$DlazdiceStr2[$Incr4];
endif;
$Incr4++;
endwhile;
$z++;
endwhile;
//Dlazdice o souradnicich x5-z,x6+1 nebyly nalezeny, tak je treba vytvorit dlazdici: ,~,~,_,0,x6+1.
if ($DlazdicePom1==""): $DlazdicePom1=" ,~,~,_,0,".($x6+1);
$DlazdiceStr0[]=$DlazdicePom1;
endif;
//Dogenerovani dlazdic o souradnicich x5-z,x6+1
list($y1,$y2,$y3,$y4,$y5,$y6)=explode(",",$DlazdicePom1);
for ($sour=($y5+1); $sour<$x5; $sour++):
$DlazdiceStr11[]=$y4.", , ,".$y4.",".$sour.",".$y6;
endfor;
$DlazdicePom=$y4.", , ,".$y4.",".($x5-1).",".$y6;
endif;
//Dlazdice o souradnicich x5-1,x6+1 byla nalezena, tak se vytvori dlazdice o souradnicich x5,z6.
list($z1,$z2,$z3,$z4,$z5,$z6)=explode(",",$DlazdicePom);
$r=(EReg_Replace("R",$z4,$x3));
$DlazdiceStr3[]=$z4.",".$x3.", ,".$r.",".$x5.",".$z6;
//Do promenne MaxY se ulozi nejvetsi hodnota ze z6.
if ($z6>$MaxY): $MaxY=$z6;
endif;
//Test, jestli dlazdice o souradnicich x5,z6 obsahuje koncovy stav q99.
if ((SubStr($x3,0,3))=="q99"): $Konec=1;
//Do promenne MaxX se ulozi hodnota z x5 a do promennych PosledniPom2 a PosledniPom3 se ulozi posledni dve dlazdice.
$MaxX=$x5;
$PosledniPom2=$DlazdiceStr2[$Incr];
$PosledniPom3=$z4.",".$x3.", ,".$r.",".$x5.",".$z6;
//Neobsahuje-li dlazdice o souradnicich x5,z6 koncovy stav q99, pak hledam odpovidajici pravidlo v Rules.
else: $Incr5=0; $Nalezeno=0;
while ($Nalezeno==0 && $Incr5<(Count($Rules))):
$w1=""; $w2=""; $w3=""; $w4="";
list($w1,$w2,$w3,$w4)=explode(",",$Rules[$Incr5]);
if ($r==$w1): $DlazdiceStr2[]=$w1.",".$w2.",".$w3.",".$w4.",".($x5+1).",".$z6;
$Nalezeno=1;
endif;
$Incr5++;
endwhile;
if ($Nalezeno==0): Header ("Content-Type: text/html; charset=windows-1250");
echo "Nebylo nalezeno odpovídající pravidlo! Turingův stroj neskončí v koncovém stavu!
";
exit;
endif;
endif;
endif;
//Hlava se pohybuje smerem doleva.
if (SubStr($x2,-1,1)=="L"):
//Kontrola, zda se hlava TS nepokousi posunout za levy konec pasky.
if (($x6-1)<1): Header ("Content-Type: text/html; charset=windows-1250");
echo "Některé z pravidel se snaží zapsat za levý konec pásky!
";
exit;
endif;
//Hledam dlazdici o souradnicich x5-1,x6-1 v DlazdiceStr2.
$DlazdicePom2="";
$Incr6=0;
while ($DlazdicePom2=="" && $Incr6<(Count($DlazdiceStr2))):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdiceStr2[$Incr6]);
if ($g5==($x5-1) && $g6==($x6-1)): $DlazdicePom2=$DlazdiceStr2[$Incr6];
endif;
$Incr6++;
endwhile;
//Dlazdice o souradnicich x5-1,x6-1 nebyla nalezena, tak hledam dlazdice o souradnicich x5-k,x6-1.
if ($DlazdicePom2==""):
$DlazdicePom3="";
$k=2;
while ($DlazdicePom3=="" && $k<$x5):
$Incr8=0;
while ($DlazdicePom3=="" && $Incr8<(Count($DlazdiceStr2))):
$g1=""; $g2=""; $g3=""; $g4=""; $g5=""; $g6="";
list($g1,$g2,$g3,$g4,$g5,$g6)=explode(",",$DlazdiceStr2[$Incr8]);
if ($g5==($x5-$k) && $g6==($x6-1)): $DlazdicePom3=$DlazdiceStr2[$Incr8];
endif;
$Incr8++;
endwhile;
$k++;
endwhile;
//Dogenerovani dlazdic o souradnicich x5-k,x6-1
list($b1,$b2,$b3,$b4,$b5,$b6)=explode(",",$DlazdicePom3);
for ($sour1=($b5+1); $sour1<$x5; $sour1++):
$DlazdiceStr12[]=$b4.", , ,".$b4.",".$sour1.",".$b6;
endfor;
$DlazdicePom2=$b4.", , ,".$b4.",".($x5-1).",".$b6;
endif;
//Dlazdice o souradnicich x5-1,x6-1 byla nalezena, tak se vytvori dlazdice o souradnicich x5,c6.
list($c1,$c2,$c3,$c4,$c5,$c6)=explode(",",$DlazdicePom2);
$r1=(EReg_Replace("L",$c4,$x2));
$DlazdiceStr3[]=$c4.", ,".$x2.",".$r1.",".$x5.",".$c6;
//Test, jestli dlazdice o souradnicich x5,c6 obsahuje koncovy stav q99.
if ((SubStr($x2,0,3))=="q99"): $Konec=1;
//Do promenne MaxX se ulozi hodnota z x5 a do promennych PosledniPom2 a PosledniPom3 se ulozi posledni dve dlazdice.
$MaxX=$x5;
$PosledniPom2=$DlazdiceStr2[$Incr];
$PosledniPom3=$c4.", ,".$x2.",".$r1.",".$x5.",".$c6;
//Neobsahuje-li dlazdice o souradnicich x5,c6 koncovy stav q99, pak hledam odpovidajici pravidlo v Rules.
else: $Incr10=0; $Nalezeno1=0;
while ($Nalezeno1==0 && $Incr10<(Count($Rules))):
$v1=""; $v2=""; $v3=""; $v4="";
list($v1,$v2,$v3,$v4)=explode(",",$Rules[$Incr10]);
if ($r1==$v1): $DlazdiceStr2[]=$v1.",".$v2.",".$v3.",".$v4.",".($x5+1).",".$c6;
$Nalezeno1=1;
endif;
$Incr10++;
endwhile;
if ($Nalezeno1==0): Header ("Content-Type: text/html; charset=windows-1250");
echo "Nebylo nalezeno odpovídající pravidlo! Turingův stroj neskončí v koncovém stavu!
";
exit;
endif;
endif;
endif;
//Hlava stoji na miste.
if ((StrStr($DlazdiceStr2[$Incr],", , ,")<>"") && (SubStr($DlazdiceStr2[$Incr],0,1)=="q")): list($o1,$o2,$o3,$o4,$o5,$o6)=explode(",",$DlazdiceStr2[$Incr]);
//Test, jestli dlazdice o souradnicich o5,o6 obsahuje koncovy stav q99.
if (SubStr($o4,0,3)=="q99" && StrLen($o4)==4): $Konec=1;
//Do promenne MaxX se ulozi hodnota z o5 a do promenne PosledniPom2 se ulozi posledni dlazdice.
$MaxX=$o5;
$PosledniPom2=$DlazdiceStr2[$Incr];
//Neobsahuje-li dlazdice o souradnicich o5,o6 koncovy stav q99, pak hledam odpovidajici pravidlo v Rules.
else: $Incr11=0; $Nalezeno2=0;
while ($Nalezeno2==0 && $Incr11<(Count($Rules))):
$u1=""; $u2=""; $u3=""; $u4="";
list($u1,$u2,$u3,$u4)=explode(",",$Rules[$Incr11]);
if ($o4==$u1): $DlazdiceStr2[]=$u1.",".$u2.",".$u3.",".$u4.",".($o5+1).",".$o6;
$Nalezeno2=1;
endif;
$Incr11++;
endwhile;
if ($Nalezeno2==0): Header ("Content-Type: text/html; charset=windows-1250");
echo "Nebylo nalezeno odpovídající pravidlo! Turingův stroj neskončí v koncovém stavu!
";
exit;
endif;
endif;
endif;
$Incr++;
//Pocet kroku nez se algoritmus ukonci.
if ($Incr==100): Header ("Content-Type: text/html; charset=windows-1250");
echo "Program po ".$Incr." krocích neskončil v koncovém stavu!
";
exit;
endif;
endwhile;
//Dogenerovani zbyvajicich dlazdic pod dlazdicemi DlazdiceStr2.
$DlazdiceStr4=array();
for ($i1=0; $i1
";
echo "
";
echo "
";
echo "Souřadnice první dlaždice: 0,0.
Souřadnice poslední dlaždice: ".($MaxX+1).",".($MaxY+1).".
";
echo "
";
*/
//Vsechny pole DlazdiceStr(1,11,12,2,3,4,5) jsou sjednoceny do dvojrozmerneho pole DlazdiceStr2D.
$DlazdiceStr2D=array(array());
for ($i=0; $i
";
endfor;
endfor;
*/
if ((($MaxX+2)*($MaxY+2))<101):
Header ("Content-Type: text/html; charset=windows-1250");
Header ("Cache-Control: no-cache");
Header ("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
Počet dlaždic tvořících Wangovo dláždění bez bílých dlaždic je: "?>
|
Celkem bylo vytvořeno různých Wangových dlaždic.
Wangových dlaždic typu (a) je:
|
|
|
|
|
Návod:
V horní části úvodní stránky je umístěn hypertextový odkaz, který vypíná a zapíná českou diakritiku. Pod ním je vstupní formulář, který je rozdělený na tři části.
1. Startovací slovo
Do políčka Startovací slovo je možné vepsat startovací
slovo (vstup Turingova stroje) nebo je možné jej ponechat prázdné. Startovací
slovo mohou tvořit písmena malé a velké abecedy, čísla a mezera. Délka
startovacího slova je omezena na 100 znaků.
Příklad:
2. Pravidla Turingova stroje
Políčka v oddílu Pravidla Turingova stroje jsou určena pro zadávání
pravidel Turingova stroje. Turingův stroj musí být deterministický a páska,
na níž zapisuje je jednosměrně nekonečná (směrem doprava). Pravidla jsou rozdělena
na levou a pravou část (před a za rovnítkem). Každé z pravidel je možné zadat
libovolně do kterékoliv dvojice políček. Levá část pravidla je ve tvaru
Příklad:
Pod formulářem pro zadávání pravidel je umístěna čtveřice tlačítek:
Poznámka: Na úvodní stránku s formulářem se vždy vrátíte stiskem tlačítka Zpět v prohlížeči.
3. Načtení pravidel ze souboru
Přes oddíl Načtení pravidel ze souboru lze
automaticky ze zvoleného souboru vložit pravidla do formuláře. Po stisku tlačítka
Procházet...
(Browse... – název
závisí na použitém prohlížeči) se objeví dialogové okno pro výběr souboru. Po výběru
souboru se zobrazí jeho cesta v políčku vedle tlačítka. Cestu k souboru lze také zadat
ručně, což je ale velmi nepraktické. Stiskem tlačítka
Načíst soubor jsou
pak pravidla ze souboru importována do formuláře. Po načtení pravidel ze souboru
se změní tlačítko
Vymaž formulář na
Obnov formulář.
Toto tlačítko vrací zpět všechny změny vytvořené po načtení pravidel ze souboru. Pro
vymazání importovaných pravidel (pokud je nechcete mazat ručně) stačí stisknout
tlačítko Zpět v
prohlížeči.
Pravidla v souboru musí být zadána ve tvaru
Příklad:
V případě, že soubor obsahuje více než 80 pravidel, je do formuláře importováno pouze prvních 80 pravidel. Načtená pravidla je samozřejmě možné dále ve formuláři libovolně modifikovat.
Vaše případné dotazy nebo připomínky zasílejte na adresu: nov21ui@fpf.slu.cz.
endif; ?>