"; 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." pravidla!
"; 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""): if ($RLP[$i]==$RLP[$y]): Header ("Content-Type: text/html"); echo "Leva strana pravidla ".$RLP[$i]." se nesmi opakovat! Turinguv stroj pak neni detrministicky.
" ; 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"); echo "Leva strana pravidla ".$LevePr[$i]." nebyla zadana korektne!
"; 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; $iq0,".$PZ." je mozne pouzit 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"); 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"); 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$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 "

Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic je: ".(($MaxX+2)*($MaxY+2))." (".($MaxX+2)."x".($MaxY+2).").


"; 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; 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"); Header ("Cache-Control: no-cache"); Header ("Expires: ".GMDate("D, d M Y H:i:s")." GMT"); ?> Wangovo dlazdeni

Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic 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 dlazdeni

Pocet dlazdic tvoricich Wangovo dlazdeni bez bilych dlazdic 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"); echo "Nebylo nalezeno pravidlo s koncovym 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"); Header ("Cache-Control: no-cache"); Header ("Expires: ".GMDate("D, d M Y H:i:s")." GMT"); ?> Wangovy dlazdice

Celkem bylo vytvoreno ruznych Wangovych dlazdic.

Wangovych dlazdic 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; ?>


Wangovych dlazdic 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; ?>


Wangovych dlazdic 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; ?>


Wangovych dlazdic 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; ?>


Wangovych dlazdic 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; ?>

Napoveda

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

StavCisloX,CtenySymbol
a prava cast pravidla je ve tvaru
StavCisloX,ZapisovanySymbol,PosunHlavy,
kde:
  • StavCisloX je z mnoziny stavu q0 az q99,
  • CtenySymbol je pismeno male nebo velke abecedy, cislo, anebo prazdny symbol _ (blank),
  • ZapisovanySymbol je pismeno male nebo velke abecedy, cislo, anebo prazdny symbol _ (blank),
  • PosunHlavy je pouze jedno z pismen L, R, S, ktere po rade znaci posun hlavy vlevo, vpravo a stuj.
q0 znaci pocatecni stav a q99 oznacuje koncovy stav (oba je nutne pouzit). Celkovy pocet pravidel, ktere lze zadat do formulare je 80.

Priklad:

Pod formularem pro zadavani pravidel je umistena ctverice tlacitek:

  • Tlacitko Generuj dlazdice slouzi k vygenerovani vsech moznych navzajem ruznych Wangovych dlazdic podle daneho startovacího slova a danych pravidel Turingova stroje bez ohledu na to, jsou-li pouzity v dlazdeni (viz tlacitko Generuj dlazdeni). Wangovy dlazdice jsou rozdeleny do peti skupin (a) az (e) podle toho, jak byly vytvoreny.
  • Tlacitko Generuj dlazdeni slouzi ke generovani Wangova dlazdeni, ktere reprezentuje cinnost Turingova stroje, jehoz pravidla jsou zadany ve formulari. Kazda rada dlazdeni reprezentuje jednu konfiguraci Turingova stroje a sousedici rady reprezentuji platny prechod mezi konfiguracemi. Neskonci-li Turinguv stroj po 100 krocich algoritmu v koncovem stavu, pak je prerusen.
  • Tlacitko Vymaz formular vymaze udaje zadane do formulare.
  • Tlacitko Napoveda otevre tuto stranku s navodem.

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

d(StavCisloX,CtenySymbol)=(StavCisloX,ZapisovanySymbol,PosunHlavy),
kde:
  • StavCisloX je z mnoziny stavu 0 az 99,
  • CtenySymbol je pismeno male nebo velke abecedy, cislo, anebo prazdny symbol _ (jako prazdny symbol muze byt take pouzita mezera, ktera bude pri importu do formulare nahrazena znakem _),
  • ZapisovanySymbol je pismeno male nebo velke abecedy, cislo, anebo prazdny symbol _ (jako prazdny symbol muze byt take pouzita mezera, ktera bude pri importu do formulare nahrazena znakem _),
  • PosunHlavy je jedno z pismen L, R, S (misto pismena S muze byt pouzita mezera, jez bude pri importu do formulare nahrazena znakem S), ktere po rade znaci posun hlavy vlevo, vpravo a stuj.
0 znaci pocatecni stav a 99 oznacuje koncovy stav (oba je nutne pouzit). Kazde z pravidel musí byt zadano zvlast na novem radku. Soubor je treba vzdy ukladat jako cisty text.

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.