feat(day_2): both exercises done
This commit is contained in:
@@ -5,3 +5,4 @@
|
|||||||
| Day | Name | Part 1 | Part 2 |
|
| Day | Name | Part 1 | Part 2 |
|
||||||
| :-: | :-------------- | :----: | :----: |
|
| :-: | :-------------- | :----: | :----: |
|
||||||
| 1 | Secret Entrance | ⭐ | ⭐ |
|
| 1 | Secret Entrance | ⭐ | ⭐ |
|
||||||
|
| 2 | Gift Shop | ⭐ | ⭐ |
|
||||||
|
|||||||
20
src/__tests__/day_2_test.ts
Normal file
20
src/__tests__/day_2_test.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { assertEquals } from "@std/assert";
|
||||||
|
import {
|
||||||
|
count_invalid_ids_sum,
|
||||||
|
count_new_invalid_ids_sum,
|
||||||
|
read_id_ranges,
|
||||||
|
} from "../exercises/day_2.ts";
|
||||||
|
|
||||||
|
const FILE_PATH = "src/exercises/assets/day_2_test_input.txt";
|
||||||
|
|
||||||
|
Deno.test("Day 2 - A", async () => {
|
||||||
|
const id_ranges = await read_id_ranges(FILE_PATH);
|
||||||
|
const invalid_sum = count_invalid_ids_sum(id_ranges);
|
||||||
|
assertEquals(invalid_sum, 1227775554);
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test("Day 2 - B", async () => {
|
||||||
|
const id_ranges = await read_id_ranges(FILE_PATH);
|
||||||
|
const invalid_sum = count_new_invalid_ids_sum(id_ranges);
|
||||||
|
assertEquals(invalid_sum, 4174379265);
|
||||||
|
});
|
||||||
1
src/exercises/assets/day_2_input.txt
Normal file
1
src/exercises/assets/day_2_input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
385350926-385403705,48047-60838,6328350434-6328506208,638913-698668,850292-870981,656-1074,742552-796850,4457-6851,138-206,4644076-4851885,3298025-3353031,8594410816-8594543341,396-498,1558-2274,888446-916096,12101205-12154422,2323146444-2323289192,37-57,101-137,46550018-46679958,79-96,317592-341913,495310-629360,33246-46690,14711-22848,1-17,2850-4167,3723700171-3723785996,190169-242137,272559-298768,275-365,7697-11193,61-78,75373-110112,425397-451337,9796507-9899607,991845-1013464,77531934-77616074
|
||||||
1
src/exercises/assets/day_2_test_input.txt
Normal file
1
src/exercises/assets/day_2_test_input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
|
||||||
95
src/exercises/day_2.ts
Normal file
95
src/exercises/day_2.ts
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
interface Range {
|
||||||
|
init: number;
|
||||||
|
end: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function GiftShop() {
|
||||||
|
const input_ranges = await read_id_ranges(
|
||||||
|
"src/exercises/assets/day_2_input.txt",
|
||||||
|
);
|
||||||
|
const invalid_id_count = count_invalid_ids_sum(input_ranges);
|
||||||
|
const new_invalid_id_count = count_new_invalid_ids_sum(input_ranges);
|
||||||
|
console.log(">> Invalid id count: ", invalid_id_count, new_invalid_id_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Repeating numbers are the invalid ids
|
||||||
|
// Leading zeroes are invalid ids
|
||||||
|
export function count_invalid_ids_sum(id_ranges: Range[]): number {
|
||||||
|
let invalid_id_sum: number = 0;
|
||||||
|
id_ranges.forEach((range) => {
|
||||||
|
for (let i = range.init; i <= range.end; i++) {
|
||||||
|
if (is_id_mirror(i)) {
|
||||||
|
invalid_id_sum += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return invalid_id_sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function count_new_invalid_ids_sum(id_ranges: Range[]): number {
|
||||||
|
let invalid_id_sum: number = 0;
|
||||||
|
id_ranges.forEach((range) => {
|
||||||
|
for (let i = range.init; i <= range.end; i++) {
|
||||||
|
if (is_id_repeating(i)) {
|
||||||
|
invalid_id_sum += i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return invalid_id_sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_id_repeating(id: number): boolean {
|
||||||
|
const str_id = id.toString();
|
||||||
|
|
||||||
|
if (str_id[0] === "0") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let size = 1; size <= str_id.length / 2; size++) {
|
||||||
|
const baselise_slice: string = str_id.slice(0, size);
|
||||||
|
|
||||||
|
if (str_id.length % size !== 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let is_repeating = true;
|
||||||
|
|
||||||
|
for (let pos = size; pos <= str_id.length - size; pos += size) {
|
||||||
|
const current_slice = str_id.slice(pos, pos + size);
|
||||||
|
|
||||||
|
if (current_slice !== baselise_slice) {
|
||||||
|
is_repeating = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_repeating) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_id_mirror(id: number): boolean {
|
||||||
|
const str_id = id.toString();
|
||||||
|
if (str_id.length % 2 !== 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const half_point = str_id.length / 2;
|
||||||
|
const left_side = str_id.slice(0, half_point);
|
||||||
|
const right_side = str_id.slice(half_point, str_id.length);
|
||||||
|
return left_side === right_side;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function read_id_ranges(path: string): Promise<Range[]> {
|
||||||
|
const raw_ranges = await Deno.readTextFile(path);
|
||||||
|
const raw_range_array = raw_ranges.split(",");
|
||||||
|
const id_range_list: Range[] = raw_range_array.map((range) => {
|
||||||
|
const value_array = range.split("-");
|
||||||
|
return {
|
||||||
|
init: parseInt(value_array[0]),
|
||||||
|
end: parseInt(value_array[1]),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return id_range_list;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user