day 5, feels nice

This commit is contained in:
Joshua Seigler 2024-12-05 00:27:52 -05:00
parent 5764869e99
commit ee81d62ef8
4 changed files with 143 additions and 15 deletions

View file

@ -63,16 +63,16 @@
},
{
"part1": {
"solved": false,
"result": null,
"solved": true,
"result": "4905",
"attempts": [],
"time": null
"time": 29.389645
},
"part2": {
"solved": false,
"result": null,
"solved": true,
"result": "6204",
"attempts": [],
"time": null
"time": 54.772924
}
},
{

View file

@ -15,7 +15,7 @@
[![Day](https://badgen.net/badge/02/%E2%98%85%E2%98%85/green)](src/day02)
[![Day](https://badgen.net/badge/03/%E2%98%85%E2%98%85/green)](src/day03)
[![Day](https://badgen.net/badge/04/%E2%98%85%E2%98%85/green)](src/day04)
![Day](https://badgen.net/badge/05/%E2%98%86%E2%98%86/gray)
[![Day](https://badgen.net/badge/05/%E2%98%85%E2%98%85/green)](src/day05)
![Day](https://badgen.net/badge/06/%E2%98%86%E2%98%86/gray)
![Day](https://badgen.net/badge/07/%E2%98%86%E2%98%86/gray)
![Day](https://badgen.net/badge/08/%E2%98%86%E2%98%86/gray)
@ -90,16 +90,16 @@ Both parts: 2.477ms
```
Day 04
Time part 1: 327.703ms
Time part 2: 201.225ms
Both parts: 528.928ms
Time part 1: 67.709ms
Time part 2: 182.986ms
Both parts: 250.695ms
```
```
Day 05
Time part 1: -
Time part 2: -
Both parts: -
Time part 1: 29.068ms
Time part 2: 53.891ms
Both parts: 82.959ms
```
```
@ -243,8 +243,8 @@ Both parts: -
```
```
Total stars: 8/50
Total time: 537.288ms
Total stars: 10/50
Total time: 342.015ms
```
<!--/RESULTS-->

9
src/day05/README.md Normal file
View file

@ -0,0 +1,9 @@
# 🎄 Advent of Code 2024 - day 5 🎄
## Info
Task description: [link](https://adventofcode.com/2024/day/5)
## Notes
...

119
src/day05/index.ts Normal file
View file

@ -0,0 +1,119 @@
import run from "aocrunner"
const parseInput = (rawInput: string) => {
const [a,b] = rawInput.split('\n\n')
return {
rules: a.split('\n').map(rule => rule.split('|').map(Number)),
updates: b.split('\n').map(update => update.split(',').map(Number))
}
}
const part1 = (rawInput: string) => {
const {rules, updates} = parseInput(rawInput)
return updates.reduce((total, update) => {
let seen: number[] = []
for (const page of update) {
if (rules.some(rule => seen.includes(rule[1]) && rule[0] === page)) {
return total
}
seen.push(page)
}
return total + seen[Math.floor(seen.length / 2)]
}, 0)
}
const part2 = (rawInput: string) => {
const {rules, updates} = parseInput(rawInput)
return updates.reduce((total, update) => {
let seen: number[] = []
for (const page of update) {
if (rules.some(rule => seen.includes(rule[1]) && rule[0] === page)) {
// needs fixing
const sortedUpdate = update.sort((p1,p2) => {
return rules.some(rule => rule[0] === p1 && rule[1] === p2) ? -1 : 1
})
return total + update[Math.floor(update.length / 2)]
}
seen.push(page)
}
// it's fine
return total
}, 0)
}
run({
part1: {
tests: [
{
input: `47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47`,
expected: 143,
},
],
solution: part1,
},
part2: {
tests: [
{
input: `47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47`,
expected: 123,
},
],
solution: part2,
},
trimTestInputs: true,
onlyTests: false,
})