Tries everywhere!

This commit is contained in:
Adrien MALINGREY 2025-05-07 18:34:08 +02:00
parent b1f3e8b85f
commit ab9e1f08ef
5 changed files with 63 additions and 63 deletions

View File

@ -75,14 +75,14 @@ class Grille implements ArrayAccess
// en colonne // en colonne
$lettres_colonne = $this->lettres_suivantes[$this->hauteur]; $lettres_colonne = $this->lettres_suivantes[$this->hauteur];
for ($y2 = 0; $y2 < $y; $y2++) { 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_communes = array_intersect_key(
$lettres_ligne->noeud, $lettres_ligne->branches,
$lettres_colonne->noeud $lettres_colonne->branches
); );
foreach ($lettres_communes as $lettre => $_) { 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) { uksort($lettres_communes, function($a, $b) use ($lettres_communes) {
return $lettres_communes[$b] <=> $lettres_communes[$a]; return $lettres_communes[$b] <=> $lettres_communes[$a];
@ -127,7 +127,7 @@ class Grille implements ArrayAccess
} }
if ($i < $this->nb_positions - 1) { 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 { } else {
yield $this; yield $this;
} }

View File

@ -2,73 +2,66 @@
class Trie implements ArrayAccess, IteratorAggregate, Countable { class Trie implements ArrayAccess, IteratorAggregate, Countable {
public array $noeud = []; public array $branches = [];
private $nb_branches = 0; 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 // ArrayAccess
public function offsetExists($cles): bool { public function offsetSet($cles, $valeur): void {
if (!count($cles)) { $this->nb_branches++;
return false; $cle = $cles[0];
} $cles = array_slice($cles, 1);
$cle = array_shift($cles); if ($cles == []) {
if (count($cles)) { $this->branches[$cle] = $valeur;
return $this->noeud[$cle]->offsetExists($cles);
} else { } 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 { public function offsetExists($cles): bool {
if (!count($cles)) { $cle = $cles[0];
throw new \OutOfBoundsException("Liste de clés vide."); $cles = array_slice($cles, 1);
} if ($cles == []) {
$cle = array_shift($cles); return isset($this->branches[$cle]);
if (!isset($this->noeud[$cle])) $this->noeud[$cle] = new Trie();
if (count($cles)) {
return $this->noeud[$cle]->offsetGet($cles);
} else { } 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 { public function offsetUnset($cles): void {
if ($this->offsetExists($cles)) { $cle = $cles[0];
$cle = array_shift($cles); $cles = array_slice($cles, 1);
if ($cles == []) {
unset($this->branches[$cle]);
$this->nb_branches--; $this->nb_branches--;
if (count($cles)) { } else {
$this->noeud[$cle]->offsetUnset($cles); $this->branches[$cle]->offsetUnset($cles);
if (count($this->noeud[$cle]) == 0) { $this->nb_branches--;
unset($this->noeud[$cle]); if (count($this->branches[$cle]) == 0) {
} unset($this->branches[$cle]);
} else {
unset($this->noeud[$cle]);
} }
} }
} }
// IteratorAggregate // IteratorAggregate
public function getIterator(): Generator { public function getIterator(): Traversable {
foreach ($this->noeud as $cle => $branche) { foreach ($this->branches as $cle => $branche) {
if ($branche instanceof Trie) { if ($branche instanceof Trie) {
foreach($branche as $sous_cles => $feuille) { foreach($branche as $sous_cles => $feuille) {
yield [$cle, ...$sous_cles] => $feuille; yield array_merge([$cle], $sous_cles) => $feuille;
} }
} else { } else {
yield $cle => $branche; yield [$cle] => $branche;
} }
} }
} }

View File

@ -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 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 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 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 daller au travail Arcane EAUX Perdues avant daller au travail Arcane
EAUX Perte d'un travail Palamède EAUX Perte d'un travail Palamède
EBOUEURS Hommes de main payés pour des enlèvements Bernard Philippet 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 RIDOIR Provoque des tensions à bord Lionel Leteur
RIEN Nhabille que les plus belles Marc Aussitot RIEN Nhabille que les plus belles Marc Aussitot
RIEN Ne va plus au casino Chantal de Séréville 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 RIMAILLEUR Cherche ses pieds sur ses doigts Georges Perec
RIME Pour elle le crime est parfait Lionel Leteur RIME Pour elle le crime est parfait Lionel Leteur
RINCE Mouille ou à sec Thierry Larsan 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 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 VOYELLES Ce qui reste quand on a enlevé toutes les consonnes
ANPUTE Il lui manque effectivement une jambe Georges Perec 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 AINE Fin de semaine
IS Sur la Tille IS Sur la Tille
IO Bête à manger du foin 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 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) PPP Connexion point à point (ex : anciens modems, accès internet bas débit)
IPSEC Sécurisation des communications ip par chiffrement 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 nest pas réussi.
TRIAS Choisis ou vieux avec plein de dépôts.

Can't render this file because it contains an unexpected character in line 574 and column 23.

View File

@ -24,9 +24,9 @@ if (($lecteur = fopen("dico.csv", "r")) !== FALSE) {
$definition .= " <small><em>$auteur</em></small>"; $definition .= " <small><em>$auteur</em></small>";
break; break;
} }
$mot = strtoupper($mot); $mot = str_split(strtoupper($mot));
$longueur = strlen($mot); $longueur = count($mot);
if (!isset($dico[$longueur])) $dico[$longueur] = []; if (!isset($dico[$longueur])) $dico[$longueur] = new Trie();
if (!isset($dico[$longueur][$mot])) $dico[$longueur][$mot] = []; if (!isset($dico[$longueur][$mot])) $dico[$longueur][$mot] = [];
if (strlen($definition)) $dico[$longueur][$mot][] = $definition; if (strlen($definition)) $dico[$longueur][$mot][] = $definition;
} }
@ -38,16 +38,14 @@ function tries($longueur_max) {
$_tries = [[]]; $_tries = [[]];
for ($longueur = 1; $longueur <= $longueur_max; $longueur++) { for ($longueur = 1; $longueur <= $longueur_max; $longueur++) {
$_tries[$longueur] = new Trie(); $_tries[$longueur] = $dico[$longueur];
foreach ($dico[$longueur] as $mot => $definition) {
$_tries[$longueur][str_split($mot)] = [];
}
for ($position_espace = MIN_PREMIER_MOT; $position_espace + MIN_MOTS_SUIVANTS < $longueur; $position_espace++) { for ($position_espace = MIN_PREMIER_MOT; $position_espace + MIN_MOTS_SUIVANTS < $longueur; $position_espace++) {
$mots_suivants = $_tries[$longueur - $position_espace - 1]; $mots_suivants = $_tries[$longueur - $position_espace - 1];
foreach ($dico[$position_espace] as $premier_mot => $definition) { 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; return $_tries;
} }

View File

@ -49,7 +49,7 @@ if ($grille_valide) {
for ($y = 0; $y < $hauteur; $y++) { for ($y = 0; $y < $hauteur; $y++) {
$definitions_horizontales[$y] = []; $definitions_horizontales[$y] = [];
foreach ($grille->lignes[$y] as $mot) { foreach ($grille->lignes[$y] as $mot) {
$definitions = $dico[strlen($mot)][$mot]; $definitions = $dico[strlen($mot)][str_split($mot)];
if (count($definitions)) { if (count($definitions)) {
$definitions_horizontales[$y][] = $definitions[mt_rand(0, count($definitions) - 1)]; $definitions_horizontales[$y][] = $definitions[mt_rand(0, count($definitions) - 1)];
} }
@ -59,7 +59,7 @@ if ($grille_valide) {
for ($x = 0 ; $x < $largeur; $x++) { for ($x = 0 ; $x < $largeur; $x++) {
$definitions_verticales[$x] = []; $definitions_verticales[$x] = [];
foreach ($grille->colonnes[$x] as $mot) { foreach ($grille->colonnes[$x] as $mot) {
$definitions = $dico[strlen($mot)][$mot]; $definitions = $dico[strlen($mot)][str_split($mot)];
if (count($definitions)) { if (count($definitions)) {
$definitions_verticales[$x][] = $definitions[mt_rand(0, count($definitions) - 1)]; $definitions_verticales[$x][] = $definitions[mt_rand(0, count($definitions) - 1)];
} }