Compare commits

...

9 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
c3986e70a3 ajustements 2025-08-01 23:57:29 +02:00
e19bb9d2dc ajout d'une définition 2025-07-23 18:10:59 +02:00
7 changed files with 127 additions and 103 deletions

View File

@ -2,15 +2,12 @@
include_once "dico.php";
const ECART_TYPE_ALEA = 5;
const ECART_TYPE = 5;
$randmax = mt_getrandmax() + 1;
function gaussienne($moyenne = 0, $ecartType = 1.0): float {
global $randmax;
$u = 0;
$v = 0;
$u = (mt_rand() + 1) / $randmax;
$v = (mt_rand() + 1) / $randmax;
@ -126,7 +123,7 @@ class Grille implements ArrayAccess
$lettres_colonne->branches
);
foreach ($lettres_communes as $lettre => $_) {
$lettres_communes[$lettre] = count($lettres_ligne->branches[$lettre]) * count($lettres_colonne->branches[$lettre]) * gaussienne(1, ECART_TYPE_ALEA);
$lettres_communes[$lettre] = count($lettres_ligne->branches[$lettre]) * count($lettres_colonne->branches[$lettre]) * gaussienne(1, ECART_TYPE);
}
uksort($lettres_communes, function($a, $b) use ($lettres_communes) {
return $lettres_communes[$b] <=> $lettres_communes[$a];
@ -137,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
@ -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
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
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
COUP DE FOUDRE Ce qui arrive lorsque se rencontrent deux personnes très excitées, mais peu sélectives
COUPE PAPIER Lame pour "les trois mousquetaires"@Thierry Larsan
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
COURAGE Nécouter que le sien@Alain Schifres dans Les Hexagons Art d'avoir peur sans que cela paraisse
@ -1221,7 +1221,7 @@ IDEE Mijote dans une cafetière@Pangloss Vaut mieux en avoir une petite que pas
IDOLATRE A un faible très fort@Chantal de Séréville
IE C'est-à-dire ?
IENA Prit la pâtée avant les lentilles@Yannick Le Nagard Défaite des Prussiens Ville allemande, sur la Saale Son optique est réputée
IF On sen taillait moins facilement quil ne se taille@Georges Perec Lenfer de dantès@Marc Aussitot Château deau@Michel Laclos En mer oui, mais dans aucun cimetière marin@Philippe Harang Arbre toujours vert Accessoire pour égoutter les bouteilles
IF On sen taillait moins facilement quil ne se taille@Georges Perec Lenfer de Dantès@Marc Aussitot Château deau@Michel Laclos En mer oui, mais dans aucun cimetière marin@Philippe Harang Arbre toujours vert Accessoire pour égoutter les bouteilles
IFS Il en faut six pour faire un mythe@Michel Deineko
IGLOO Case blanche@Michel Laclos Rien à voir avec la maison blanche ou la galerie des glaces@Georges Perec
IGMP Protocole de gestion de groupes multicast sur un réseau ip
@ -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
@ -1847,6 +1847,7 @@ OSSUAIRE Tombe à point nommé@Didier Léonard
OST Ancienne troupe au service d'un seigneur
OSTREICULTEUR Ses affaires ne sont pas toujours claires@Michel Vanobost
OTAGE Il est ravi sans l'être@Hervé Hardouin
OTELLO Une tempête dans un Verdi@Willy
OU Prend l'accent pour demander son chemin@Thierry Larsan
OUAIS Un des agréments de la vie de tous les jours@Bernard Philippet
OUED Cours souvent séché@Michel Laclos A souvent des pannes de courant@Michel Laclos Rivière d'Afrique du Nord Cours d'eau temporaire dans les régions arides Son cours n'est pas régulièrement assuré
@ -2157,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
RENTABLES Quand les choses le sont cest quil y a un certain rapport@Georges Perec
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
REPETITION Cest du travail avant de jouer@Michel Laclos
REPLIQUE Double sauf sur scène@Philippe Harang
@ -2559,7 +2560,7 @@ TIRAGE Ranime la flamme ou jette un froid@Lionel Leteur
TIRAILLE Fait comme au sénégal autrefois@Jacques Drillon
TIRE Moyen de voler ou de rouler@Lucien Lacau
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
TISANE Thé doreiller@Notre temps
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
include_once "Trie.php";
@ -45,12 +46,12 @@ function dico($longueur_max) {
function mots_espaces($longueur_max) {
$dico = dico($longueur_max);
for ($longueur = 1; $longueur <= $longueur_max; $longueur++) {
for ($position_espace = 1; $position_espace + 1 < $longueur; $position_espace++) {
for ($longueur = $longueur_max; $longueur >= 2; $longueur--) {
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,11 +1,12 @@
<?php
include_once "Grille.php";
const HAUTEUR_DEFAUT = 7;
const HAUTEUR_DEFAUT = 8;
const HAUTEUR_MIN = 2;
const HAUTEUR_MAX = 10;
const LARGEUR_DEFAUT = 7;
const LARGEUR_DEFAUT = 8;
const LARGEUR_MIN = 2;
const LARGEUR_MAX = 10;
@ -55,7 +56,7 @@ function formatter_definition($definition) {
} else {
$auteur = "";
}
return $definition;
return $definition . $nb_mots . $auteur;
}
?>
<!DOCTYPE HTML>
@ -85,33 +86,35 @@ function formatter_definition($definition) {
<body>
<form id="grilleForm" method="get" location=".">
<h1 class="large width">
<table>
<tbody>
<tr>
<td colspan="2"></td>
<td>M</td>
</tr>
<tr>
<td>c</td>
<td>r</td>
<td>o</td>
<td>i</td>
<td>s</td>
<td>é</td>
<td>s</td>
</tr>
<tr>
<td colspan="2"></td>
<td>t</td>
</tr>
<tr>
<td colspan="2"></td>
<td>s</td>
</tr>
</tbody>
</table>
<a href=".">
<table>
<tbody>
<tr>
<td colspan="2"></td>
<td>M</td>
</tr>
<tr>
<td>c</td>
<td>r</td>
<td>o</td>
<td>i</td>
<td>s</td>
<td>é</td>
<td>s</td>
</tr>
<tr>
<td colspan="2"></td>
<td>t</td>
</tr>
<tr>
<td colspan="2"></td>
<td>s</td>
</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; ?>
@ -152,9 +155,9 @@ function formatter_definition($definition) {
<?= formatter_definition($definitions[0]) ?>
<?php else: ?>
<ol>
<?php foreach ($definitions as $definition) : ?>
<li><?= formatter_definition($definition) ?></li>
<?php endforeach ?>
<?php foreach ($definitions as $definition) : ?>
<li><?= formatter_definition($definition) ?></li>
<?php endforeach ?>
</ol>
<?php endif ?>
<?php endif ?>

View File

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