| Across | Down |
|---|---|
| Clue | Copy |
|---|---|
Generate a grid to populate across clues.
| Clue | Copy |
|---|---|
Generate a grid to populate down clues.
| Fill density | {{ gridStats.fillPercent }} % |
|---|---|
| Letters placed | {{ gridStats.letterCells }} / {{ gridStats.totalCells }} |
| Crossing cells | {{ gridStats.crossingCells }} ({{ gridStats.crossingRate }} %) |
| Words placed | {{ gridStats.totalWords }} of {{ gridStats.totalEntries }} |
| Average word length | {{ gridStats.averageWordLength }} |
| Longest entry | {{ gridStats.longestWord || '—' }} ({{ gridStats.longestWordLength }}) |
| Shortest entry | {{ gridStats.shortestWord || '—' }} ({{ gridStats.shortestWordLength }}) |
| Symmetry match | {{ gridStats.symmetry.percent }} % ({{ gridStats.symmetry.label }}) |
| Unused entries | {{ unusedCount }} |
| Runtime | {{ gridStats.totalRuntimeMs }} ms total (best {{ gridStats.bestAttemptMs }} ms) |
| Best seed | {{ gridStats.bestSeed || 'default' }} |
Run the generator to populate metrics.
| # | Seed | Placed | Fill % | Time (ms) | Note |
|---|---|---|---|---|---|
| {{ run.attempt }} | {{ run.seed || 'default' }} | {{ run.placed }} | {{ run.fillPercent }} | {{ run.genMs }} | {{ run.note || '—' }} |
No attempt data yet.
| Word | Clue | Length | Copy |
|---|---|---|---|
| {{ entry.word }} | {{ entry.clue || '—' }} | {{ entry.word.length }} |
Every entry was placed in the grid.
Crossword puzzles interlock themed answers across and down so solvers uncover a grid one intersection at a time. Educators, trivia hosts, and content teams rely on the format to reinforce vocabulary while keeping difficulty approachable.
This generator assembles your word list into a numbered grid and runs a best-of shuffle across multiple attempts to surface the densest fill. Live diagnostics flag duplicates or malformed lines before the search begins, so you only test clean data.
After each run the stats tab reports fill density, crossing balance, and unused entries, making it easy to tune constraints and export polished puzzles, clue tables, DOCX packets, or printable PDFs.
Every attempt starts from the same sorted word bank, seeded by your optional text to deliver reproducible shuffles. Backtracking spends a configurable time budget exploring placements, while the greedy pass resolves quickly for shorter lists. The best-of loop repeats the search the number of times you choose and retains the grid with the highest fill density, largest placed word count, and—in the event of a tie—the fastest runtime.
Metrics emphasise how efficiently letters occupy the grid and how often entries cross. Symmetry options bias scoring toward rotational or mirror layouts without blocking viable asymmetric fills. Unused items stay visible so you can decide whether to enlarge the grid, relax minimum word length, or replace short fragments with sturdier anchors.
| Symbol | Meaning | Unit / Type | Source |
|---|---|---|---|
| N | Grid side length | integer (cells) | Input |
| F | Letter cells filled | integer (cells) | Derived |
| P | Fill percentage | percentage, one decimal | Derived |
| C | Cells that host both across and down answers | integer (cells) | Derived |
| R | Crossing rate (share of letters that intersect) | percentage, one decimal | Derived |
| U | Unused entries after the best attempt | count | Derived |
| T | Total runtime across best-of attempts | milliseconds | Derived |
Interpret higher P and R values as denser, fairer puzzles. When U climbs, try increasing grid size, relaxing minimum word length, or raising the attempt count so more shuffles search the space before the time budget expires.
The tool runs the generator the number of times you request, tracking fill percentage, placed word count, and runtime. The attempt with the strongest score becomes the active grid, while all run details remain in the log.
Yes, as long as grid size, strategy, minimum word length, symmetry, time budget, and attempt count stay the same. Change any of those parameters and the shuffle will diverge even with identical seeds.
Aim for a high crossing rate and moderate unused count. Increase minimum word length to avoid short entries, adjust symmetry to suit your theme, and add longer anchors when the stats reveal sparse regions.
Words only appear if they were placed in the winning attempt. Check the unused list, raise the time budget or attempt count, or expand the grid so the search has space to fit more entries.