diff --git a/Where-is-the-Arrow-Pointing/gnieark/resolver.php b/Where-is-the-Arrow-Pointing/gnieark/resolver.php index e8b93c5..0b4f277 100644 --- a/Where-is-the-Arrow-Pointing/gnieark/resolver.php +++ b/Where-is-the-Arrow-Pointing/gnieark/resolver.php @@ -24,8 +24,6 @@ echo "\n".file_get_contents('./input.txt')."\nLe départ est aux positions ".$ma $previousX=-1; // Contiendra l'ordonnée de la position précédente. (pour le moment, une valeur incohérente) $previousY=-1; // Contiendra l'absycede la position précédente. (pour le moment, une valeur incohérente) -$xMax=count($map[0]) -1; -$yMax=count($map) -1; $previousCrosses=array(); //On ne gardera en mémoire que les croisements, pas l'ensemble du chemin. while(1==1){ // C'est un défi de codagee, pas un script qui sera en prod. j'assume. @@ -122,7 +120,7 @@ function wheAreOnAnArrow($arrow){ default: break; } - if(($targetX <0) OR ($targetY<0) OR ($targetX>$xMax) OR ($targetY>$yMax) OR (in_array($map[$targetY][$targetX],$charsOfTheLoose))){ + 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{ @@ -139,16 +137,20 @@ function wheAreOnAnArrow($arrow){ function whereToGoAfterCross($xCross,$yCross,$previousX,$previousY){ //haut - if(canGoAfterCross($xCross,$yCross +1 ,$xCross,$yCross,$previousX,$previousY)){ - return array($xCross,$yCross +1); - }elseif(canGoAfterCross($xCross,$yCross -1 ,$xCross,$yCross,$previousX,$previousY)){ - //bas + 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 @@ -157,15 +159,16 @@ function whereToGoAfterCross($xCross,$yCross,$previousX,$previousY){ } function canGoAfterCross($xTo,$yTo,$xNow,$yNow,$xPrevious,$yPrevious){ - global $previousCrosses,$xMax,$yMax,$map; - if(($xTo < 0) OR ($yTo < 0) OR ($xTo >= $xMax) OR ($yTo >= $yMax)){return false;}// ça sort des limites de la carte + 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; @@ -176,7 +179,7 @@ function go($targetX,$targetY){ 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; + $previousCrosses[$x."-".$y][]=$targetX."-".$targetY; } $previousX=$x; $previousY=$y; diff --git a/Where-is-the-Arrow-Pointing/gnieark/resolvershorter.php b/Where-is-the-Arrow-Pointing/gnieark/resolvershorter.php deleted file mode 100644 index eb2a165..0000000 --- a/Where-is-the-Arrow-Pointing/gnieark/resolvershorter.php +++ /dev/null @@ -1,144 +0,0 @@ -','^','V'))){c($k,$y);} - else{b();} - }else{ - $k=$x-1; - if(in_array($c[$y][$k],array('-','+','S','<','^','V'))){c($k,$y);} - else{b();} - } - break; - case "|": - if($e < $y){ - $l=$y+1; - if(in_array($c[$l][$x],array('|','+','S','>','<','V'))){c ($x,$l);} - else{b();} - }else{ - $l=$y - 1; - if(in_array($c[$l][$x],array('|','+','S','>','<','V'))){c ($x,$l);}else{b();} - } - break; - case "^": - case "V": - case ">": - case "<": - d($c[$y][$x]); - break; - } -} -function d($m){ - global $x,$y,$f,$g,$c; - switch($m){ - case "^": - $k=$x; - $l=$y -1; - $n=array(" ","V","-","s"); - break; - case "V": - $k=$x; - $l=$y + 1; - $n=array(" ","^","-","s"); - break; - case ">": - $k=$x + 1; - $l=$y; - $n=array(" ","<","|","s"); - break; - case "<": - $k=$x - 1; - $l=$y; - $n=array(" ",">","|","s"); - break; - default: - break; - } - if(($k <0) OR ($l<0) OR ($k>$f) OR ($l>$g) OR (in_array($c[$l][$k],$n))){b();}else{ - if(preg_match("/^[a-z]$/",strtolower($c[$l][$k]))){ - echo "WIN: ".$c[$l][$k]."\n"; - die; - }else{c($k,$l);} - } -} -function a($xCross,$yCross,$d,$e){ - if(e($xCross,$yCross +1 ,$xCross,$yCross,$d,$e)){return array($xCross,$yCross +1);} - elseif(e($xCross,$yCross -1 ,$xCross,$yCross,$d,$e)){return array($xCross,$yCross -1);} - elseif(e($xCross-1,$yCross,$xCross,$yCross,$d,$e)){return array($xCross-1,$yCross);} - elseif(e($xCross+1,$yCross,$xCross,$yCross,$d,$e)){return array($xCross+1,$yCross);} - else{return false;} -} -function e($o,$p,$q,$r,$s,$t){ - global $h,$f,$g,$c; - if(($o < 0) OR ($p < 0) OR ($o >= $f) OR ($p >= $g)){return false;} - if( - ($c[$p][$o]==" ") - OR (($o==$s)&&($p==$t)) - OR (($o==$q)&&($c[$p][$o]=="-")) - OR (($p==$r)&&($c[$p][$o]=="|")) - OR ((isset($h[$q."-".$r])) && (in_array($o."-".$p,$h[$q."-".$r]))) - ){return false;} - return true; -} - -function c($k,$l){ - global $d,$e,$x,$y,$h,$c; - if(($c[$y][$x]=='S')OR ($c[$y][$x]=='+')){ - $h[$x."-".$y][]=$d."-".$e; - $h[$x."-".$y][]=$k."-".$l; - } - $d=$x; - $e=$y; - $x=$k; - $y=$l; - echo "deplacement en ".$x.";".$y."\n"; -} -function b(){ - global $x,$y,$d,$e,$f,$g,$h; - foreach($h as $v => $u){ - list($w,$z)=explode("-",$v); - $aa=a($w,$z,-1,-1); - if($aa){ - c($w,$z); - return true; - } - } - echo "Aucun chemin n'est possible\n"; - die; -} diff --git a/Where-is-the-Arrow-Pointing/input.txt b/Where-is-the-Arrow-Pointing/input.txt index 06e2bf9..34e091d 100644 --- a/Where-is-the-Arrow-Pointing/input.txt +++ b/Where-is-the-Arrow-Pointing/input.txt @@ -1,3 +1,11 @@ -d s<+S+--V - ||| Q - -++ + +-------+ +-------+--+-------+ +------+ + | | | +-+ | | | | ++ + | +----+ | | | | | +----+ | +-+ | + | | | | | | | | | | | | + | +--+ | +-+ ++ | +--+ | | | | +S----+ | | +--+ | | | | | +--->B + | +--+ | +-+ ++ | +--+ | | | | + | | | | | | | | | | | | + | | | | | | | +----+ | +-+ | + | | | | | | | | | ++ + +--+-------+--+ +--+ +-------+--+------+ \ No newline at end of file