feat(day_1): both exercises done
This commit is contained in:
14
.editorconfig
Normal file
14
.editorconfig
Normal file
@@ -0,0 +1,14 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
charset = utf-8
|
||||
|
||||
[*.{txt}]
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
/node_modules
|
||||
/vendor
|
||||
|
||||
.env
|
||||
*.orig
|
||||
*.pyc
|
||||
*.swp
|
||||
@@ -1,8 +1,7 @@
|
||||
# code-advent-2025
|
||||
|
||||
Code Advent problems of 2025.
|
||||
[Advent of Code](https://adventofcode.com/) problems of 2025.
|
||||
|
||||
| Day | Name | Part 1 | Part 2 |
|
||||
| :-: | :--- | :----: | :----: |
|
||||
| 1 | | | |
|
||||
| 2 | | | |
|
||||
| :-: | :-------------- | :----: | :----: |
|
||||
| 1 | Secret Entrance | ⭐ | ⭐ |
|
||||
|
||||
@@ -4,9 +4,10 @@
|
||||
"dev": "deno run -R --watch src/main.ts",
|
||||
"today:dev": "deno run -R --watch src/main.ts $(date +%e)",
|
||||
"today": "deno run -R src/main.ts $(date +%e)",
|
||||
"test": "deno test --parallel src",
|
||||
"test": "deno test -R --parallel src",
|
||||
"lint:commit": "commitlint --edit"
|
||||
},
|
||||
"vendor": true,
|
||||
"imports": {
|
||||
"@commitlint/cli": "npm:@commitlint/cli@^20.1.0",
|
||||
"@std/assert": "jsr:@std/assert@1",
|
||||
|
||||
20
src/__tests__/day_1_test.ts
Normal file
20
src/__tests__/day_1_test.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { assertEquals } from "@std/assert";
|
||||
import {
|
||||
find_zero_count,
|
||||
find_zero_count_any,
|
||||
read_instruction_input,
|
||||
} from "../exercises/day_1.ts";
|
||||
|
||||
const FILE_PATH = "src/exercises/assets/day_1_test_input.txt";
|
||||
|
||||
Deno.test("Day 1 - A", async () => {
|
||||
const instructions = await read_instruction_input(FILE_PATH);
|
||||
const zero_count = find_zero_count(instructions);
|
||||
assertEquals(zero_count, 3);
|
||||
});
|
||||
|
||||
Deno.test("Day 1 - B", async () => {
|
||||
const instructions = await read_instruction_input(FILE_PATH);
|
||||
const zero_count = find_zero_count_any(instructions);
|
||||
assertEquals(zero_count, 6);
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
10
src/exercises/assets/day_1_test_input.txt
Normal file
10
src/exercises/assets/day_1_test_input.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
L68
|
||||
L30
|
||||
R48
|
||||
L5
|
||||
R60
|
||||
L55
|
||||
L1
|
||||
L99
|
||||
R14
|
||||
L82
|
||||
@@ -1,4 +1,112 @@
|
||||
export default function FirstDayExerciseName() {
|
||||
console.log("test_module");
|
||||
return 1;
|
||||
type Direction = "L" | "R";
|
||||
interface Intruction {
|
||||
direction: Direction;
|
||||
quantity: number;
|
||||
}
|
||||
|
||||
const INITIAL_POSITION = 50;
|
||||
const MAX_POSITION = 99;
|
||||
|
||||
export default async function SecretEntrance() {
|
||||
const instructions = await read_instruction_input(
|
||||
"src/exercises/assets/day_1_input.txt",
|
||||
);
|
||||
const zero_count = find_zero_count(instructions);
|
||||
const zero_count_any = find_zero_count_any(instructions);
|
||||
console.log(">> zero_count", zero_count, zero_count_any);
|
||||
}
|
||||
|
||||
function classic_module(left: number, right: number): number {
|
||||
return ((left % right) + right) % right;
|
||||
}
|
||||
|
||||
export function find_zero_count_any(instructions: Intruction[]): number {
|
||||
let zero_count = 0;
|
||||
let current_position = INITIAL_POSITION;
|
||||
|
||||
instructions.forEach((instruction) => {
|
||||
let count = 0;
|
||||
// NOTE: Ugly solution, mathematics obvious does not work since are all positive numbers and HUGE rotations are allowed
|
||||
switch (instruction.direction) {
|
||||
case "L":
|
||||
while (count < instruction.quantity) {
|
||||
current_position -= 1;
|
||||
if (current_position < 0) {
|
||||
current_position = classic_module(
|
||||
current_position,
|
||||
MAX_POSITION + 1,
|
||||
);
|
||||
}
|
||||
if (current_position === 0) {
|
||||
zero_count += 1;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
break;
|
||||
case "R":
|
||||
while (count < instruction.quantity) {
|
||||
current_position += 1;
|
||||
if (current_position > MAX_POSITION) {
|
||||
current_position = classic_module(
|
||||
current_position,
|
||||
MAX_POSITION + 1,
|
||||
);
|
||||
}
|
||||
if (current_position === 0) {
|
||||
zero_count += 1;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
return zero_count;
|
||||
}
|
||||
|
||||
export function find_zero_count(instructions: Intruction[]): number {
|
||||
let zero_count = 0;
|
||||
let current_position = INITIAL_POSITION;
|
||||
|
||||
instructions.forEach((instruction) => {
|
||||
switch (instruction.direction) {
|
||||
case "L":
|
||||
current_position = classic_module(
|
||||
current_position - instruction.quantity,
|
||||
MAX_POSITION + 1,
|
||||
);
|
||||
break;
|
||||
case "R":
|
||||
current_position = classic_module(
|
||||
current_position + instruction.quantity,
|
||||
MAX_POSITION + 1,
|
||||
);
|
||||
}
|
||||
if (current_position === 0) {
|
||||
zero_count += 1;
|
||||
}
|
||||
});
|
||||
|
||||
return zero_count;
|
||||
}
|
||||
|
||||
export async function read_instruction_input(
|
||||
path: string,
|
||||
): Promise<Intruction[]> {
|
||||
const txt_input: string = await globalThis.Deno.readTextFile(
|
||||
path,
|
||||
);
|
||||
// NOTE: regex is useles here, since the split is done manually
|
||||
const data_regex = new RegExp(/([RL][0-9]+)/g);
|
||||
const data_match = txt_input.match(data_regex);
|
||||
const instruction_list: Intruction[] = [];
|
||||
data_match?.forEach((instruction) => {
|
||||
const direction = instruction.slice(0, 1);
|
||||
const quantity = instruction.slice(1);
|
||||
instruction_list.push({
|
||||
direction: direction as Direction,
|
||||
quantity: parseInt(quantity),
|
||||
});
|
||||
});
|
||||
return instruction_list;
|
||||
}
|
||||
|
||||
14
src/main.ts
14
src/main.ts
@@ -1,17 +1,17 @@
|
||||
// Learn more at https://docs.deno.com/runtime/manual/examples/module_metadata#concepts
|
||||
if (import.meta.main) {
|
||||
await main();
|
||||
}
|
||||
|
||||
async function main(): Promise<number> {
|
||||
const args = Deno.args;
|
||||
const args = globalThis.Deno.args;
|
||||
if (!args || args.length !== 1) {
|
||||
return Promise.resolve(-1);
|
||||
}
|
||||
const day = parseInt(args[0]);
|
||||
|
||||
const module = await import(`./exercises/day_${day}.ts`);
|
||||
module.default();
|
||||
await module.default();
|
||||
|
||||
return Promise.resolve(0);
|
||||
}
|
||||
|
||||
// Learn more at https://docs.deno.com/runtime/manual/examples/module_metadata#concepts
|
||||
if (import.meta.main) {
|
||||
await main();
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import { assertEquals } from "@std/assert";
|
||||
|
||||
function add(a: number, b: number): number {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
Deno.test(function addTest() {
|
||||
assertEquals(add(2, 3), 5);
|
||||
});
|
||||
Reference in New Issue
Block a user