C'est du php pas du javascript
Code : Tout sélectionner
function checkParityMask ($mask) {
if (!is_array($mask)) mask2array($mask,null);
foreach($mask as $value) if (!$value) return $false;//renvoi false si une valeur est a false
$corner = array_count_values(array_slice($mask,14,8));
$edge = array_count_values(array_slice($mask,34,12));
if (!isset($corner[-1]) && array_sum(array_slice($mask,14,8)) % 3) return false;
if (!isset($edge[-1]) && array_sum(array_slice($mask,34,12)) % 2) return false;
$parity = false;
$corner = array_count_values(array_slice($mask,6,8));
$edge = array_count_values(array_slice($mask,22,12));
if ((isset($corner[-1]) && $corner[-1] > 1) || (isset($edge[-1]) && $edge[-1] > 1)) return true;//Si il y a au moins 2 -1 dans les positions des coins ou des arêtes, il ne peut y avoir de parité.
$cycle = '';
$i = 0;
while($i < 8) {
if ($mask[$i+6] == -1) {
$cycle = '';
break;
} elseif ($mask[$i+6] == $i) {
$i++;
continue;
} elseif (strpos($cycle,strval($mask[$i+6])) !== false) {
$cycle .= (substr($cycle,-1) == '|') ? '' : '|';
$i++;
} else {
$cycle .= $mask[$i+6];
$i = $mask[$i+6];
}
}
if (strlen($cycle) > 0) {
$cycle = (substr($cycle,-1) == '|') ? substr($cycle,0,-1) : $cycle;
$cycle = array_map('strlen',explode('|',$cycle));
foreach($cycle as $n) {
if (!($n % 2)) $parity = !$parity;
}
}
$cycle = '';
$i = 0;
while($i < 12) {
if ($mask[$i+22] == -1) {
$cycle = '';
break;
} elseif ($mask[$i+22] == $i) {
$i++;
continue;
} elseif (strpos($cycle,strval($mask[$i+22])) !== false) {
$cycle .= (substr($cycle,-1) == '|') ? '' : '|';
$i++;
} else {
$cycle .= $mask[$i+22];
$i = $mask[$i+22];
}
}
if (strlen($cycle) > 0) {
$cycle = (substr($cycle,-1) == '|') ? substr($cycle,0,-1) : $cycle;
$cycle = array_map('strlen',explode('|',$cycle));
foreach($cycle as $n) {
if (!($n % 2)) $parity = !$parity;
}
}
return !$parity;
}
ce code vient d'une bibliothèque cube_lib que j'ai améliorer moi même notamment avec cette fonction.
Ma représentation d'un cube ressemble à ceci (cube résolu)
(0,1,2,3,4,5),(0,1,2,3,4,5,6,7),(0,0,0,0,0,0,0,0),(0,1,2,3,4,5,6,7,8,9,10,11),(0,0,0,0,0,0,0,0,0,0,0,0)
ou sont équivalent en tableau (d'où la fonction mask2array)
les groupes sont:
-la position des centres
-la position des coins
-l'oriuentation des coins
-la position des arètes
-l'orientation des arêtes
Pour la position j'ai défini un emplacement pour chaque pièce
centres : U R F D L B
coins: $URF, $UFL, $ULB, $UBR, $DFR, $DLF, $DBL, $DRB
arêtes: $UR, $UF, $UL, $UB, $DR, $DF, $DL, $DB, $FR, $FL, $BL, $BR
le nombre à chaque emplacement défini quelle pièce est où
Pour l'orientation les coins peuvent avoir 0, 1 ou 2 et les arête 0 ou 1
0 correspondant à une bonne orientation selon une définition de blind facette U ou D sur la face U ou D pour les coins et
https://www.francocube.com/deadalnix/blindfold_step_2 pour les arêtes
La petite complexité dans le code vient du faite qu'il peut y avoir des -1 à la place des nombre lorsque lea pièce ou l'orientation n'est pas définie.
Dans mon algo je commence par définir si les orientations sont cohérente
puis je défini les taille de cycle des arêtes et des coins et déterminaer si il y a parité dans chacun des sous groupes si il n'y a pas de partité ou 2 parité le cube est faisable.
Je peux te fournir le code complet de mon cube_lib si tu veux