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;
// Omission des lettres isolées
if ($lettre == CASE_NOIRE
&& ($y - 2 < 0 || $this->grille[$y - 2][$x] == CASE_NOIRE)
&& ($y - 1 < 0 || $x - 1 < 0 || $this->grille[$y - 1][$x - 1] == CASE_NOIRE)
&& ($y - 1 < 0 || $x + 1 >= $this->largeur || $this->grille[$y - 1][$x + 1] == CASE_NOIRE)
) {
continue;
}
if ($lettre == CASE_NOIRE) {
if (($y < 2 || $this->grille[$y - 2][$x] == CASE_NOIRE)
&& ($y < 1 || $x == 0 || $this->grille[$y - 1][$x - 1] == CASE_NOIRE)
&& ($y < 1 || $x + 1 >= $this->largeur || $this->grille[$y - 1][$x + 1] == CASE_NOIRE)
) 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
$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) {
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;
}
} 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
public function count(): int {
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.
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
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
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
@ -1487,7 +1487,7 @@ LOLITA A la fois écolière et maîtresse@Robert Scipion
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
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
LOSER Joueur plus doué pour les échecs que pour les réussites@Jean Teularge
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
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
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
ORAL Procès-verbal@Michel Laclos
ORANGE Souvent pressée dès le réveil@Michel Laclos Réunion de quartier

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

View File

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

View File

@ -1,4 +1,5 @@
<?php
include_once "Grille.php";
@ -55,7 +56,7 @@ function formatter_definition($definition) {
} else {
$auteur = "";
}
return $definition;
return $definition . $nb_mots . $auteur;
}
?>
<!DOCTYPE HTML>
@ -85,6 +86,7 @@ function formatter_definition($definition) {
<body>
<form id="grilleForm" method="get" location=".">
<h1 class="large width">
<a href=".">
<table>
<tbody>
<tr>
@ -110,8 +112,9 @@ function formatter_definition($definition) {
</tr>
</tbody>
</table>
</a>
</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">
<?php if ($grille_valide): ?>
<div class="grille">
@ -133,7 +136,7 @@ function formatter_definition($definition) {
</td>
<?php else: ?>
<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] ?? []))) ?>" />
</td>
<?php endif; ?>

View File

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

View File

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