diff --git a/dvd_bounce_brute_force.js b/dvd_bounce_brute_force.js new file mode 100644 index 0000000..55dc71a --- /dev/null +++ b/dvd_bounce_brute_force.js @@ -0,0 +1,88 @@ +const { writeFileSync } = require('fs'); + +const xMax = 1080.0; +const yMax = 1920.0; + +const framesMin = 30 * 7; +const framesMax = 30 * 60; + +const distanceMax = 30.0; + +const buffer = 50; + +let xStart = 0; +let yStart = 0; +let frames = framesMin; +let distance = 15.0; +let angle = 45; + +let angles = [ 45, 45 + 90, 45 + 180, 45 + 270]; + +let searchHit = 1; + +function simulate (x, y, frames, angle, distance) { + for (let i = 0; i < frames; i++) { + x = x + distance * Math.cos(angle * Math.PI / 180.0); + y = y + distance * Math.sin(angle * Math.PI / 180.0); + if (x >= 1080.0 || x <= 0.0) { + angle = 180 - angle; + } + if (x >= 1080.0) x = 1080.0; + if (x <= 0.0) x = 0.0; + if (y >= 1920.0 || y <= 0.0) { + angle = 360 - angle; + } + if (y >= 1920.0) y = 1920.0; + if (y <= 0.0) y = 0.0; + } + return { x, y, angle } +} + +function simulateAll () { + let res; + let attempts = 0; + let startTime; + let duration; + let secondsLeft; + for (let x = buffer; x < xMax-buffer; x++ ) { + for (let y = buffer; y < yMax-buffer; y++) { + startTime = +new Date(); + console.time(`${x},${y}`) + for (let a = 0; a < 4; a++) { + for (let d = 0; d < 10; d++) { + for (let frames = framesMin; frames < framesMax + 1; frames++) { + angle = angles[a]; + res = simulate(x, y, frames, angle, distance + d); + attempts++; + if (Math.abs(res.x - x) < searchHit && Math.abs(res.y - y) < searchHit && res.angle == angle) { + console.log(`#${attempts}`); + console.log(`startx = ${x} endx = ${res.x}`); + console.log(`starty = ${y} endy = ${res.y}`); + console.log(`startangle = ${angle}`); + console.log(`frames = ${frames}`); + console.log(`distance = ${distance + d}`); + console.log(`searchHit = ${searchHit}`); + console.log("++++++++++++++++++++++++++++++++++++++++"); + return res; + } + } + } + } + console.timeEnd(`${x},${y}`) + duration = ((+new Date()) - startTime); + secondsLeft = (duration / 1000) * (x - (xMax - buffer)) * (y - (yMax - buffer)); + console.log(`Minutes Left: ${Math.round(secondsLeft / 60)}`); + } + } +} + +function main () { + let res; + for (let i = 0; i < 7; i++) { + res = simulateAll(); + searchHit = Math.floor(searchHit / 2.0); + if (searchHit === 0) process.exit() + } +} + +main(); \ No newline at end of file