//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");
echo "Startovaci slovo nebylo zadano korektne! Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic je: ".(($MaxX+2)*($MaxY+2))." (".($MaxX+2)."x".($MaxY+2).").
Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic 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");
echo "Chybi leva nebo prava cast ".$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");
echo "Prava strana pravidla ".$PravePr[$i]." nebyla zadana korektne!
";
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");
// echo "Prava strana pravidla ".$PravePr[$i]." nebyla zadana korektne! Poslednim znakem musi byt jeden ze znaku 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");
echo "Nebylo nalezeno pravidlo s koncovym 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");
echo "Nebylo nalezeno odpovidajici pravidlo! Turinguv stroj neskonci v koncovem 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");
echo "Nektere z pravidel se snazi zapsat za levy konec pasky!
";
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");
echo "Nebylo nalezeno odpovidajici pravidlo! Turinguv stroj neskonci v koncovem 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");
echo "Nebylo nalezeno odpovidajici pravidlo! Turinguv stroj neskonci v koncovem stavu!
";
exit;
endif;
endif;
endif;
$Incr++;
//Pocet kroku nez se algoritmus ukonci.
if ($Incr==100): Header ("Content-Type: text/html");
echo "Program po ".$Incr." krocich neskoncil v koncovem stavu!
";
exit;
endif;
endwhile;
//Dogenerovani zbyvajicich dlazdic pod dlazdicemi DlazdiceStr2.
$DlazdiceStr4=array();
for ($i1=0; $i1
";
echo "
";
echo "
";
echo "Souradnice prvni dlazdice: 0,0.
Souradnice posledni dlazdice: ".($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");
Header ("Cache-Control: no-cache");
Header ("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic je: "?>
|
Celkem bylo vytvoreno ruznych Wangovych dlazdic.
Wangovych dlazdic typu (a) je:
|
|
|
|
|
Navod:
V horni casti uvodni stranky je umisten hypertextovy odkaz, ktery zapina a vypina ceskou diakritiku. Pod nim je vstupni formular, ktery je rozdeleny na tri casti.
1. Startovaci slovo
Do policka Startovaci slovo je mozne vepsat startovaci
slovo (vstup Turingova stroje) nebo je mozne jej ponechat prazdne. Startovaci
slovo mohou tvorit pismena male a velke abecedy, cisla a mezera. Delka
startovacího slova je omezena na 100 znaku.
Priklad:
2. Pravidla Turingova stroje
Policka v oddilu Pravidla Turingova stroje jsou urcena pro zadavani
pravidel Turingova stroje. Turinguv stroj musi byt deterministicky a paska,
na niz zapisuje je jednosmerne nekonecna (smerem doprava). Pravidla jsou rozdelena
na levou a pravou cast (pred a za rovnitkem). Kazde z pravidel je mozne zadat
libovolne do kterekoliv dvojice policek. Leva cast pravidla je ve tvaru
Priklad:
Pod formularem pro zadavani pravidel je umistena ctverice tlacitek:
Poznamka: Na uvodni stranku s formularem se vzdy vratite stiskem tlacitka Zpet v prohlizeci.
3. Nacteni pravidel ze souboru
Pres oddil Nacteni pravidel ze souboru lze
automaticky ze zvoleneho souboru vlozit pravidla do formulare. Po stisku tlacitka
Prochazet...
(Browse... – nazev
zavisi na pouzitem prohlizeci) se objevi dialogove okno pro vyber souboru. Po vyberu
souboru se zobrazi jeho cesta v policku vedle tlacitka. Cestu k souboru lze take zadat
rucne, coz je ale velmi nepraktické. Stiskem tlacitka
Nacist soubor jsou
pak pravidla ze souboru importovana do formulare. Po nacteni pravidel ze souboru
se zmeni tlacitko
Vymaz formular na
Obnov formular.
Toto tlacitko vraci zpet vsechny zmeny vytvorene po nacteni pravidel ze souboru. Pro
vymazani importovanych pravidel (pokud je nechcete mazat rucne) staci stisknout
tlacitko Zpet v
prohlizeci.
Pravidla v souboru musi byt zadana ve tvaru
Priklad:
V pripade, ze soubor obsahuje vice nez 80 pravidel, je do formulare importovano pouze prvních 80 pravidel. Nactena pravidla je samozrejme mozne dale ve formulari libovolne modifikovat.
Vase pripadne dotazy nebo pripominky zasilejte na adresu: nov21ui@fpf.slu.cz.
endif; ?>