diff --git a/Grille.php b/Grille.php index 31dbed5..f9ee652 100644 --- a/Grille.php +++ b/Grille.php @@ -75,14 +75,14 @@ class Grille implements ArrayAccess // en colonne $lettres_colonne = $this->lettres_suivantes[$this->hauteur]; for ($y2 = 0; $y2 < $y; $y2++) { - $lettres_colonne = $lettres_colonne->noeud[$this->grille[$y2][$x]]; + $lettres_colonne = $lettres_colonne->branches[$this->grille[$y2][$x]]; } $lettres_communes = array_intersect_key( - $lettres_ligne->noeud, - $lettres_colonne->noeud + $lettres_ligne->branches, + $lettres_colonne->branches ); foreach ($lettres_communes as $lettre => $_) { - $lettres_communes[$lettre] = count($lettres_ligne->noeud[$lettre]) * count($lettres_colonne->noeud[$lettre]) * gaussienne(1, 5); + $lettres_communes[$lettre] = count($lettres_ligne->branches[$lettre]) * count($lettres_colonne->branches[$lettre]) * gaussienne(1, 5); } uksort($lettres_communes, function($a, $b) use ($lettres_communes) { return $lettres_communes[$b] <=> $lettres_communes[$a]; @@ -127,7 +127,7 @@ class Grille implements ArrayAccess } if ($i < $this->nb_positions - 1) { - yield from $this->gen_grilles($i + 1, $lettres_ligne->noeud[$lettre]); + yield from $this->gen_grilles($i + 1, $lettres_ligne->branches[$lettre]); } else { yield $this; } diff --git a/Trie.php b/Trie.php index 6112d04..8a30a10 100644 --- a/Trie.php +++ b/Trie.php @@ -2,73 +2,66 @@ class Trie implements ArrayAccess, IteratorAggregate, Countable { - public array $noeud = []; + public array $branches = []; private $nb_branches = 0; - public function offsetSet($cles, $valeur): void { - if (!count($cles)) { - throw new \OutOfBoundsException("Liste de clés vide."); - } - $cle = array_shift($cles); - if (!isset($this->noeud[$cle])) $this->noeud[$cle] = new Trie(); - $this->nb_branches++; - if (count($cles)) { - $this->noeud[$cle]->offsetSet($cles, $valeur); - } else { - $this->noeud[$cle] = $valeur; - } - } - // ArrayAccess - public function offsetExists($cles): bool { - if (!count($cles)) { - return false; - } - $cle = array_shift($cles); - if (count($cles)) { - return $this->noeud[$cle]->offsetExists($cles); + public function offsetSet($cles, $valeur): void { + $this->nb_branches++; + $cle = $cles[0]; + $cles = array_slice($cles, 1); + if ($cles == []) { + $this->branches[$cle] = $valeur; } else { - return isset($this->noeud[$cles[0]]); + if (!isset($this->branches[$cle])) $this->branches[$cle] = new Trie(); + $this->branches[$cle]->offsetSet($cles, $valeur); } } - public function offsetGet($cles): mixed { - if (!count($cles)) { - throw new \OutOfBoundsException("Liste de clés vide."); - } - $cle = array_shift($cles); - if (!isset($this->noeud[$cle])) $this->noeud[$cle] = new Trie(); - if (count($cles)) { - return $this->noeud[$cle]->offsetGet($cles); + public function offsetExists($cles): bool { + $cle = $cles[0]; + $cles = array_slice($cles, 1); + if ($cles == []) { + return isset($this->branches[$cle]); } else { - return $this->noeud[$cle]; + return isset($this->branches[$cle]) && $this->branches[$cle]->offsetExists($cles); + } + } + + public function &offsetGet($cles): mixed { + $cle = $cles[0]; + $cles = array_slice($cles, 1); + if ($cles == []) { + return $this->branches[$cle]; + } else { + return $this->branches[$cle]->offsetGet($cles); } } public function offsetUnset($cles): void { - if ($this->offsetExists($cles)) { - $cle = array_shift($cles); + $cle = $cles[0]; + $cles = array_slice($cles, 1); + if ($cles == []) { + unset($this->branches[$cle]); $this->nb_branches--; - if (count($cles)) { - $this->noeud[$cle]->offsetUnset($cles); - if (count($this->noeud[$cle]) == 0) { - unset($this->noeud[$cle]); - } - } else { - unset($this->noeud[$cle]); + } else { + $this->branches[$cle]->offsetUnset($cles); + $this->nb_branches--; + if (count($this->branches[$cle]) == 0) { + unset($this->branches[$cle]); } } } // IteratorAggregate - public function getIterator(): Generator { - foreach ($this->noeud as $cle => $branche) { + public function getIterator(): Traversable { + foreach ($this->branches as $cle => $branche) { if ($branche instanceof Trie) { foreach($branche as $sous_cles => $feuille) { - yield [$cle, ...$sous_cles] => $feuille; + yield array_merge([$cle], $sous_cles) => $feuille; } } else { - yield $cle => $branche; + yield [$cle] => $branche; } } } diff --git a/dico.csv b/dico.csv index b8c68fa..0bcb5b2 100644 --- a/dico.csv +++ b/dico.csv @@ -725,7 +725,7 @@ EAU Doit quitter son château pour aller à la chasse Yannick Le Nagard EAU Sa fleur n'a pas besoin d'être arrosée Yannick Le Nagard EAU Doit être calme pour bien réfléchir Bernard Philippet EAU On peut se désaltérer quand on est arrivé à ce point-là Georges Perec -EAUDEVIE Marc aux canards ? Bernard Philippet +EAUDEVIE Marc aux canards ? (3 mots) Bernard Philippet EAUX Perdues avant d’aller au travail Arcane EAUX Perte d'un travail Palamède EBOUEURS Hommes de main payés pour des enlèvements Bernard Philippet @@ -1914,7 +1914,7 @@ RIDES Avec le temps, elles gagnent sur tous les fronts Roger La Ferté RIDOIR Provoque des tensions à bord Lionel Leteur RIEN N’habille que les plus belles Marc Aussitot RIEN Ne va plus au casino Chantal de Séréville -RIEN Ne va plus à monte carlo Max Favalelli +RIEN Ne va plus à Monte Carlo Max Favalelli RIMAILLEUR Cherche ses pieds sur ses doigts Georges Perec RIME Pour elle le crime est parfait Lionel Leteur RINCE Mouille ou à sec Thierry Larsan @@ -2988,6 +2988,8 @@ VEDETTE Personne qui travaille dur pour être reconnue et qui porte ensuite de g VIEILLIR Quand on dit "Tu" à tout le monde, et que tout le monde nous dit "Vous" Marcel Pagnol VOYELLES Ce qui reste quand on a enlevé toutes les consonnes ANPUTE Il lui manque effectivement une jambe Georges Perec +GATEUX Il a les défauts de l'enfance sans en avoir les agréments Max Favalelli +BAINDESIEGE Avec lui, la lune est dans l'eau (3 mots) Max Favalelli AINE Fin de semaine IS Sur la Tille IO Bête à manger du foin @@ -3076,3 +3078,10 @@ RTP Transport en temps réel des flux audio/vidéo MPLS Transmission rapide des paquets basée sur des étiquettes réseau PPP Connexion point à point (ex : anciens modems, accès internet bas débit) IPSEC Sécurisation des communications ip par chiffrement +FAUX Son usage est répréhensible au masculin mais pas au féminin. +FORET Il a fait son trou ou elle a de plus en plus de trous. +LIMA Rogna tout en restant capitale. +NESS Monstrueux mais ne se laissait pas corrompre. +PUER Cogne à Paris ou chassait les mouches à Rome.* +RATA Ne réussit pas ou n’est pas réussi. +TRIAS Choisis ou vieux avec plein de dépôts. diff --git a/dico.php b/dico.php index d46dd73..449e40c 100644 --- a/dico.php +++ b/dico.php @@ -24,9 +24,9 @@ if (($lecteur = fopen("dico.csv", "r")) !== FALSE) { $definition .= " $auteur"; break; } - $mot = strtoupper($mot); - $longueur = strlen($mot); - if (!isset($dico[$longueur])) $dico[$longueur] = []; + $mot = str_split(strtoupper($mot)); + $longueur = count($mot); + if (!isset($dico[$longueur])) $dico[$longueur] = new Trie(); if (!isset($dico[$longueur][$mot])) $dico[$longueur][$mot] = []; if (strlen($definition)) $dico[$longueur][$mot][] = $definition; } @@ -38,16 +38,14 @@ function tries($longueur_max) { $_tries = [[]]; for ($longueur = 1; $longueur <= $longueur_max; $longueur++) { - $_tries[$longueur] = new Trie(); - foreach ($dico[$longueur] as $mot => $definition) { - $_tries[$longueur][str_split($mot)] = []; - } + $_tries[$longueur] = $dico[$longueur]; for ($position_espace = MIN_PREMIER_MOT; $position_espace + MIN_MOTS_SUIVANTS < $longueur; $position_espace++) { $mots_suivants = $_tries[$longueur - $position_espace - 1]; foreach ($dico[$position_espace] as $premier_mot => $definition) { - $_tries[$longueur][str_split($premier_mot . " ")] = $mots_suivants; + $premier_mot[] = " "; + $_tries[$longueur][$premier_mot] = $mots_suivants; } } } return $_tries; -} \ No newline at end of file +} diff --git a/index.php b/index.php index 329e48f..05d42fd 100644 --- a/index.php +++ b/index.php @@ -49,7 +49,7 @@ if ($grille_valide) { for ($y = 0; $y < $hauteur; $y++) { $definitions_horizontales[$y] = []; foreach ($grille->lignes[$y] as $mot) { - $definitions = $dico[strlen($mot)][$mot]; + $definitions = $dico[strlen($mot)][str_split($mot)]; if (count($definitions)) { $definitions_horizontales[$y][] = $definitions[mt_rand(0, count($definitions) - 1)]; } @@ -59,7 +59,7 @@ if ($grille_valide) { for ($x = 0 ; $x < $largeur; $x++) { $definitions_verticales[$x] = []; foreach ($grille->colonnes[$x] as $mot) { - $definitions = $dico[strlen($mot)][$mot]; + $definitions = $dico[strlen($mot)][str_split($mot)]; if (count($definitions)) { $definitions_verticales[$x][] = $definitions[mt_rand(0, count($definitions) - 1)]; }