Compare commits

...

4 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
7 changed files with 115 additions and 89 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

@ -580,7 +580,7 @@ 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
@ -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

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";
@ -48,9 +49,9 @@ function mots_espaces($longueur_max) {
for ($longueur = $longueur_max; $longueur >= 2; $longueur--) { for ($longueur = $longueur_max; $longueur >= 2; $longueur--) {
for ($position_espace = $longueur - 1; $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";
@ -85,6 +86,7 @@ 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">
<a href=".">
<table> <table>
<tbody> <tbody>
<tr> <tr>
@ -110,8 +112,9 @@ function formatter_definition($definition) {
</tr> </tr>
</tbody> </tbody>
</table> </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; ?>

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;
do {
switch (event.key) { switch (event.key) {
case "ArrowUp": case "ArrowUp":
next_input = inputs[(input.index - largeur + nb_cases) % nb_cases]; next_input = inputs[(next_input.index - largeur + nb_cases) % nb_cases];
break; break;
case "ArrowDown": case "ArrowDown":
next_input = inputs[(input.index + largeur) % nb_cases]; next_input = inputs[(next_input.index + largeur) % nb_cases];
break; break;
case "ArrowLeft": case "ArrowLeft":
next_input = inputs[(input.index - 1 + nb_cases) % nb_cases]; next_input = inputs[(next_input.index - 1 + nb_cases) % nb_cases];
break; break;
case "ArrowRight": case "ArrowRight":
next_input = inputs[(input.index + 1) % nb_cases]; next_input = inputs[(next_input.index + 1) % nb_cases];
break; break;
default:
return;
} }
if (next_input) { } while (next_input.disabled)
event.preventDefault();
next_input.focus(); next_input.focus();
next_input.select(); next_input.select();
event.preventDefault();
}
}; };
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;
} }