commit 3577f6f4820ebe58e99a81b3b8ca350545187c13 Author: Gnieark Date: Mon Oct 19 14:40:47 2015 +0200 plop diff --git a/README.md b/README.md new file mode 100644 index 0000000..cba7da6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Chanllenge rules are there: http://codegolf.stackexchange.com/questions/57952/where-is-the-arrow-pointing diff --git a/input.txt b/input.txt new file mode 100644 index 0000000..34e091d --- /dev/null +++ b/input.txt @@ -0,0 +1,11 @@ + +-------+ +-------+--+-------+ +------+ + | | | +-+ | | | | ++ + | +----+ | | | | | +----+ | +-+ | + | | | | | | | | | | | | + | +--+ | +-+ ++ | +--+ | | | | +S----+ | | +--+ | | | | | +--->B + | +--+ | +-+ ++ | +--+ | | | | + | | | | | | | | | | | | + | | | | | | | +----+ | +-+ | + | | | | | | | | | ++ + +--+-------+--+ +--+ +-------+--+------+ \ No newline at end of file diff --git a/resolver.php b/resolver.php new file mode 100644 index 0000000..0b4f277 --- /dev/null +++ b/resolver.php @@ -0,0 +1,209 @@ +','^','V'))){ + go($targetX,$y); + }else{ + //On est dans un cul de sac + goToPreviousCross(); + } + }else{ + //vers la gauche + $targetX=$x-1; + if(in_array($map[$y][$targetX],array('-','+','S','<','^','V'))){ + go($targetX,$y); + }else{ + //On est dans un cul de sac + goToPreviousCross(); + } + } + break; + case "|": + //déplacement vertical + if($previousY < $y){ + //on descend (/!\ y augmente vers le bas de la carte) + $targetY=$y+1; + if(in_array($map[$targetY][$x],array('|','+','S','>','<','V'))){ + go ($x,$targetY); + }else{ + goToPreviousCross(); + } + }else{ + //on Monte (/!\ y augmente vers le bas de la carte) + $targetY=$y - 1; + if(in_array($map[$targetY][$x],array('|','+','S','>','<','V'))){ + go ($x,$targetY); + }else{ + goToPreviousCross(); + } + } + break; + + case "^": + case "V": + case ">": + case "<": + wheAreOnAnArrow($map[$y][$x]); + break; + } +} +function wheAreOnAnArrow($arrow){ + + global $x,$y,$xMax,$yMax,$map; + switch($arrow){ + case "^": + $targetX=$x; + $targetY=$y -1; + $charsOfTheLoose=array(" ","V","-","s"); + break; + case "V": + $targetX=$x; + $targetY=$y + 1; + $charsOfTheLoose=array(" ","^","-","s"); + break; + case ">": + $targetX=$x + 1; + $targetY=$y; + $charsOfTheLoose=array(" ","<","|","s"); + break; + case "<": + $targetX=$x - 1; + $targetY=$y; + $charsOfTheLoose=array(" ",">","|","s"); + break; + default: + break; + } + if((!isset($map[$targetY][$targetX])) OR (in_array($map[$targetY][$targetX],$charsOfTheLoose))){ + //on sort du cadre ou on tombe sur un caractere inadapté + goToPreviousCross(); + }else{ + if(preg_match("/^[a-z]$/",strtolower($map[$targetY][$targetX]))){ + //WIN + echo "WIN: ".$map[$targetY][$targetX]."\n"; + die; + }else{ + //on va sur la cible + go($targetX,$targetY); + } + } +} +function whereToGoAfterCross($xCross,$yCross,$previousX,$previousY){ + + //haut + if(canGoAfterCross($xCross,$yCross -1 ,$xCross,$yCross,$previousX,$previousY)){ + echo "haut\n"; + return array($xCross,$yCross -1); + }elseif(canGoAfterCross($xCross,$yCross +1 ,$xCross,$yCross,$previousX,$previousY)){ + //bas + echo "bas\n"; + return array($xCross,$yCross +1); + }elseif(canGoAfterCross($xCross-1,$yCross,$xCross,$yCross,$previousX,$previousY)){ + //gauche + echo "gauche\n"; + return array($xCross-1,$yCross); + }elseif(canGoAfterCross($xCross+1,$yCross,$xCross,$yCross,$previousX,$previousY)){ + //droite + echo "droite\n"; + return array($xCross+1,$yCross); + }else{ + //pas de direction possible + return false; + } +} + +function canGoAfterCross($xTo,$yTo,$xNow,$yNow,$xPrevious,$yPrevious){ + global $previousCrosses,$map; + if(!isset($map[$yTo][$xTo])){return false;}// ça sort des limites de la carte + if( + ($map[$yTo][$xTo]==" ") // on ne va pas sur un caractere vide + OR (($xTo==$xPrevious)&&($yTo==$yPrevious)) //on ne peut pas revenir sur nos pas (enfin, ça ne servirait à rien dans cet algo) + OR (($xTo==$xNow)&&($map[$yTo][$xTo]=="-")) //Déplacement vertical, le caractere suivant ne peut etre "-" + OR (($yTo==$yNow)&&($map[$yTo][$xTo]=="|")) // Déplacement horizontal, le caractère suivant ne peut être "|" + OR ((isset($previousCrosses[$xNow."-".$yNow])) && (in_array($xTo."-".$yTo,$previousCrosses[$xNow."-".$yNow]))) //croisement, ne pas prendre une direction déjà prise + OR (preg_match("/^[a-z]$/",strtolower($map[$yTo][$xTo]))) //peut pas tomber sur une lettre direct apres un croisement + ){ + return false; + } + return true; +} + +function go($targetX,$targetY){ + global $previousX,$previousY,$x,$y,$previousCrosses,$map; + if(($map[$y][$x]=='S')OR ($map[$y][$x]=='+')){ + //on enregistre le croisement dans lequel on renseigne la direction prise et la direction d'origine + $previousCrosses[$x."-".$y][]=$previousX."-".$previousY; + $previousCrosses[$x."-".$y][]=$targetX."-".$targetY; + } + $previousX=$x; + $previousY=$y; + $x=$targetX; + $y=$targetY; + //debug + echo "deplacement en ".$x.";".$y."\n"; +} +function goToPreviousCross(){ + global $x,$y,$previousX,$previousY,$xMax,$yMax,$previousCrosses; + + /* + * On va remonter aux précédents croisements jusqu'à ce + * qu'un nouveau chemin soit exploitable + */ + foreach($previousCrosses as $key => $croisement){ + list($crossX,$crossY)=explode("-",$key); + $cross=whereToGoAfterCross($crossX,$crossY,-1,-1); + if($cross){ + go($crossX,$crossY); + return true; + } + } + //si on arrive là c'est qu'on est bloqués + echo "Aucun chemin n'est possible\n"; + die; +} \ No newline at end of file