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
$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;
}

View File

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

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 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 daller 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 Nhabille 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 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>";
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,14 +38,12 @@ 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;
}
}
}

View File

@ -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)];
}