Correction bugs et marche si lignes de tailles différentes

master
Gnieark 9 years ago
parent ec6f90c111
commit 8e0ed646da

@ -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;

@ -1,144 +0,0 @@
<?php
/*
* By Gnieark https://blog-du-grouik.tinad.fr oct 2015
* Anwser to "code golf" http://codegolf.stackexchange.com/questions/57952/where-is-the-arrow-pointing in PHP
* short version
*/
$a=explode("\n",file_get_contents('./input.txt'));
$i=0;
foreach($a as $b){
$c[$i]=str_split($b,1);
if((!isset($y)) && in_array('S',$c[$i])){
$y=$i;
$x=array_search('S',$c[$i]);
}
$i++;
}
if(!isset($y)){
echo "Il n'y a pas de départ S dans ce parcours";
die;
}
echo "\n".file_get_contents('./input.txt')."\nLe départ est aux positions ".$c[$y][$x]." [".$x.",".$y."]. Démarrage du script...\n";
$d=-1;
$e=-1;
$f=count($c[0]) -1;
$g=count($c) -1;
$h=array();
while(1==1){
switch($c[$y][$x]){
case "S":
case "+":
$j=a($x,$y,$d,$e);
if($j){ c($j[0],$j[1]);}
else{b();}
break;
case "s":
b();
break;
case "-":
if($d < $x){
$k=$x+1;
if(in_array($c[$y][$k],array('-','+','S','>','^','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;
}

@ -1,3 +1,11 @@
d s<+S+--V
||| Q
-++
+-------+ +-------+--+-------+ +------+
| | | +-+ | | | | ++
| +----+ | | | | | +----+ | +-+ |
| | | | | | | | | | | |
| +--+ | +-+ ++ | +--+ | | | |
S----+ | | +--+ | | | | | +--->B
| +--+ | +-+ ++ | +--+ | | | |
| | | | | | | | | | | |
| | | | | | | +----+ | +-+ |
| | | | | | | | | ++
+--+-------+--+ +--+ +-------+--+------+
Loading…
Cancel
Save