Weekly Sudoku

@import url('https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,400;0,500&family=DM+Sans:wght@300;400;500;600&display=swap'); .sdk*{box-sizing:border-box;margin:0;padding:0} .sdk-wrap{font-family:'DM Sans',sans-serif;background:#08101e;padding:0 0 40px;border-radius:16px;overflow:hidden;color:#e2e8f0}/* HEADER */ .sdk-header{background:#0a1525;border-bottom:1px solid #1e3a5f;padding:24px;text-align:center} .sdk-logo{max-width:180px;height:auto;display:block;margin:0 auto 20px} .sdk-edition{font-size:10px;letter-spacing:.15em;color:#3b82f6;text-transform:uppercase;font-weight:600;margin-bottom:8px} .sdk-date{font-size:18px;font-weight:600;color:#f0f6ff;letter-spacing:-.01em} .sdk-date span{color:#3b82f6}/* CONTROLS */ .sdk-controls{padding:20px 24px 0;display:flex;flex-direction:column;gap:12px;align-items:center} .sdk-diff{display:flex;background:#0f1e33;border-radius:10px;padding:4px;gap:4px} .sdk-diff-btn{font-family:'DM Sans',sans-serif;font-size:12px;font-weight:600;padding:7px 22px;border-radius:7px;border:none;background:transparent;color:#4a6080;cursor:pointer;transition:all .18s;letter-spacing:.03em} .sdk-diff-btn.active{background:#1d4ed8;color:#fff;box-shadow:0 2px 8px rgba(29,78,216,.4)} .sdk-diff-btn:hover:not(.active){color:#93c5fd} .sdk-btns{display:flex;gap:8px} .sdk-btn{font-family:'DM Sans',sans-serif;font-size:12px;font-weight:600;padding:8px 18px;border-radius:8px;border:none;cursor:pointer;transition:all .18s;letter-spacing:.02em} .sdk-btn-ghost{background:#0f1e33;color:#60a5fa;border:1px solid #1e3a5f} .sdk-btn-ghost:hover{background:#1e3a5f} .sdk-btn-reset{background:#0f1e33;color:#f87171;border:1px solid #2d1515} .sdk-btn-reset:hover{background:#2d1515}/* GAME */ .sdk-game{display:flex;gap:20px;justify-content:center;align-items:flex-start;flex-wrap:wrap;padding:20px 24px 0} .sdk-board-wrap{background:#0a1525;border:1px solid #1e3a5f;border-radius:12px;padding:14px} .sdk-board{display:grid;grid-template-columns:repeat(9,1fr);gap:2px;border:2px solid #2563eb;border-radius:6px;overflow:hidden} .sdk-cell{font-family:'DM Mono',monospace;font-size:clamp(13px,2.2vw,18px);font-weight:500;width:clamp(32px,5.5vw,50px);height:clamp(32px,5.5vw,50px);display:flex;align-items:center;justify-content:center;background:#06101c;color:#e2e8f0;border:none;cursor:pointer;transition:background .1s;outline:none;border-right:1px solid #0f1e33;border-bottom:1px solid #0f1e33} .sdk-cell:nth-child(3n){border-right:1px solid #2563eb} .sdk-cell:nth-child(n+19):nth-child(-n+27),.sdk-cell:nth-child(n+46):nth-child(-n+54){border-bottom:1px solid #2563eb} .sdk-cell.given{color:#60a5fa;font-weight:600} .sdk-cell.selected{background:#1d3a6e!important} .sdk-cell.highlight{background:#0d1e35} .sdk-cell.error{background:#2d0f0f!important;color:#f87171} .sdk-cell.correct{background:#0d2218!important;color:#4ade80} .sdk-cell:not(.given):hover{background:#0f1e33}/* SIDE */ .sdk-side{display:flex;flex-direction:column;gap:12px;min-width:160px} .sdk-card{background:#0a1525;border:1px solid #1e3a5f;border-radius:12px;padding:14px} .sdk-card-label{font-size:10px;color:#4a6080;letter-spacing:.12em;text-transform:uppercase;font-weight:600;margin-bottom:10px} .sdk-numpad{display:grid;grid-template-columns:repeat(3,1fr);gap:6px} .sdk-num-btn{font-family:'DM Mono',monospace;font-size:16px;font-weight:500;padding:10px;border-radius:8px;border:1px solid #1e3a5f;background:#06101c;color:#60a5fa;cursor:pointer;transition:all .15s;text-align:center} .sdk-num-btn:hover{background:#1e3a5f;transform:scale(1.05)} .sdk-num-btn:active{transform:scale(.95)} .sdk-stats{display:flex;flex-direction:column;gap:10px} .sdk-stat{display:flex;justify-content:space-between;align-items:center} .sdk-stat-label{font-size:11px;color:#4a6080;font-weight:500} .sdk-stat-val{font-family:'DM Mono',monospace;font-size:18px;color:#60a5fa;font-weight:500}/* MSG */ .sdk-msg{margin:16px 24px 0;padding:12px 20px;border-radius:10px;font-size:13px;font-weight:600;display:none;text-align:center} .sdk-msg.win{background:#0d2218;border:1px solid #166534;color:#4ade80;display:block} .sdk-msg.info{background:#0f1e33;border:1px solid #1e3a5f;color:#60a5fa;display:block}/* LEADERBOARD */ .sdk-lb-wrap{padding:0 24px;margin-top:20px} .sdk-lb{background:#0a1525;border:1px solid #1e3a5f;border-radius:12px;padding:20px} .sdk-lb-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px} .sdk-lb-title{font-size:14px;font-weight:700;color:#f0f6ff;letter-spacing:-.01em} .sdk-lb-sub{font-size:11px;color:#4a6080} .sdk-lb-table{width:100%;border-collapse:collapse} .sdk-lb-table th{font-size:10px;color:#4a6080;letter-spacing:.1em;text-transform:uppercase;font-weight:600;padding:0 8px 10px;text-align:left;white-space:nowrap} .sdk-lb-table td{padding:10px 8px;border-top:1px solid #0f1e33;font-size:13px;color:#94a3b8;vertical-align:middle;white-space:nowrap} .sdk-lb-table tr:first-child td{border-top:none} .sdk-lb-table tr:hover td{background:#0d1a2d} .sdk-rank{font-family:'DM Mono',monospace;font-size:15px} .sdk-player{color:#e2e8f0;font-weight:500} .sdk-mode{display:inline-block;font-size:10px;font-weight:700;padding:2px 7px;border-radius:4px;text-transform:uppercase;letter-spacing:.04em;margin-top:3px} .sdk-mode.easy{background:#0d2218;color:#4ade80} .sdk-mode.medium{background:#0f1e33;color:#60a5fa} .sdk-mode.hard{background:#2d0f0f;color:#f87171} .sdk-time-val{font-family:'DM Mono',monospace;color:#60a5fa;font-weight:500} .sdk-miss-val{font-family:'DM Mono',monospace;color:#f87171} .sdk-hints-val{font-family:'DM Mono',monospace;color:#a78bfa} .sdk-date-val{font-size:11px;color:#4a6080;font-family:'DM Mono',monospace} .sdk-lb-empty{text-align:center;color:#4a6080;font-size:13px;padding:24px 0} .sdk-lb-loading{text-align:center;color:#4a6080;font-size:13px;padding:20px 0}/* SUBMIT */ .sdk-submit{margin-top:16px;padding-top:16px;border-top:1px solid #0f1e33} .sdk-submit-label{font-size:10px;color:#4a6080;letter-spacing:.12em;text-transform:uppercase;font-weight:600;margin-bottom:10px} .sdk-submit-row{display:flex;gap:8px} .sdk-name-input{flex:1;font-family:'DM Sans',sans-serif;font-size:13px;background:#06101c;border:1px solid #1e3a5f;border-radius:8px;padding:9px 14px;color:#e2e8f0;outline:none;transition:border-color .2s} .sdk-name-input::placeholder{color:#4a6080} .sdk-name-input:focus{border-color:#3b82f6} .sdk-submit-btn{font-family:'DM Sans',sans-serif;font-size:13px;font-weight:600;background:#1d4ed8;color:#fff;border:none;border-radius:8px;padding:9px 18px;cursor:pointer;transition:all .18s;white-space:nowrap} .sdk-submit-btn:hover{background:#2563eb} .sdk-submit-btn:disabled{opacity:.4;cursor:default}@media(max-width:600px){ .sdk-game{gap:14px;padding:16px 16px 0} .sdk-lb-wrap{padding:0 16px} .sdk-side{min-width:100%;flex-direction:row;flex-wrap:wrap} .sdk-card{flex:1;min-width:140px} .sdk-lb-table th:nth-child(5),.sdk-lb-table td:nth-child(5){display:none} }
Weekly Puzzle Edition
Thursday, April 2, 2026  ·  News Edition
Enter Number
⏱ Time00:00
✕ Mistakes0
💡 Hints3
🏆 This Week's Leaderboard
Ranked by fastest time
Loading scores...
(function(){ var SCRIPT_URL='https://script.google.com/macros/s/AKfycbzsupDebN1w8jThpGbjR4UDv1mqMNHK-A2acaPbAMNKLwCt1-tG3Nf5hUr4cEfSlAYA/exec'; var WEEK='week_apr2_2026'; var sdk={board:[],solution:[],given:[],selected:null,errors:0,hints:3,timer:0,timerInt:null,difficulty:'easy',finished:false};var PUZZLES={ easy:[[5,3,0,0,7,0,0,0,0],[6,0,0,1,9,5,0,0,0],[0,9,8,0,0,0,0,6,0],[8,0,0,0,6,0,0,0,3],[4,0,0,8,0,3,0,0,1],[7,0,0,0,2,0,0,0,6],[0,6,0,0,0,0,2,8,0],[0,0,0,4,1,9,0,0,5],[0,0,0,0,8,0,0,7,9]], medium:[[0,0,0,2,6,0,7,0,1],[6,8,0,0,7,0,0,9,0],[1,9,0,0,0,4,5,0,0],[8,2,0,1,0,0,0,4,0],[0,0,4,6,0,2,9,0,0],[0,5,0,0,0,3,0,2,8],[0,0,9,3,0,0,0,7,4],[0,4,0,0,5,0,0,3,6],[7,0,3,0,1,8,0,0,0]], hard:[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,3,0,8,5],[0,0,1,0,2,0,0,0,0],[0,0,0,5,0,7,0,0,0],[0,0,4,0,0,0,1,0,0],[0,9,0,0,0,0,0,0,0],[5,0,0,0,0,0,0,7,3],[0,0,2,0,1,0,0,0,0],[0,0,0,0,4,0,0,0,9]] }; var SOLUTIONS={ easy:[[5,3,4,6,7,8,9,1,2],[6,7,2,1,9,5,3,4,8],[1,9,8,3,4,2,5,6,7],[8,5,9,7,6,1,4,2,3],[4,2,6,8,5,3,7,9,1],[7,1,3,9,2,4,8,5,6],[9,6,1,5,3,7,2,8,4],[2,8,7,4,1,9,6,3,5],[3,4,5,2,8,6,1,7,9]], medium:[[4,3,5,2,6,9,7,8,1],[6,8,2,5,7,1,4,9,3],[1,9,7,8,3,4,5,6,2],[8,2,6,1,9,5,3,4,7],[3,7,4,6,8,2,9,1,5],[9,5,1,7,4,3,6,2,8],[5,1,9,3,2,6,8,7,4],[2,4,8,9,5,7,1,3,6],[7,6,3,4,1,8,2,5,9]], hard:[[9,8,7,6,5,4,3,2,1],[2,4,6,1,7,3,9,8,5],[3,5,1,9,2,8,7,4,6],[1,2,8,5,3,7,6,9,4],[6,3,4,8,9,2,1,5,7],[7,9,5,4,6,1,8,3,2],[5,1,9,2,8,6,4,7,3],[4,7,2,3,1,9,5,6,8],[8,6,3,7,4,5,2,1,9]] };function fmtTime(s){var m=Math.floor(s/60),ss=s%60;return(m<10?'0':'')+m+':'+(ss<10?'0':'')+ss;} function fmtDate(ts){if(!ts||isNaN(ts))return'-';var d=new Date(Number(ts));return(d.getMonth()+1)+'/'+(d.getDate())+'/'+String(d.getFullYear()).slice(2);} function esc(s){return String(s).replace(/[&"']/g,function(c){return({'&':'&','':'>','"':'"',"'":'''})[c];});}/* ---- Google Sheets ---- */ function fetchScores(cb){ fetch(SCRIPT_URL+'?week='+encodeURIComponent(WEEK)) .then(function(r){return r.json();}) .then(function(d){ d.sort(function(a,b){return Number(a.time)-Number(b.time);}); cb(d); }) .catch(function(){cb([]);}); }function saveScore(name,cb){ fetch(SCRIPT_URL,{ method:'POST', headers:{'Content-Type':'text/plain'}, body:JSON.stringify({ week:WEEK,name:name, time:sdk.timer, errors:sdk.errors, difficulty:sdk.difficulty, hintsLeft:sdk.hints, score:0, timestamp:Date.now() }) }) .then(function(r){return r.json();}) .then(function(d){cb(d.result==='ok');}) .catch(function(){cb(false);}); }function renderLB(scores){ var el=document.getElementById('sdkLbList'); if(!scores.length){el.innerHTML='
No scores yet — be the first! 🎯
';return;} var medals=['🥇','🥈','🥉']; var html='' +'' +''; scores.slice(0,10).forEach(function(s,i){ var diff=String(s.difficulty||'easy').toLowerCase(); html+='' +'' +'' +'' +'' +'' +'' +''; }); html+='
#PlayerTimeMistakesHints LeftDate
'+(medals[i]||'#'+(i+1))+'
'+esc(s.name)+'
'+diff+'
'+fmtTime(Number(s.time))+''+Number(s.errors||0)+''+Number(s.hintsLeft||0)+''+fmtDate(s.timestamp)+'
'; el.innerHTML=html; }function loadLB(){fetchScores(renderLB);}window.sdkSubmitScore=function(){ var nameEl=document.getElementById('sdkNameInput'); var name=(nameEl.value||'').trim(); if(!name){nameEl.focus();return;} var btn=document.getElementById('sdkSubmitBtn'); btn.disabled=true;btn.textContent='Saving...'; saveScore(name,function(ok){ if(ok){ document.getElementById('sdkSubmitWrap').style.display='none'; showMsg('Score submitted! 🏆','info'); setTimeout(loadLB,1500); }else{ btn.disabled=false;btn.textContent='Submit'; showMsg('Could not save. Please try again.','info'); } }); };/* ---- Game ---- */ function init(){renderBoard();renderNumpad();startGame();loadLB();}function startGame(){ var p=PUZZLES[sdk.difficulty],s=SOLUTIONS[sdk.difficulty]; sdk.board=p.map(function(r){return r.slice();}); sdk.solution=s.map(function(r){return r.slice();}); sdk.given=p.map(function(r){return r.map(function(v){return v!==0;});}); sdk.selected=null;sdk.errors=0;sdk.hints=3;sdk.finished=false; document.getElementById('sdkErrors').textContent='0'; document.getElementById('sdkHints').textContent='3'; document.getElementById('sdkMsg').className='sdk-msg'; document.getElementById('sdkSubmitWrap').style.display='none'; clearInterval(sdk.timerInt);sdk.timer=0; document.getElementById('sdkTimer').textContent='00:00'; sdk.timerInt=setInterval(function(){if(!sdk.finished){sdk.timer++;document.getElementById('sdkTimer').textContent=fmtTime(sdk.timer);}},1000); updateBoard(); }function renderBoard(){ var b=document.getElementById('sdkBoard');b.innerHTML=''; for(var i=0;i<81;i++){var c=document.createElement('div');c.className='sdk-cell';c.dataset.i=i;c.addEventListener('click',function(){sdkSelect(parseInt(this.dataset.i));});b.appendChild(c);} } function renderNumpad(){ var n=document.getElementById('sdkNumpad');n.innerHTML=''; for(var d=1;d<=9;d++){var b=document.createElement('div');b.className='sdk-num-btn';b.textContent=d;b.dataset.n=d;b.addEventListener('click',function(){sdkInput(parseInt(this.dataset.n));});n.appendChild(b);} }window.sdkSetDiff=function(d){ sdk.difficulty=d; document.querySelectorAll('.sdk-diff-btn').forEach(function(b){b.classList.toggle('active',b.textContent.toLowerCase()===d);}); startGame(); }; window.sdkReset=function(){ for(var i=0;i<9;i++)for(var j=0;j<9;j++){if(!sdk.given[i][j])sdk.board[i][j]=0;} sdk.selected=null;sdk.errors=0;sdk.finished=false; document.getElementById('sdkErrors').textContent='0'; document.getElementById('sdkMsg').className='sdk-msg'; document.getElementById('sdkSubmitWrap').style.display='none'; updateBoard(); }; function sdkSelect(idx){if(sdk.finished)return;sdk.selected=idx;updateBoard();} window.sdkSelect=sdkSelect; window.sdkInput=function(n){ if(sdk.finished||sdk.selected===null)return; var r=Math.floor(sdk.selected/9),c=sdk.selected%9; if(sdk.given[r][c])return; sdk.board[r][c]=n; if(sdk.solution[r][c]!==n){sdk.errors++;document.getElementById('sdkErrors').textContent=sdk.errors;} updateBoard(); if(isSolved()){ sdk.finished=true;clearInterval(sdk.timerInt); showMsg('🎉 Solved! Time: '+fmtTime(sdk.timer)+' · Mistakes: '+sdk.errors,'win'); document.getElementById('sdkSubmitWrap').style.display='block'; } }; window.sdkHint=function(){ if(sdk.finished)return; if(sdk.hints<=0){showMsg('No hints remaining.','info');return;} var empties=[]; for(var i=0;i<81;i++){var r=Math.floor(i/9),c=i%9;if(sdk.board[r][c]===0)empties.push(i);} if(!empties.length)return; var idx=empties[Math.floor(Math.random()*empties.length)]; sdk.board[Math.floor(idx/9)][idx%9]=sdk.solution[Math.floor(idx/9)][idx%9]; sdk.hints--;document.getElementById('sdkHints').textContent=sdk.hints; sdk.selected=idx;updateBoard(); }; window.sdkCheck=function(){ var wrong=0; for(var i=0;i<9;i++)for(var j=0;j0)showMsg(wrong+' mistake(s) found. Keep trying!','info'); updateBoard(); }; function isSolved(){for(var i=0;i<9;i++)for(var j=0;j='1'&&e.key=0&&nx<81)sdkSelect(nx);} }); init(); })();
author avatar
Meridian Source Staff
Add a Comment

Leave a Reply

Your email address will not be published. Required fields are marked *