dvd_bounce/dvd_bounce_brute_force.js

88 lines
2.2 KiB
JavaScript
Raw Normal View History

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();