generated from nhcarrigan/template
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
import { readFile } from "node:fs/promises";
|
||||
import { join } from "node:path";
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { partOne, partTwo } from "./main.js";
|
||||
|
||||
const inputOne = `L68
|
||||
L30
|
||||
R48
|
||||
L5
|
||||
R60
|
||||
L55
|
||||
L1
|
||||
L99
|
||||
R14
|
||||
L82
|
||||
R0`;
|
||||
|
||||
describe("partOne", () => {
|
||||
it("should return the correct result", async() => {
|
||||
expect(partOne(inputOne)).toBe(3);
|
||||
const bigInput = await readFile(
|
||||
join(import.meta.dirname, "inputOne.txt"),
|
||||
"utf8",
|
||||
);
|
||||
expect(partOne(bigInput)).toBe(1086);
|
||||
});
|
||||
});
|
||||
|
||||
describe("partTwo", () => {
|
||||
it("should return the correct result", async() => {
|
||||
expect(partTwo(inputOne)).toBe(6);
|
||||
const bigInput = await readFile(
|
||||
join(import.meta.dirname, "inputOne.txt"),
|
||||
"utf8",
|
||||
);
|
||||
expect(partTwo(bigInput)).toBe(6268);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
const normalizePosition = (value: number): number => {
|
||||
const modulus = value % 100;
|
||||
return (modulus + 100) % 100;
|
||||
};
|
||||
const countZeroHits = (start: number, end: number): number => {
|
||||
if (end === start) {
|
||||
return 0;
|
||||
}
|
||||
if (end > start) {
|
||||
return Math.floor(end / 100) - Math.floor(start / 100);
|
||||
}
|
||||
return Math.floor((start - 1) / 100) - Math.floor((end - 1) / 100);
|
||||
};
|
||||
|
||||
/**
|
||||
* Part one of the Advent of Code 2025 day 1 challenge.
|
||||
* @param input - The input string.
|
||||
* @returns The number of times the position is 0.
|
||||
* @see https://adventofcode.com/2025/day/1
|
||||
*/
|
||||
const partOne = (input: string): number => {
|
||||
const instructions = input.split("\n").map((line) => {
|
||||
return [ line[0], line.slice(1) ];
|
||||
});
|
||||
let position = 50;
|
||||
let count = 0;
|
||||
for (const instruction of instructions) {
|
||||
const [ direction, distance ] = instruction;
|
||||
if (direction === "L") {
|
||||
position = position - Number(distance);
|
||||
} else {
|
||||
position = position + Number(distance);
|
||||
}
|
||||
position = normalizePosition(position);
|
||||
if (position === 0) {
|
||||
count = count + 1;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
/**
|
||||
* Part two of the Advent of Code 2025 day 1 challenge.
|
||||
* @param input - The input string.
|
||||
* @returns The number of times the position passed through 0.
|
||||
* @see https://adventofcode.com/2025/day/1
|
||||
*/
|
||||
const partTwo = (input: string): number => {
|
||||
const instructions = input.split("\n").map((line) => {
|
||||
return [ line[0], line.slice(1) ];
|
||||
});
|
||||
let position = 50;
|
||||
let count = 0;
|
||||
for (const instruction of instructions) {
|
||||
const [ direction, distance ] = instruction;
|
||||
const delta = direction === "L"
|
||||
? -Number(distance)
|
||||
: Number(distance);
|
||||
const endPosition = position + delta;
|
||||
count = count + countZeroHits(position, endPosition);
|
||||
position = normalizePosition(endPosition);
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
export { partOne, partTwo };
|
||||
Reference in New Issue
Block a user