"; 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." pravidla!
"; 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""): if ($RLP[$i]==$RLP[$y]): Header ("Content-Type: text/html; charset=windows-1250"); echo "Levá strana pravidla ".$RLP[$i]." se nesmí opakovat! Turingův stroj pak není detrministický.
" ; 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""): list($x,$y)=explode(",",$LevePr[$i]); if (!EReg("^q[0-9]{1,2},[0-9a-zA-Z_]{1}$",$LevePr[$i])): Header ("Content-Type: text/html; charset=windows-1250"); echo "Levá strana pravidla ".$LevePr[$i]." nebyla zadána korektně!
"; 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; $iq0,".$PZ." je možné použít symboly R nebo S a nikoli L!
"; 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"" && (SubStr($PPrav[$i],-3,3)<>"q99") ): $KPrav[]=$i; $Incr++; endif; endfor; if ($Incr==0): $KPrav[]=-1; endif; } //Vytvori z jiz upravenych levych a pravych stran cela pravidla a priradi prvnimu pravidlu souradnice 1,1. function Rules($RLPr,$RPPr,$FRI,&$Rul,&$DlStr2) { for($i=0; $i"; endfor; //Testovani na chyby. Error($LevePr, $PravePr); Deterministic($LevePr); $RLevePr=array(); $RPravePr=array(); Reduce($LevePr, $PravePr, $RLevePr, $RPravePr); $FirstRuleIndex=FirstRule($RLevePr,$PrvniZn); if ($FirstRuleIndex==-1): Header ("Content-Type: text/html; charset=windows-1250"); echo "Nebylo nalezeno pravidlo s levou stranou q0,".$PrvniZn."!
"; 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$PosledniPom2): $p1=""; $p2=""; $p3=""; $p4=""; $p5=""; $p6=""; list($p1,$p2,$p3,$p4,$p5,$p6)=explode(",",$DlazdiceStr2[$i1]); $Incr12=0; $Nalezeno3=0; while ($Nalezeno3==0 && $Incr12<(Count($DlazdiceStr11))): $t11=""; $t12=""; $t13=""; $t14=""; $t15=""; $t16=""; list($t11,$t12,$t13,$t14,$t15,$t16)=explode(",",$DlazdiceStr11[$Incr12]); if ((($p5+1).",".$p6)==($t15.",".$t16)): $Nalezeno3=1; endif; $Incr12++; endwhile; $Incr13=0; while ($Nalezeno3==0 && $Incr13<(Count($DlazdiceStr12))): $t21=""; $t22=""; $t23=""; $t24=""; $t25=""; $t26=""; list($t21,$t22,$t23,$t24,$t25,$t26)=explode(",",$DlazdiceStr12[$Incr13]); if ((($p5+1).",".$p6)==($t25.",".$t26)): $Nalezeno3=1; endif; $Incr13++; endwhile; $Incr14=0; while ($Nalezeno3==0 && $Incr14<(Count($DlazdiceStr3))): $t31=""; $t32=""; $t33=""; $t34=""; $t35=""; $t36=""; list($t31,$t32,$t33,$t34,$t35,$t36)=explode(",",$DlazdiceStr3[$Incr14]); if ((($p5+1).",".$p6)==($t35.",".$t36)): $Nalezeno3=1; endif; $Incr14++; endwhile; $Incr15=0; while ($Nalezeno3==0 && $Incr15<(Count($DlazdiceStr2))): $t41=""; $t42=""; $t43=""; $t44=""; $t45=""; $t46=""; list($t41,$t42,$t43,$t44,$t45,$t46)=explode(",",$DlazdiceStr2[$Incr15]); if ((($p5+1).",".$p6)==($t45.",".$t46)): $Nalezeno3=1; endif; $Incr15++; endwhile; if ($Nalezeno3==0): for ($mx=($p5+1); $mx<($MaxX+2); $mx++): if ($mx<$MaxX+1): $DlazdiceStr4[]=$p4.", , ,".$p4.",".$mx.",".$p6; else: $DlazdiceStr4[]=$p4.",<>,<>, ,".$mx.",".$p6; endif; endfor; endif; endif; endfor; //Dogenerovani zbyvajicich dlazdic pod dlazdicemi PosledniPom2 a PosledniPom3. list($po1,$po2,$po3,$po4,$po5,$po6)=explode(",",$PosledniPom2); $DlazdiceStr4[]=$po4.",<>,<>, ,".($po5+1).",".$po6; if ($PosledniPom3<>""): list($pom1,$pom2,$pom3,$pom4,$pom5,$pom6)=explode(",",$PosledniPom3); $DlazdiceStr4[]=$pom4.",<>,<>, ,".($pom5+1).",".$pom6; endif; //Do DlazdiceStr5 se ulozi rohove dlazdice. $DlazdiceStr5=array(); $DlazdiceStr5[]=" , ,&,#,0,0"; $DlazdiceStr5[]=" ,~, ,*,0,".($MaxY+1); $DlazdiceStr5[]="#, ,<>, ,".($MaxX+1).",0"; $DlazdiceStr5[]="*,<>, , ,".($MaxX+1).",".($MaxY+1); //Do DlazdiceStr5 se ulozi dlazdice tvorici levou a pravou stranu dlazdeni. for ($st=1; $st<($MaxX+1); $st++): $DlazdiceStr5[]="#, , ,#,".$st.",0"; $DlazdiceStr5[]="*, , ,*,".$st.",".($MaxY+1); endfor; //Oreze DlazdiceStr0 o dlazdice, jejichz souradnice e6 je vetsi nez MaxY. $DlazdiceStr1=array(); for ($poc=0; $poc"; endfor; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; echo "
"; echo "

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).").


"; 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; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; for ($i=0; $i"; endfor; /* for ($i=0; $i<($MaxX+2); $i++): for ($y=0; $y<($MaxY+2); $y++): echo $i.",".$y.": ".$DlazdiceStr2D[$i][$y]."
"; 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"); ?> Wangovo dláždění

Počet dlaždic tvořících Wangovo dláždění bez bílých dlaždic je: "?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>

Wangovo dláždění

Počet dlaždic tvořících Wangovo dláždění bez bílých dlaždic je: "?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

 ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?> 

".$i14i."".$i14n; else: echo $i14; endif; ?>

$ZnakyRed[$i+1]): $Znaky[]=$ZnakyRed[$i]; endif; endfor; //Do DlazdiceStrA se ulozi dlazdice typu A. $DlazdiceStrA=array(); for ($i=0; $iq0,".$PrvniZn1."!
"; 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,$PrvniZn1); //Do DlazdiceStrC se ulozi dlazdice typu C. $DlazdiceStrC=array(); Rules($RLevePr,$RPravePr,$FirstRuleIndex,$DlazdiceStrC,$DS2); for ($i=0; $i$Znaky[$i+1]): $Znaky1[]=$Znaky[$i]; endif; endfor; //Do DlazdiceStrB se ulozi dlazdice typu B. $DlazdiceStrB=array(); for ($i=0; $i""): list($c1,$c2)=explode(",",$LevePr[$i]); $StavyRed[]=$c1; endif; endfor; for ($i=0; $i""): list($d1,$d2,$d3)=explode(",",$PravePr[$i]); $StavyRed[]=$d1; endif; endfor; Sort($StavyRed); //Pole Stavy obsahuje mnozinu stavu TS. $Stavy=array(); for ($i=0; $i$StavyRed[$i+1]): $Stavy[]=$StavyRed[$i]; endif; endfor; //Do DlazdiceStrD se ulozi dlazdice typu D. $DlazdiceStrD=array(); for ($y=0; $y,<>, "; endfor; for ($j=0; $j,<>, "; endfor; $DlazdiceStrE[]="#, ,<>, "; $DlazdiceStrE[]="*,<>, , "; //Testovaci vypisy. //Pole DlazdiceStrA je prevedeno na dvojrozmerne pole DlazdiceStrA2D. $j=0; $k=0; $DlazdiceStrA2D=array(array()); for ($i=0; $i"; $k++; //echo $i.". ".$DlazdiceStrA[$i]."
"; endfor; if ($j==0): $l=($k); else: $l=8; endif; //Pole DlazdiceStrB je prevedeno na dvojrozmerne pole DlazdiceStrB2D. $j1=0; $k1=0; $DlazdiceStrB2D=array(array()); for ($i=0; $i"; $k1++; //echo $i.": ".$DlazdiceStrB[$i]."
"; endfor; if ($j1==0): $l1=($k1); else: $l1=8; endif; //Pole DlazdiceStrC je prevedeno na dvojrozmerne pole DlazdiceStrC2D. $j2=0; $k2=0; $DlazdiceStrC2D=array(array()); for ($i=0; $i"; $k2++; //echo $i."; ".$DlazdiceStrC[$i]."
"; endfor; if ($j2==0): $l2=($k2); else: $l2=8; endif; //Pole DlazdiceStrD je prevedeno na dvojrozmerne pole DlazdiceStrD2D. $j3=0; $k3=0; $DlazdiceStrD2D=array(array()); for ($i=0; $i"; $k3++; //echo $i."| ".$DlazdiceStrD[$i]."
"; endfor; if ($j3==0): $l3=($k3); else: $l3=8; endif; //Pole DlazdiceStrE je prevedeno na dvojrozmerne pole DlazdiceStrE2D. $j4=0; $k4=0; $DlazdiceStrE2D=array(array()); for ($i=0; $i"; $k4++; //echo $i."\ ".$DlazdiceStrE[$i]."
"; endfor; if ($j4==0): $l4=($k4); else: $l4=8; endif; Header ("Content-Type: text/html; charset=windows-1250"); Header ("Cache-Control: no-cache"); Header ("Expires: ".GMDate("D, d M Y H:i:s")." GMT"); ?> Wangovy dlaždice

Celkem bylo vytvořeno různých Wangových dlaždic.

Wangových dlaždic typu (a) je: ""): list($i11,$i12,$i13,$i14)=explode(",",$DlazdiceStrA2D[$i][$y]); ?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>


Wangových dlaždic typu (b) je: ""): list($i11,$i12,$i13,$i14)=explode(",",$DlazdiceStrB2D[$i][$y]); ?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>


Wangových dlaždic typu (c) je: ""): list($i11,$i12,$i13,$i14)=explode(",",$DlazdiceStrC2D[$i][$y]); ?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>


Wangových dlaždic typu (d) je: ""): list($i11,$i12,$i13,$i14)=explode(",",$DlazdiceStrD2D[$i][$y]); ?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>


Wangových dlaždic typu (e) je: ""): list($i11,$i12,$i13,$i14)=explode(",",$DlazdiceStrE2D[$i][$y]); ?>

".$i11i."".$i11n; else: echo $i11; endif; ?>

  ".$i12i."".$i12n; else: echo $i12; endif; ?>

".$i13i."".$i13n; else: echo $i13; endif; ?>  

".$i14i."".$i14n; else: echo $i14; endif; ?>

Nápověda

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

StavČísloX,ČtenýSymbol
a pravá část pravidla je ve tvaru
StavČísloX,ZapisovanýSymbol,PosunHlavy,
kde:
  • StavČísloX je z množiny stavů q0 až q99,
  • ČtenýSymbol je písmeno malé nebo velké abecedy, číslo, anebo prázdný symbol _ (blank),
  • ZapisovanýSymbol je písmeno malé nebo velké abecedy, číslo, anebo prázdný symbol _ (blank),
  • PosunHlavy je pouze jedno z písmen L, R, S, které po řadě značí posun hlavy vlevo, vpravo a stůj.
q0 značí počáteční stav a q99 označuje koncový stav (oba je nutné použít). Celkový počet pravidel, které lze zadat do formuláře je 80.

Příklad:

Pod formulářem pro zadávání pravidel je umístěna čtveřice tlačítek:

  • Tlačítko Generuj dlaždice slouží k vygenerování všech možných navzájem různých Wangových dlaždic podle daného startovacího slova a daných pravidel Turingova stroje bez ohledu na to, jsou-li použity v dláždění (viz tlačítko Generuj dlážděni). Wangovy dlaždice jsou rozděleny do pěti skupin (a) až (e) podle toho, jak byly vytvořeny.
  • Tlačítko Generuj dláždění slouží ke generování Wangova dláždění, které reprezentuje činnost Turingova stroje, jehož pravidla jsou zadány ve formuláři. Každá řada dláždění reprezentuje jednu konfiguraci Turingova stroje a sousedící řady reprezentují platný přechod mezi konfiguracemi. Neskončí-li Turingův stroj po 100 krocích algoritmu v koncovém stavu, pak je přerušen.
  • Tlačítko Vymaž formulář vymaže údaje zadané do formuláře.
  • Tlačítko Nápověda otevře tuto stránku s návodem.

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

d(StavČísloX,ČtenýSymbol)=(StavČísloX,ZapisovanýSymbol,PosunHlavy),
kde:
  • StavČísloX je z množiny stavů 0 až 99,
  • ČtenýSymbol je písmeno malé nebo velké abecedy, číslo, anebo prázdný symbol _ (jako prázdný symbol může být také použita mezera, která bude při importu do formuláře nahrazena znakem _),
  • ZapisovanýSymbol je písmeno malé nebo velké abecedy, číslo, anebo prázdný symbol _ (jako prázdný symbol může být také použita mezera, která bude při importu do formuláře nahrazena znakem _),
  • PosunHlavy je jedno z písmen L, R, S (místo písmena S může být použita mezera, jež bude při importu do formuláře nahrazena znakem S), které po řadě značí posun hlavy vlevo, vpravo a stůj.
0 značí počáteční stav a 99 označuje koncový stav (oba je nutné použít). Každé z pravidel musí být zadáno zvlášť na novém řádku. Soubor je třeba vždy ukládat jako čistý text.

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.