[WIP] Trying to work on day 17 but I'm braindead
This commit is contained in:
123
functions/src/day17.ts
Normal file
123
functions/src/day17.ts
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
import Day from "./day";
|
||||||
|
|
||||||
|
class Day17 implements Day {
|
||||||
|
|
||||||
|
part1(input: string[]): number | string {
|
||||||
|
|
||||||
|
const targetArea = TargetArea.parse(input[0]);
|
||||||
|
|
||||||
|
// First we find all x-es between 1 and maxX + 1 (as all others will immediately overshoot), that overlap with the target at some points:
|
||||||
|
for (let x = 1; x <= targetArea.maxX + 1; x++) {
|
||||||
|
let curSpeed = x;
|
||||||
|
let curPosX = 0;
|
||||||
|
for (let step = 0; step < (targetArea.maxX + 1) / x; step++) {
|
||||||
|
|
||||||
|
curPosX += curSpeed;
|
||||||
|
if (targetArea.isInX(curPosX)) {
|
||||||
|
// Find y's that given this position and step, match:
|
||||||
|
// TODO: find out which y's make sense to check
|
||||||
|
for (let y = 0; y < 100; y++) {
|
||||||
|
// steps = 3
|
||||||
|
// y = 1 -> 1 + 0 + -1 = 0
|
||||||
|
// y = 2 -> 2 + 1 + 0 = 3
|
||||||
|
// y = 3 -> 3 + 2 + 1 = 6
|
||||||
|
// y = 4 -> 4 + 3 + 2 = 9
|
||||||
|
// y = 5 -> 5 + 4 + 3 = 12
|
||||||
|
|
||||||
|
// steps = 4
|
||||||
|
// y = 1 -> -2
|
||||||
|
// y = 2 -> 2
|
||||||
|
// y = 3 -> 6
|
||||||
|
// y = 4 -> 10
|
||||||
|
|
||||||
|
// y = 0
|
||||||
|
// steps = 1 -> 0 = 0
|
||||||
|
// steps = 2 -> 0 - 1 = -1
|
||||||
|
// steps = 3 -> 0 - 1 - 2 = -3
|
||||||
|
// steps = 4 -> 0 - 1- 2 - 3= -6
|
||||||
|
// steps = 5 -> 0-1-2-3-4 = -10
|
||||||
|
// steps = 6 -> 0-1-2-3-4-5 = -15
|
||||||
|
|
||||||
|
// v = -1 * x
|
||||||
|
// pos = -.5 * steps^2 + y * steps
|
||||||
|
|
||||||
|
// f(s) = s * y +
|
||||||
|
}
|
||||||
|
const { maxY, finalY } = this.simulateY()
|
||||||
|
} else if ( curPosX > targetArea.maxX || (curSpeed === 0 && curPosX < targetArea.minX)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
curSpeed--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
simulateY(initialSpeedY: number, steps: number): { maxY: number, finalY: number} {
|
||||||
|
|
||||||
|
let curSpeed = initialSpeedY;
|
||||||
|
let y = 0;
|
||||||
|
let maxY = 0;
|
||||||
|
for (let step = 0; step < steps; step++) {
|
||||||
|
y += curSpeed;
|
||||||
|
curSpeed--;
|
||||||
|
if (y > maxY) {
|
||||||
|
maxY = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { finalY: y, maxY: maxY };
|
||||||
|
}
|
||||||
|
|
||||||
|
part2(input: string[]): number | string {
|
||||||
|
// TODO implement
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class TargetArea {
|
||||||
|
|
||||||
|
minX: number;
|
||||||
|
maxX: number;
|
||||||
|
minY: number;
|
||||||
|
maxY: number;
|
||||||
|
|
||||||
|
|
||||||
|
constructor(minX: number, maxX: number, minY: number, maxY: number) {
|
||||||
|
this.minX = minX;
|
||||||
|
this.maxX = maxX;
|
||||||
|
this.minY = minY;
|
||||||
|
this.maxY = maxY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static parse(input: string): TargetArea {
|
||||||
|
const regex = /^target area: x=(-?[0-9]+)\.\.(-?[0-9]+), y=(-?[0-9]+)..(-?[0-9]+)$/i;
|
||||||
|
const match = input.trim().match(regex);
|
||||||
|
|
||||||
|
if (!match || match.length < 5) {
|
||||||
|
throw Error("Invalid input: '" + input + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TargetArea(
|
||||||
|
parseInt(match[1]),
|
||||||
|
parseInt(match[2]),
|
||||||
|
parseInt(match[3]),
|
||||||
|
parseInt(match[4]),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
isInX(x: number): boolean {
|
||||||
|
return x >= this.minX && x <= this.maxX;
|
||||||
|
}
|
||||||
|
|
||||||
|
isInY(y: number): boolean {
|
||||||
|
return y >= this.minY && y <= this.maxY;
|
||||||
|
}
|
||||||
|
|
||||||
|
isIn(x: number, y: number): boolean {
|
||||||
|
return this.isInX(x) && this.isInY(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Day17;
|
||||||
@@ -18,6 +18,7 @@ import Day13 from "./day13";
|
|||||||
import Day14 from "./day14";
|
import Day14 from "./day14";
|
||||||
import Day15 from "./day15";
|
import Day15 from "./day15";
|
||||||
import Day16 from "./day16";
|
import Day16 from "./day16";
|
||||||
|
import Day17 from './day17';
|
||||||
|
|
||||||
|
|
||||||
// // Start writing Firebase Functions
|
// // Start writing Firebase Functions
|
||||||
@@ -50,6 +51,7 @@ export const day = {
|
|||||||
14: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day14(), request, response) }),
|
14: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day14(), request, response) }),
|
||||||
15: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day15(), request, response) }),
|
15: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day15(), request, response) }),
|
||||||
16: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day16(), request, response) }),
|
16: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day16(), request, response) }),
|
||||||
|
17: functions.region("europe-west1").https.onRequest((request, response) => { processDay(new Day17(), request, response) }),
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user