{"id":933,"date":"2026-02-02T16:23:36","date_gmt":"2026-02-02T16:23:36","guid":{"rendered":"https:\/\/beta.piyochaigold.com\/?page_id=933"},"modified":"2026-02-24T10:43:54","modified_gmt":"2026-02-24T10:43:54","slug":"sudoku","status":"publish","type":"page","link":"https:\/\/beta.piyochaigold.com\/index.php\/sudoku\/","title":{"rendered":"sudoku"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><style>\n\/* ===== WRAPPER ===== *\/\n#chai-sudoku-wrapper {\n  max-width: 420px;\n  margin: 40px auto;\n  font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n  background: #f6f3ef;\n  padding: 22px;\n  border-radius: 18px;\n  box-shadow: 0 10px 30px rgba(85, 51, 12, 0.12);\n}\n\n\/* ===== GRID ===== *\/\n#sudoku-grid {\n  display: grid;\n  grid-template-columns: repeat(9, 1fr);\n  gap: 4px;\n  margin-bottom: 18px;\n}\n\n\/* ===== CELLS ===== *\/\n.s-cell {\n  width: 100%;\n  aspect-ratio: 1 \/ 1;\n  text-align: center;\n  font-size: 18px;\n  border-radius: 6px;\n  border: 1px solid rgba(85, 51, 12, 0.25);\n  background: #ffffff;\n  color: #55330c;\n  transition: background 0.2s ease, box-shadow 0.2s ease;\n}\n\n.s-cell:focus {\n  outline: none;\n  box-shadow: 0 0 0 2px rgba(85, 51, 12, 0.25);\n}\n\n\/* Prefilled cells *\/\n.s-cell.prefilled {\n  background: #ede6db;\n  font-weight: 600;\n  color: #55330c;\n}\n\n\/* Error cells *\/\n.s-cell.error {\n  background: #f2d6cf;\n  border-color: #a13a1f;\n}\n\n\/* ===== CONTROLS ===== *\/\n.sudoku-controls {\n  display: flex;\n  gap: 10px;\n  margin-top: 10px;\n}\n\n.sudoku-controls button {\n  flex: 1;\n  padding: 10px 0;\n  border-radius: 10px;\n  border: 1px solid #55330c;\n  background: transparent;\n  color: #55330c;\n  font-size: 14px;\n  cursor: pointer;\n  transition: all 0.25s ease;\n}\n\n.sudoku-controls button:hover {\n  background: #55330c;\n  color: #f6f3ef;\n}\n\n\/* ===== POPUP OVERLAY ===== *\/\n#solve-popup {\n  position: fixed;\n  inset: 0;\n  background: transparent; \/* Removed brown overlay *\/\n  display: none;\n  align-items: center;\n  justify-content: center;\n  z-index: 9999;\n}\n\n\/* ===== POPUP BOX ===== *\/\n.popup-box {\n  background: #f6f3ef;\n  padding: 28px 26px;\n  max-width: 340px;\n  width: 90%;\n  text-align: center;\n  border-radius: 18px;\n  box-shadow: 0 30px 60px rgba(0,0,0,0.35);\n}\n\n.popup-box p {\n  margin: 0;\n  font-size: 16px;\n  line-height: 1.5;\n  color: #55330c;\n}\n\n\/* ===== POPUP ACTIONS ===== *\/\n.popup-actions {\n  margin-top: 22px;\n  display: flex;\n  gap: 12px;\n}\n\n.popup-actions button {\n  flex: 1;\n  padding: 10px;\n  border-radius: 10px;\n  border: 1px solid #55330c;\n  background: transparent;\n  color: #55330c;\n  cursor: pointer;\n  transition: all 0.25s ease;\n}\n\n.popup-actions button:hover {\n  background: #55330c;\n  color: #f6f3ef;\n}\n  \n  \/* ===== MOBILE RESPONSIVE FIX ===== *\/\n@media (max-width: 480px) {\n\n  #chai-sudoku-wrapper {\n    max-width: 95vw;\n    margin: 20px auto;\n    padding: 16px;\n    border-radius: 14px;\n  }\n\n  #sudoku-grid {\n    gap: 3px;\n  }\n\n  .s-cell {\n    font-size: 16px;\n  }\n\n  .popup-box {\n    width: 92%;\n    padding: 22px 18px;\n  }\n\n}\n  \n<\/style>\n\n<div id=\"chai-sudoku-wrapper\">\n  <div id=\"sudoku-grid\"><\/div>\n\n  <div class=\"sudoku-controls\">\n    <button onclick=\"newSudoku('easy')\">Easy<\/button>\n    <button onclick=\"newSudoku('medium')\">Medium<\/button>\n    <button onclick=\"newSudoku('hard')\">Hard<\/button>\n  <\/div>\n\n  <div class=\"sudoku-controls\">\n    <button onclick=\"checkSudoku()\">Validate<\/button>\n    <button onclick=\"openSolvePopup()\">Solve<\/button>\n    <button onclick=\"clearSudoku()\">Clear<\/button>\n  <\/div>\n<\/div>\n\n<!-- POPUP -->\n<div id=\"solve-popup\">\n  <div class=\"popup-box\">\n    <p>\n      Giving up so soon?  \n      Cup empty\u2026 or patience running low?\n    <\/p>\n    <div class=\"popup-actions\">\n      <button onclick=\"confirmSolve()\">Show Solution<\/button>\n      <button onclick=\"closePopup()\">Let me try again<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\nlet solution = [];\nlet puzzle = [];\n\nfunction createGrid() {\n  const grid = document.getElementById(\"sudoku-grid\");\n  grid.innerHTML = \"\";\n  for (let i = 0; i < 81; i++) {\n    const input = document.createElement(\"input\");\n    input.maxLength = 1;\n    input.className = \"s-cell\";\n    input.oninput = () => {\n      if (!\/[1-9]\/.test(input.value)) input.value = \"\";\n    };\n    grid.appendChild(input);\n  }\n}\n\nfunction getCells() {\n  return [...document.querySelectorAll(\".s-cell\")];\n}\n\nfunction newSudoku(level) {\n  solution = generateSolved();\n  puzzle = [...solution];\n\n  let remove;\n  if (level === \"easy\") remove = 40;\n  if (level === \"medium\") remove = 50;\n  if (level === \"hard\") remove = 60;\n\n  while (remove > 0) {\n    let i = Math.floor(Math.random() * 81);\n    if (puzzle[i] !== 0) {\n      puzzle[i] = 0;\n      remove--;\n    }\n  }\n  renderPuzzle();\n}\n\nfunction renderPuzzle() {\n  const cells = getCells();\n  cells.forEach((cell, i) => {\n    cell.classList.remove(\"prefilled\", \"error\");\n    if (puzzle[i] !== 0) {\n      cell.value = puzzle[i];\n      cell.classList.add(\"prefilled\");\n      cell.disabled = true;\n    } else {\n      cell.value = \"\";\n      cell.disabled = false;\n    }\n  });\n}\n\nfunction clearSudoku() {\n  getCells().forEach(c => {\n    if (!c.classList.contains(\"prefilled\")) c.value = \"\";\n    c.classList.remove(\"error\");\n  });\n}\n\nfunction checkSudoku() {\n  const cells = getCells();\n  cells.forEach((c, i) => {\n    c.classList.remove(\"error\");\n    if (c.value && parseInt(c.value) !== solution[i]) {\n      c.classList.add(\"error\");\n    }\n  });\n}\n\nfunction solveSudoku() {\n  getCells().forEach((c, i) => {\n    c.value = solution[i];\n  });\n}\n\n\/* ===== POPUP LOGIC ===== *\/\nfunction openSolvePopup() {\n  document.getElementById(\"solve-popup\").style.display = \"flex\";\n}\nfunction closePopup() {\n  document.getElementById(\"solve-popup\").style.display = \"none\";\n}\nfunction confirmSolve() {\n  closePopup();\n  solveSudoku();\n}\n\n\/* ===== SOLVER & GENERATOR ===== *\/\nfunction generateSolved() {\n  let board = Array(81).fill(0);\n  solve(board);\n  return board;\n}\n\nfunction solve(board) {\n  let i = board.indexOf(0);\n  if (i === -1) return true;\n\n  let nums = [1,2,3,4,5,6,7,8,9].sort(() => 0.5 - Math.random());\n  for (let n of nums) {\n    if (valid(board, i, n)) {\n      board[i] = n;\n      if (solve(board)) return true;\n      board[i] = 0;\n    }\n  }\n  return false;\n}\n\nfunction valid(board, i, n) {\n  let r = Math.floor(i \/ 9) * 9;\n  let c = i % 9;\n\n  for (let x = 0; x < 9; x++) {\n    if (board[r + x] === n) return false;\n    if (board[c + x * 9] === n) return false;\n  }\n\n  let br = Math.floor(r \/ 27) * 27;\n  let bc = Math.floor(c \/ 3) * 3;\n  for (let x = 0; x < 3; x++)\n    for (let y = 0; y < 3; y++)\n      if (board[br + bc + x * 9 + y] === n) return false;\n\n  return true;\n}\n\ncreateGrid();\nnewSudoku(\"medium\");\n<\/script>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-933","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/pages\/933","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/comments?post=933"}],"version-history":[{"count":11,"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/pages\/933\/revisions"}],"predecessor-version":[{"id":1905,"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/pages\/933\/revisions\/1905"}],"wp:attachment":[{"href":"https:\/\/beta.piyochaigold.com\/index.php\/wp-json\/wp\/v2\/media?parent=933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}