AOC Solutions

For a description of this problem, please check the Advent of Code website.

Example 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

Part 1 Solution:

const fs = require('fs');
const data = fs.readFileSync('./input.txt', 'utf8');
let [rules, updates] = data.split('\n\r\n')
rules = rules.split('\n').map(rule => {
return rule.split('|').map(Number)
})
updates = updates.split('\n').map(update => {
return update.split(',').map(Number)
})
function check(update) {
return rules.every(rule => {
if(update.includes(rule[0]) && update.includes(rule[1])) {
return update.indexOf(rule[0]) < update.indexOf(rule[1])
}
return true
})
}
let sum = 0;
updates.forEach(update => {
if(check(update)) {
sum += update[Math.floor(update.length/2)]
}
})
console.log(sum)

Part 2 Solution:

const fs = require('fs');
const data = fs.readFileSync('./input.txt', 'utf8');
let [rules, updates] = data.split('\n\r\n')
rules = rules.split('\n').map(rule => {
return rule.split('|').map(Number)
})
updates = updates.split('\n').map(update => {
return update.split(',').map(Number)
})
function check(update) {
return rules.every(rule => {
if(update.includes(rule[0]) && update.includes(rule[1])) {
return update.indexOf(rule[0]) < update.indexOf(rule[1])
}
return true
})
}
function sort(update) {
return update.sort((a, b) => {
let rule = rules.find((r) => r.includes(a) && r.includes(b));
return rule.indexOf(a) - rule.indexOf(b);
})
}
let sum = 0;
updates.forEach(update => {
if(!check(update)) {
sort(update)
sum += update[Math.floor(update.length/2)]
}
})
console.log(sum)