The classic Jumble gives you four scrambled words, a cartoon, and a final answer built from the circled letters of your solutions. This solver is shaped exactly like that puzzle: four boxes for the four jumbles, one box for the circled letters, and every answer in a single press. Each jumble is solved with perfect anagrams — words that use every letter — because that is how Jumble answers always work. You can use this Jumble Solver free on IlmHunt — no sign-up needed, and it runs entirely in your browser.
How the Jumble Solver works
For each jumbled word, the solver searches our 359,039-word list for perfect anagrams: words whose letters match the jumble exactly, count for count. Real Jumble puzzles are constructed so each scramble has at least one — usually exactly one everyday answer, though common letter sets can have several. The bonus box runs the same search on your circled letters. If a field has no perfect anagram, the solver says so and shows the best shorter words those letters can make instead — which is the fastest way to spot a mistyped letter, since a single wrong letter kills every perfect anagram. Scores next to each word are Scrabble tile values, a habit from our other tools that puzzle players find handy for spotting the “real” word among rare ones: everyday answers usually score plainly.
How to use it
Copy each scrambled word into its own box — order within the word does not matter. Leave unused boxes empty; the solver skips them. Solve your four words first and note which letters land in circled squares, then type those circled letters into the bonus box and solve again (or fill everything in and press once). If a jumble shows several answers, the cartoon and the circled-letter pattern will tell you which one the puzzle wants: pick the answer whose circled letters give the bonus a workable set.
A worked example
Three real jumbles, three kinds of result. LITSEN explodes: enlist, inlets, listen, silent, tinsel — plus slinte, an obscure Scots word our broad list includes; the puzzle’s answer is one of the five everyday words, and the circled letters decide which. GARDNE gives five: danger, gander, garden, grande and ranged. OLBALNO is the satisfying kind — exactly one answer, balloon. And the bonus mechanic in miniature: circled letters TCA unscramble to act or cat, and only the cartoon clue can separate them.
When a jumble has several answers
New players panic when a scramble returns five words, but that is normal for friendly letter sets — six common letters often rearrange many ways. The puzzle still has one intended answer, and three signals identify it. First, the circled squares: the intended word places letters so the bonus can be solved, so test each candidate’s circled letters in the bonus box. Second, the cartoon: the caption’s joke almost always leans on the final answer, which leans on all four words. Third, frequency: puzzle setters choose everyday vocabulary, so prefer the word a crossword would use over the one only a dictionary loves. Our list is broader than a setter’s vocabulary, which is why the extras appear — they are a feature for word-game players, a small tax for Jumble players, and the three signals above remove it.
Limitations worth knowing
The solver handles words up to 15 letters and cannot solve the cartoon clue for you — the final answer’s wordplay (puns, homophones) is yours to enjoy. It works one puzzle at a time and assumes the standard Jumble format; variants that add or remove letters between the jumbles and the bonus will confuse the bonus box. Rare-word extras come from our deliberately broad word list.
Jumble Solver – frequently asked questions
Why does my jumble show more than one answer?
Because several real words share those letters. The puzzle intends one of them — use the circled letters and the cartoon to pick, as the worked example shows.
What if a jumble shows no answer at all?
Almost always a copying slip: one letter typed wrong removes every perfect anagram. The solver shows the best shorter words instead, which usually reveals the typo at a glance.
How does the bonus box work?
As you solve each jumble, some squares are circled in the printed puzzle. Collect those letters from your answers, type them into the bonus box, and the solver unscrambles them into the final answer candidates.
Is this only for the newspaper Jumble?
It fits any unscramble puzzle with whole-word answers — classroom worksheets, puzzle books and app versions of the same format.
More word tools
Keep playing: Word Finder & Word Tools hub, Word Unscrambler, Anagram Solver and Word Descrambler — all free, all running on the same 359,039-word list.
Embed this tool on your website — free
Copy the code below and paste it into your page to add this working tool to your own site. A small credit link stays with it — that is all we ask.
var ILM_SCRABBLE = {a:1,b:3,c:3,d:2,e:1,f:4,g:2,h:4,i:1,j:8,k:5,l:1,m:3,n:1,o:1,p:3,q:10,r:1,s:1,t:1,u:1,v:4,w:4,x:8,y:4,z:10};
var ILM_WWF = {a:1,b:4,c:4,d:2,e:1,f:4,g:3,h:3,i:1,j:10,k:5,l:2,m:4,n:2,o:1,p:4,q:10,r:1,s:1,t:1,u:2,v:5,w:6,x:8,y:3,z:10};
function ilmCountLetters(str) {
var counts = {};
for (var i = 0; i < str.length; i++) { var c = str[i]; counts[c] = (counts[c] || 0) + 1; }
return counts;
}
function ilmScoreWith(word, rackCounts, wild, VAL) {
// Score of word built from rack letters; letters covered by wildcards score 0.
// Returns -1 when the word cannot be built.
var need = ilmCountLetters(word), score = 0, deficit = 0;
for (var L in need) {
var have = rackCounts[L] || 0;
if (need[L] <= have) { score += VAL[L] * need[L]; }
else { deficit += need[L] – have; score += VAL[L] * have; if (deficit > wild) return -1; }
}
return score;
}
// Every word buildable from the rack (letters + ? or * wildcards).
// Sorted by length desc, then score desc, then A-Z. [{w, s}]
function ilmRack(rack, words, VAL) {
rack = (rack || '').toLowerCase();
var wild = 0, counts = {}, total = 0;
for (var i = 0; i < rack.length; i++) {
var ch = rack[i];
if (ch === '?' || ch === '*') { wild++; total++; }
else if (ch >= 'a' && ch <= 'z') { counts[ch] = (counts[ch] || 0) + 1; total++; }
}
var out = [];
for (var j = 0; j < words.length; j++) {
var w = words[j];
if (w.length < 2 || w.length > total) continue;
var s = ilmScoreWith(w, counts, wild, VAL);
if (s >= 0) out.push({ w: w, s: s });
}
out.sort(function (a, b) {
return b.w.length – a.w.length || b.s – a.s || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0);
});
return out;
}
// Words using every letter of `letters` exactly (perfect anagrams).
// Sorted by score desc, then A-Z. [{w, s}]
function ilmExactAnagrams(letters, words, VAL) {
letters = (letters || '').toLowerCase().replace(/[^a-z]/g, '');
var target = letters.split('').sort().join(''), out = [];
for (var j = 0; j < words.length; j++) {
var w = words[j];
if (w.length !== letters.length) continue;
if (w.split('').sort().join('') === target) {
var s = 0;
for (var k = 0; k < w.length; k++) s += VAL[w[k]];
out.push({ w: w, s: s });
}
}
out.sort(function (a, b) { return b.s – a.s || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0); });
return out;
}
// Wordle/Quordle constraint filter over 5-letter words.
// green: array of 5 — letter fixed at that position, '' when unknown.
// yellow: array of 5 — letter is in the word but NOT at that position, '' when none.
// grey: string of excluded letters. A grey letter that is also confirmed
// (green/yellow) caps that letter's count at the confirmed count.
// Returns matching words in A-Z order.
function ilmWordleFilter(fiveWords, green, yellow, grey) {
var confirmed = {}, i, L;
for (i = 0; i < 5; i++) {
if (green[i]) confirmed[green[i]] = (confirmed[green[i]] || 0) + 1;
if (yellow[i]) confirmed[yellow[i]] = (confirmed[yellow[i]] || 0) + 1;
}
var greySet = {};
grey = (grey || '').toLowerCase();
for (i = 0; i < grey.length; i++) { if (grey[i] >= 'a' && grey[i] <= 'z') greySet[grey[i]] = true; }
var out = [];
for (var j = 0; j < fiveWords.length; j++) {
var w = fiveWords[j], ok = true;
for (i = 0; i < 5; i++) {
if (green[i] && w[i] !== green[i]) { ok = false; break; }
if (yellow[i] && w[i] === yellow[i]) { ok = false; break; }
}
if (!ok) continue;
var wc = ilmCountLetters(w);
for (L in confirmed) { if ((wc[L] || 0) < confirmed[L]) { ok = false; break; } }
if (!ok) continue;
for (L in greySet) {
if (confirmed[L]) { if ((wc[L] || 0) !== confirmed[L]) { ok = false; break; } }
else if (wc[L]) { ok = false; break; }
}
if (ok) out.push(w);
}
return out;
}
// Rack results narrowed by optional starts-with / ends-with / contains filters,
// re-sorted by score desc, then length desc, then A-Z. [{w, s}]
function ilmRackFiltered(rack, words, VAL, opts) {
opts = opts || {};
var starts = (opts.starts || '').toLowerCase(), ends = (opts.ends || '').toLowerCase(),
contains = (opts.contains || '').toLowerCase();
var res = ilmRack(rack, words, VAL).filter(function (x) {
if (starts && x.w.indexOf(starts) !== 0) return false;
if (ends && x.w.slice(x.w.length – ends.length) !== ends) return false;
if (contains && x.w.indexOf(contains) === -1) return false;
return true;
});
res.sort(function (a, b) {
return b.s – a.s || b.w.length – a.w.length || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0);
});
return res;
}
if (typeof module !== 'undefined') {
module.exports = { ILM_SCRABBLE: ILM_SCRABBLE, ILM_WWF: ILM_WWF, ilmRack: ilmRack,
ilmExactAnagrams: ilmExactAnagrams, ilmWordleFilter: ilmWordleFilter,
ilmRackFiltered: ilmRackFiltered, ilmScoreWith: ilmScoreWith, ilmCountLetters: ilmCountLetters };
}
var WORDLIST_URL = 'https://ilmhunt.com/wp-content/uploads/2026/10/wordlist.txt';
var FRAME_ID = 5215;
var WORDS = null, PENDING = [];
function sendH(){ try { parent.postMessage({wpcId: FRAME_ID, wpcH: document.body.scrollHeight + 16}, '*'); } catch (e) {} }
window.addEventListener('load', sendH);
function st(msg){ document.getElementById('status').textContent = msg; }
function ensureWords(cb){
if (WORDS) { cb(); return; }
PENDING.push(cb);
if (PENDING.length > 1) return;
st('Loading the word list (359,039 words)…');
fetch(WORDLIST_URL).then(function(r){ return r.text(); }).then(function(t){
WORDS = t.split(/\r?\n/).filter(function(x){ return x.length > 0; });
st('Word list ready — ' + WORDS.length.toLocaleString('en-US') + ' words.');
var q = PENDING; PENDING = []; q.forEach(function(f){ f(); });
}).catch(function(){ PENDING = []; st('Could not load the word list. Check your connection and press Solve the Jumble again.'); });
}
function chips(list){
var html = '';
list.forEach(function(x){ html += '<span class="chip">' + x.w + '<sup>' + x.s + '</sup></span>'; });
return html;
}
function solveOne(letters, label){
var exact = ilmExactAnagrams(letters, WORDS, ILM_SCRABBLE);
var html = '<div class="grp"><h3>' + label + ' — "' + letters + '"</h3>';
if (exact.length) {
html += chips(exact);
} else {
var rack = ilmRack(letters, WORDS, ILM_SCRABBLE).slice(0, 30);
if (rack.length) {
html += '<p class="none">No word uses all ' + letters.length + ' letters — check for a typo. Closest help, the best shorter words those letters make:</p>' + chips(rack);
} else {
html += '<p class="none">No words found — check for a typo.</p>';
}
}
return html + '</div>';
}
function run(){
ensureWords(function(){
var html = '', used = 0;
for (var i = 1; i <= 4; i++) {
var v = document.getElementById('j' + i).value.replace(/[^a-zA-Z]/g, '').toLowerCase();
if (v.length >= 2) { html += solveOne(v, 'Jumble ' + i); used++; }
}
var bonus = document.getElementById('bonus').value.replace(/[^a-zA-Z]/g, '').toLowerCase();
if (bonus.length >= 2) {
var exact = ilmExactAnagrams(bonus, WORDS, ILM_SCRABBLE);
html += '<div class="bonusbox"><h3>Final answer — "' + bonus + '"</h3>';
if (exact.length) { html += chips(exact); }
else {
var rack = ilmRack(bonus, WORDS, ILM_SCRABBLE).slice(0, 30);
html += rack.length ? '<p class="none">No word uses every circled letter — recheck which letters you circled. Best shorter words:</p>' + chips(rack)
: '<p class="none">No words found — recheck the circled letters.</p>';
}
html += '</div>';
used++;
}
document.getElementById('results').innerHTML = html;
st(used ? 'Solved ' + used + ' field' + (used === 1 ? '' : 's') + '.' : 'Type at least one jumbled word of 2 or more letters.');
sendH();
});
}
document.getElementById('go').addEventListener('click', run);
['j1','j2','j3','j4','bonus'].forEach(function(id){
document.getElementById(id).addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
});
</script>
</body>
</html>
" id="ilmhunt-jumble-solver" title="Jumble Solver — Unscramble All Four Jumbles and the Final Answer" style="width:100%;max-width:720px;height:640px;border:0;" loading="lazy"></iframe>
<script>(function(){var f=document.getElementById('ilmhunt-jumble-solver');window.addEventListener('message',function(e){if(e&&e.data&&e.data.wpcId===5215&&e.data.wpcH&&f){f.style.height=(e.data.wpcH+24)+'px';}});})();</script>
<p><a href="https://ilmhunt.com/jumble-solver/">Jumble Solver — Unscramble All Four Jumbles and the Final Answer</a> — a free tool from <a href="https://ilmhunt.com/">IlmHunt — free online tools</a></p>
