Compare commits

...

7 Commits

Author SHA1 Message Date
e754e6e44b ommission des lettres isolées sur la dernière ligne 2025-08-22 13:09:00 +02:00
8287699a4b méthodes magiques 2025-08-22 11:04:42 +02:00
d3b11df015 méthodes magiques 2025-08-22 10:56:06 +02:00
6635adf26a la navigation au clavier saute les cases noires 2025-08-19 17:57:02 +02:00
c2e4b8ae53 plus rapide 2025-08-19 16:54:06 +02:00
5aa5da8c53 correction formattage définitions 2025-08-19 16:53:49 +02:00
d862dc572d corrections 2025-08-19 16:48:52 +02:00
7 changed files with 120 additions and 94 deletions

View File

@ -134,13 +134,19 @@ class Grille implements ArrayAccess
$this->grille[$y][$x] = $lettre; $this->grille[$y][$x] = $lettre;
// Omission des lettres isolées // Omission des lettres isolées
if ($lettre == CASE_NOIRE if ($lettre == CASE_NOIRE) {
&& ($y - 2 < 0 || $this->grille[$y - 2][$x] == CASE_NOIRE) if (($y < 2 || $this->grille[$y - 2][$x] == CASE_NOIRE)
&& ($y - 1 < 0 || $x - 1 < 0 || $this->grille[$y - 1][$x - 1] == CASE_NOIRE) && ($y < 1 || $x == 0 || $this->grille[$y - 1][$x - 1] == CASE_NOIRE)
&& ($y - 1 < 0 || $x + 1 >= $this->largeur || $this->grille[$y - 1][$x + 1] == CASE_NOIRE) && ($y < 1 || $x + 1 >= $this->largeur || $this->grille[$y - 1][$x + 1] == CASE_NOIRE)
) { ) continue;
continue; if ($y == $this->hauteur - 1
} && ($x < 2 || $this[$y][$x - 2] == CASE_NOIRE)
&& ($x < 1 || $this[$y - 1][$x - 1] == CASE_NOIRE)
) continue;
} else if ($x == $this->largeur - 1 && $y == $this->hauteur - 1
&& $this[$y][$x - 1] == CASE_NOIRE
&& $this[$y-1][$x] == CASE_NOIRE
) continue;
// Omission des doublons // Omission des doublons
$mots = []; $mots = [];

View File

@ -52,10 +52,40 @@ class Trie implements ArrayAccess, IteratorAggregate, Countable {
} }
} }
public function arrayIterator() { // ArrayAccess
public function offsetSet($array, $valeur): void {
if (is_string($array)) {
$array = str_split($array);
}
$this->arraySet($array, $valeur);
}
public function offsetExists($array): bool {
if (is_string($array)) {
$array = str_split($array);
}
return $this->arrayExists($array);
}
public function &offsetGet($array): mixed {
if (is_string($array)) {
$array = str_split($array);
}
return $this->arrayGet($array);
}
public function offsetUnset($array): void {
if (is_string($array)) {
$array = str_split($array);
}
$this->arrayUnset($array);
}
// IteratorAggregate
public function getIterator(): Traversable {
foreach ($this->branches as $cle => $branche) { foreach ($this->branches as $cle => $branche) {
if ($branche instanceof Trie) { if ($branche instanceof Trie) {
foreach($branche->arrayIterator() as $sous_cles => $feuille) { foreach($branche->getIterator() as $sous_cles => $feuille) {
yield array_merge([$cle], $sous_cles) => $feuille; yield array_merge([$cle], $sous_cles) => $feuille;
} }
} else { } else {
@ -64,30 +94,6 @@ class Trie implements ArrayAccess, IteratorAggregate, Countable {
} }
} }
// ArrayAccess
public function offsetSet($string, $valeur): void {
$this->arraySet(str_split($string), $valeur);
}
public function offsetExists($string): bool {
return $this->arrayExists(str_split($string));
}
public function &offsetGet($string): mixed {
return $this->arrayGet(str_split($string));
}
public function offsetUnset($string): void {
$this->arrayUnset(str_split($string));
}
// IteratorAggregate
public function getIterator(): Traversable {
foreach($this->arrayIterator() as $array => $valeur) {
yield implode("", $array) => $valeur;
}
}
// Countable // Countable
public function count(): int { public function count(): int {
return $this->nb_branches; return $this->nb_branches;

View File

@ -538,7 +538,7 @@ COCU Victime des rapports dune moitié avec un tiers@LExpress Homme qui a
COEUR Siège de la passion chez les femmes. Ceci montre bien le respect des règles de l'adaptation dans l'évolution féminine, la femme n'ayant, on le sait, ni queue ni tête. COEUR Siège de la passion chez les femmes. Ceci montre bien le respect des règles de l'adaptation dans l'évolution féminine, la femme n'ayant, on le sait, ni queue ni tête.
COI Coït interrompu@Sport Cérébral Silencieux et tranquille COI Coït interrompu@Sport Cérébral Silencieux et tranquille
COIN Se bouche en soufflant@Michel Laclos Petit avec des lunettes@Bernard Philippet Lieu de pas sage@Michel Vanobost COIN Se bouche en soufflant@Michel Laclos Petit avec des lunettes@Bernard Philippet Lieu de pas sage@Michel Vanobost
COLLABORATION Plus profitable à erckmann- chatrian quà drieu la rochelle@Robert Scipion COLLABORATION Plus profitable à Erckmann-Chatrian quà Drieu la Rochelle@Robert Scipion
COMA Dépassé sans s'en rendre compte@Jean Teularge COMA Dépassé sans s'en rendre compte@Jean Teularge
COMBATTANT Parfois en retraite avant dêtre en retraite@Marc Aussitot COMBATTANT Parfois en retraite avant dêtre en retraite@Marc Aussitot
COMEDIE Le métier du politicien, la science du médecin, le savoir des critiques, la religion des prédicateurs à sensation, en un mot le monde@Ambrose Bierce COMEDIE Le métier du politicien, la science du médecin, le savoir des critiques, la religion des prédicateurs à sensation, en un mot le monde@Ambrose Bierce
@ -579,8 +579,8 @@ COTON Devient souvent mauvais quand on le file@Michel Laclos
COU S'y pendre est plus sympa que d'y mettre la corde@Thierry Larsan COU S'y pendre est plus sympa que d'y mettre la corde@Thierry Larsan
COUCHETTE Vous permet, en somme, dêtre en train@Georges Perec Grâce à elle on peut être en train couenne@Tour de cochon COUCHETTE Vous permet, en somme, dêtre en train@Georges Perec Grâce à elle on peut être en train couenne@Tour de cochon
COULANT Saccorde à nœud@Lionel Leteur COULANT Saccorde à nœud@Lionel Leteur
COUP DE FOUDRE Ce qui arrive lorsque se rencontrent deux personnes très excitées, mais peu sélectives COUP DE FOUDRE Ce qui arrive lorsque se rencontrent deux personnes très excitées, mais peu sélectives
COUPEPAPIER Lame pour "les trois mousquetaires"@Thierry Larsan COUPE PAPIER Lame pour "les trois mousquetaires"@Thierry Larsan
COUPEROSE Ne désigne absolument pas une espèce de sécateur@Georges Perec COUPEROSE Ne désigne absolument pas une espèce de sécateur@Georges Perec
COUR Plat agréable à faire@Michel Laclos S'annonce aux messieurs, se fait aux dames@Bernard Philippet COUR Plat agréable à faire@Michel Laclos S'annonce aux messieurs, se fait aux dames@Bernard Philippet
COURAGE Nécouter que le sien@Alain Schifres dans Les Hexagons Art d'avoir peur sans que cela paraisse COURAGE Nécouter que le sien@Alain Schifres dans Les Hexagons Art d'avoir peur sans que cela paraisse
@ -1487,7 +1487,7 @@ LOLITA A la fois écolière et maîtresse@Robert Scipion
LONGER Raser sans rasoir@Jean-Marie Lamy LONGER Raser sans rasoir@Jean-Marie Lamy
LONGEVITE Prolongation inconfortable de la peur de la mort@Ambrose Bierce prolongation peu commune de la crainte de la mort@Ambrose Bierce LONGEVITE Prolongation inconfortable de la peur de la mort@Ambrose Bierce prolongation peu commune de la crainte de la mort@Ambrose Bierce
LOQUACITE Affection qui redouble chez le malade incapable de refréner sa langue quand vous souhaitez prendre la parole@Ambrose Bierce LOQUACITE Affection qui redouble chez le malade incapable de refréner sa langue quand vous souhaitez prendre la parole@Ambrose Bierce
LORELEI Elle bouleversait par l'oreille, étant elle- même une oreille bouleversée@Jacques Drillon LORELEI Elle bouleversait par l'oreille, étant ellemême une oreille bouleversée@Jacques Drillon
LOSANGE Na aucun droit@Georges Perec LOSANGE Na aucun droit@Georges Perec
LOSER Joueur plus doué pour les échecs que pour les réussites@Jean Teularge LOSER Joueur plus doué pour les échecs que pour les réussites@Jean Teularge
LOT Peut être doublement liquide@Georges Perec LOT Peut être doublement liquide@Georges Perec
@ -1807,7 +1807,7 @@ OPPOSITION En politique, le parti qui empêche le gouvernement d'aller battre la
OPTICIEN Deux verres chez lui pour éviter les dégâts@Philippe Dupuis OPTICIEN Deux verres chez lui pour éviter les dégâts@Philippe Dupuis
OPTIMISTE Adepte de la doctrine selon laquelle le noir est blanc@Ambrose Bierce Personne qui commence à faire ses mots croisés au stylo-bille OPTIMISTE Adepte de la doctrine selon laquelle le noir est blanc@Ambrose Bierce Personne qui commence à faire ses mots croisés au stylo-bille
OPULENTES Avec avantages en nature ou en espèces@Corinne Beltz OPULENTES Avec avantages en nature ou en espèces@Corinne Beltz
OR Son pont nous permet de rouler dessus@Georges Perec Matière pour un livre mais plus pour une livre@Robert Scipion A été veau avant dêtre étalon@Dédale Brillante conjonction@Michel Laclos Pour un bridge ou un pont@Philippe Dupuis Prix fort@Philippe Harang Massif apprécié@Lucien Lacau Une eau s'en régale@Guy Hachette Plut à danaé@Thierry Larsan Le massif des écrins@Bernard Philippet Précieuse conjonction OR Son pont nous permet de rouler dessus@Georges Perec Matière pour un livre mais plus pour une livre@Robert Scipion A été veau avant dêtre étalon@Dédale Brillante conjonction@Michel Laclos Pour un bridge ou un pont@Philippe Dupuis Prix fort@Philippe Harang Massif apprécié@Lucien Lacau Une eau s'en régale@Guy Hachette Plut à Danaé@Thierry Larsan Le massif des écrins@Bernard Philippet Précieuse conjonction
ORACLE Il se mouille parfois mais ne sèche jamais@Bernard Philippet ORACLE Il se mouille parfois mais ne sèche jamais@Bernard Philippet
ORAL Procès-verbal@Michel Laclos ORAL Procès-verbal@Michel Laclos
ORANGE Souvent pressée dès le réveil@Michel Laclos Réunion de quartier ORANGE Souvent pressée dès le réveil@Michel Laclos Réunion de quartier
@ -2158,7 +2158,7 @@ RENGAINE Un air qui commence par vous entrer par une oreille et qui finit par vo
RENI Guide pour amateur dart@Corinne Beltz RENI Guide pour amateur dart@Corinne Beltz
RENTABLES Quand les choses le sont cest quil y a un certain rapport@Georges Perec RENTABLES Quand les choses le sont cest quil y a un certain rapport@Georges Perec
RENTREE Revenue ou revenu@Michel Laclos RENTREE Revenue ou revenu@Michel Laclos
REPAS Cest après lavoir saut é quon se sent léger@Paul Roisin REPAS Cest après lavoir sauté quon se sent léger@Paul Roisin
REPASSEUSE Dame de fer@Michel Deineko REPASSEUSE Dame de fer@Michel Deineko
REPETITION Cest du travail avant de jouer@Michel Laclos REPETITION Cest du travail avant de jouer@Michel Laclos
REPLIQUE Double sauf sur scène@Philippe Harang REPLIQUE Double sauf sur scène@Philippe Harang
@ -2560,7 +2560,7 @@ TIRAGE Ranime la flamme ou jette un froid@Lionel Leteur
TIRAILLE Fait comme au sénégal autrefois@Jacques Drillon TIRAILLE Fait comme au sénégal autrefois@Jacques Drillon
TIRE Moyen de voler ou de rouler@Lucien Lacau TIRE Moyen de voler ou de rouler@Lucien Lacau
TIREBOUCHON A défloré bien des fillettes (2 mots) TIREBOUCHON A défloré bien des fillettes (2 mots)
TIRET Unit ou sépare@Jean Teularge Trait de pince-sans-rire@Pangloss Il y en a un au sous-sol et deux au rez-de- chaussée@Michel Laclos Partage le casse-croûte TIRET Unit ou sépare@Jean Teularge Trait de pince-sans-rire@Pangloss Il y en a un au sous-sol et deux au rez-de-chaussée@Michel Laclos Partage le casse-croûte
TIREUR Peu loyal quand il est franc@Dédale TIREUR Peu loyal quand il est franc@Dédale
TISANE Thé doreiller@Notre temps TISANE Thé doreiller@Notre temps
TISSUS Ne sont pas imprimés pour être lus@Hervé Hardouin TISSUS Ne sont pas imprimés pour être lus@Hervé Hardouin

Can't render this file because it has a wrong number of fields in line 12.

View File

@ -1,4 +1,5 @@
<?php <?php
include_once "Trie.php"; include_once "Trie.php";
@ -46,11 +47,11 @@ function dico($longueur_max) {
function mots_espaces($longueur_max) { function mots_espaces($longueur_max) {
$dico = dico($longueur_max); $dico = dico($longueur_max);
for ($longueur = $longueur_max; $longueur >= 2; $longueur--) { for ($longueur = $longueur_max; $longueur >= 2; $longueur--) {
for ($position_espace = $longueur - 2; $position_espace >= 1; $position_espace--) { for ($position_espace = $longueur - 1; $position_espace >= 1; $position_espace--) {
$mots_suivants = $dico[$longueur - $position_espace - 1]; $mots_suivants = $dico[$longueur - $position_espace - 1];
foreach ($dico[$position_espace]->arrayIterator() as $premier_mot => $definition) { foreach ($dico[$position_espace] as $premier_mot => $definition) {
$premier_mot[] = CASE_NOIRE; $premier_mot[] = CASE_NOIRE;
$dico[$longueur]->arraySet($premier_mot, $mots_suivants); $dico[$longueur][$premier_mot] = $mots_suivants;
} }
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
include_once "Grille.php"; include_once "Grille.php";
@ -55,7 +56,7 @@ function formatter_definition($definition) {
} else { } else {
$auteur = ""; $auteur = "";
} }
return $definition; return $definition . $nb_mots . $auteur;
} }
?> ?>
<!DOCTYPE HTML> <!DOCTYPE HTML>
@ -85,33 +86,35 @@ function formatter_definition($definition) {
<body> <body>
<form id="grilleForm" method="get" location="."> <form id="grilleForm" method="get" location=".">
<h1 class="large width"> <h1 class="large width">
<table> <a href=".">
<tbody> <table>
<tr> <tbody>
<td colspan="2"></td> <tr>
<td>M</td> <td colspan="2"></td>
</tr> <td>M</td>
<tr> </tr>
<td>c</td> <tr>
<td>r</td> <td>c</td>
<td>o</td> <td>r</td>
<td>i</td> <td>o</td>
<td>s</td> <td>i</td>
<td>é</td> <td>s</td>
<td>s</td> <td>é</td>
</tr> <td>s</td>
<tr> </tr>
<td colspan="2"></td> <tr>
<td>t</td> <td colspan="2"></td>
</tr> <td>t</td>
<tr> </tr>
<td colspan="2"></td> <tr>
<td>s</td> <td colspan="2"></td>
</tr> <td>s</td>
</tbody> </tr>
</table> </tbody>
</table>
</a>
</h1> </h1>
<h1 class="small width">Mots■croisés</h1> <h1 class="small width"><a href=".">Mots■croisés</a></h1>
<div class="grille-et-definitions"> <div class="grille-et-definitions">
<?php if ($grille_valide): ?> <?php if ($grille_valide): ?>
<div class="grille"> <div class="grille">
@ -133,7 +136,7 @@ function formatter_definition($definition) {
</td> </td>
<?php else: ?> <?php else: ?>
<td class="case blanche"> <td class="case blanche">
<input id="<?= chr($x + 65) . ($y + 1) ?>" type="text" maxlength="1" size="1" pattern="[A-Z]" placeholder="<?= $grille[$y][$x] ?>" <input id="<?= chr($x + 65) . ($y + 1) ?>" type="text" maxlength="1" size="1" pattern="[A-Z]"
title="<?= strip_tags("→ " . implode("\n→ ", array_map("formatter_definition", $grille->definitions["horizontales"][$y] ?? [])) . "\n↓ " . implode("\n↓ ", array_map("formatter_definition", $grille->definitions["verticales"][$x] ?? []))) ?>" /> title="<?= strip_tags("→ " . implode("\n→ ", array_map("formatter_definition", $grille->definitions["horizontales"][$y] ?? [])) . "\n↓ " . implode("\n↓ ", array_map("formatter_definition", $grille->definitions["verticales"][$x] ?? []))) ?>" />
</td> </td>
<?php endif; ?> <?php endif; ?>
@ -152,9 +155,9 @@ function formatter_definition($definition) {
<?= formatter_definition($definitions[0]) ?> <?= formatter_definition($definitions[0]) ?>
<?php else: ?> <?php else: ?>
<ol> <ol>
<?php foreach ($definitions as $definition) : ?> <?php foreach ($definitions as $definition) : ?>
<li><?= formatter_definition($definition) ?></li> <li><?= formatter_definition($definition) ?></li>
<?php endforeach ?> <?php endforeach ?>
</ol> </ol>
<?php endif ?> <?php endif ?>
<?php endif ?> <?php endif ?>

View File

@ -35,26 +35,28 @@ for (let input of inputs) {
}; };
input.onkeydown = function (event) { input.onkeydown = function (event) {
next_input = null; next_input = input;
switch (event.key) { do {
case "ArrowUp": switch (event.key) {
next_input = inputs[(input.index - largeur + nb_cases) % nb_cases]; case "ArrowUp":
break; next_input = inputs[(next_input.index - largeur + nb_cases) % nb_cases];
case "ArrowDown": break;
next_input = inputs[(input.index + largeur) % nb_cases]; case "ArrowDown":
break; next_input = inputs[(next_input.index + largeur) % nb_cases];
case "ArrowLeft": break;
next_input = inputs[(input.index - 1 + nb_cases) % nb_cases]; case "ArrowLeft":
break; next_input = inputs[(next_input.index - 1 + nb_cases) % nb_cases];
case "ArrowRight": break;
next_input = inputs[(input.index + 1) % nb_cases]; case "ArrowRight":
break; next_input = inputs[(next_input.index + 1) % nb_cases];
} break;
if (next_input) { default:
next_input.focus(); return;
next_input.select(); }
event.preventDefault(); } while (next_input.disabled)
} event.preventDefault();
next_input.focus();
next_input.select();
}; };
input.oninput = function (event) { input.oninput = function (event) {

View File

@ -18,6 +18,12 @@ h1 {
letter-spacing: 0.2em; letter-spacing: 0.2em;
} }
h1 a {
width: 100%;
text-decoration: none;
color: inherit;
}
h1.large.width { h1.large.width {
display: inherit; display: inherit;
padding-top: 1rem; padding-top: 1rem;
@ -199,6 +205,7 @@ h2 {
text-decoration: underline; text-decoration: underline;
} }
h1 a:hover,
.nouvelle-grille button:hover { .nouvelle-grille button:hover {
color: #2a6496; color: #2a6496;
} }
@ -315,6 +322,7 @@ h2 {
background-color: #edeeee; background-color: #edeeee;
} }
h1 a:hover,
.nouvelle-grille button:hover { .nouvelle-grille button:hover {
color: #479fec; color: #479fec;
} }