diff --git a/package-lock.json b/package-lock.json index db9573a..c372dad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vue-nonograms-solid", - "version": "1.12.10", + "version": "1.12.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vue-nonograms-solid", - "version": "1.12.10", + "version": "1.12.11", "dependencies": { "fireworks-js": "^2.10.8", "flag-icons": "^7.5.0", diff --git a/package.json b/package.json index 7d9a0e9..c42b6c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-nonograms-solid", - "version": "1.12.10", + "version": "1.12.11", "homepage": "https://nonograms.7u.pl/", "type": "module", "scripts": { diff --git a/scripts/run_simulation.mjs b/scripts/run_simulation.mjs new file mode 100644 index 0000000..b347d9c --- /dev/null +++ b/scripts/run_simulation.mjs @@ -0,0 +1,47 @@ + +import { generateRandomGrid, calculateHints } from '../src/utils/puzzleUtils.js'; +import { solvePuzzle } from '../src/utils/solver.js'; +import fs from 'fs'; + +const SIZES = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80]; +const DENSITIES = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]; +const SAMPLES = 200; // High sample count for stability + +console.log('Starting simulation...'); +console.log(`Sizes: ${SIZES.join(', ')}`); +console.log(`Densities: ${DENSITIES.join(', ')}`); +console.log(`Samples per point: ${SAMPLES}`); + +const results = {}; + +async function run() { + const totalSteps = SIZES.length * DENSITIES.length; + let currentStep = 0; + const startTime = Date.now(); + + for (const size of SIZES) { + results[size] = []; + for (const density of DENSITIES) { + let totalSolved = 0; + for (let i = 0; i < SAMPLES; i++) { + const grid = generateRandomGrid(size, density); + const { rowHints, colHints } = calculateHints(grid); + const { percentSolved } = solvePuzzle(rowHints, colHints); + totalSolved += percentSolved; + } + const avg = Math.round(totalSolved / SAMPLES); + results[size].push(avg); + + currentStep++; + const pct = Math.round((currentStep / totalSteps) * 100); + const elapsed = ((Date.now() - startTime) / 1000).toFixed(0); + process.stdout.write(`\rProgress: ${pct}% (${currentStep}/${totalSteps}) - Elapsed: ${elapsed}s`); + } + } + + console.log('\n\nSimulation complete!'); + console.log('SIM_DATA = ' + JSON.stringify(results, null, 4) + ';'); + fs.writeFileSync('simulation_results.json', JSON.stringify(results, null, 4)); +} + +run(); diff --git a/src/utils/puzzleUtils.js b/src/utils/puzzleUtils.js index 775f04c..86d5a20 100644 --- a/src/utils/puzzleUtils.js +++ b/src/utils/puzzleUtils.js @@ -64,18 +64,21 @@ export function calculateDifficulty(density, size = 10) { // Data derived from Monte Carlo Simulation (Logical Solver) // Format: { size: [solved_pct_at_0.1, ..., solved_pct_at_0.9] } const SIM_DATA = { - 5: [86, 73, 74, 80, 88, 98, 99, 99, 100], - 10: [57, 22, 19, 44, 86, 99, 100, 100, 100], - 15: [37, 7, 2, 12, 70, 99, 100, 100, 100], - 20: [23, 3, 0, 3, 40, 99, 100, 100, 100], - 25: [13, 1, 0, 1, 19, 99, 100, 100, 100], - 30: [8, 1, 0, 0, 4, 100, 100, 100, 100], - 35: [5, 0, 0, 0, 3, 99, 100, 100, 100], - 40: [3, 0, 0, 0, 1, 96, 100, 100, 100], - 45: [2, 0, 0, 0, 1, 83, 100, 100, 100], - 50: [1, 0, 0, 0, 0, 62, 100, 100, 100], - 60: [0, 0, 0, 0, 0, 18, 100, 100, 100], - 70: [0, 0, 0, 0, 0, 14, 100, 100, 100], + 5: [88, 76, 71, 80, 90, 98, 99, 100, 100], + 10: [58, 25, 18, 44, 81, 99, 100, 100, 100], + 15: [36, 7, 3, 11, 67, 99, 100, 100, 100], + 20: [24, 3, 0, 3, 48, 99, 100, 100, 100], + 25: [13, 1, 0, 1, 21, 99, 100, 100, 100], + 30: [9, 0, 0, 0, 7, 99, 100, 100, 100], + 35: [5, 0, 0, 0, 5, 97, 100, 100, 100], + 40: [3, 0, 0, 0, 2, 91, 100, 100, 100], + 45: [2, 0, 0, 0, 1, 84, 100, 100, 100], + 50: [1, 0, 0, 0, 0, 65, 100, 100, 100], + 55: [1, 0, 0, 0, 0, 55, 100, 100, 100], + 60: [0, 0, 0, 0, 0, 35, 100, 100, 100], + 65: [0, 0, 0, 0, 0, 20, 100, 100, 100], + 70: [0, 0, 0, 0, 0, 11, 100, 100, 100], + 75: [0, 0, 0, 0, 0, 12, 100, 100, 100], 80: [0, 0, 0, 0, 0, 4, 100, 100, 100] };