Skip to content

Instantly share code, notes, and snippets.

@oberhamsi
Created December 3, 2022 11:30
Show Gist options
  • Save oberhamsi/c5cbce2a51f8b99414924bb48be65899 to your computer and use it in GitHub Desktop.
Save oberhamsi/c5cbce2a51f8b99414924bb48be65899 to your computer and use it in GitHub Desktop.
const sum = (array) => array.reduce((prev, curr) => prev + curr);
const intersect = (setA, setB) => new Set(Array.from(setA).filter(i => setB.has(i)));
const charsToSet = (chars) => new Set(chars.split(''));
// Array.flat
const flatten = (array, ret) => {
ret = ret || [];
return array.reduce((ret, entry) => {
if (entry instanceof Set) {
entry = Array.from(entry);
}
if (Array.isArray(entry)) {
flatten(entry, ret);
} else {
ret.push(entry);
}
return ret;
}, ret);
}
const isUpperCase = (char) => {
return char.toUpperCase() === char;
}
const rucksackToSets = (inputString) => {
return inputString
.split('\n')
.map(line => {
const halfLen = line.length/2;
return {
all: charsToSet(line),
first: charsToSet(line.slice(0,halfLen)),
second: charsToSet(line.slice(halfLen))
}
})
};
const getScore = (chars) => {
return sum(chars.map(char => {
return char.charCodeAt(0) - (isUpperCase(char) ? 38 : 96);
}));
}
const findBadges = (rucksacks) => {
const badges = [];
for (let i=0; i < rucksacks.length;i=i+3) {
let elfGroup = rucksacks.slice(i, i+3);
let badge = intersect(
intersect(
elfGroup[0].all,
elfGroup[1].all
),
elfGroup[2].all
);
badges.push(Array.from(badge)[0])
}
return badges;
}
const mainDayThreeA = (inputString) => {
const rucksacks = rucksackToSets(inputString);
const duplicatesPerElf = rucksacks.map(elf => {
return intersect(elf.first, elf.second);
});
return getScore(flatten(duplicatesPerElf));
}
const mainDayThreeB = (inputString) => {
const rucksacks = rucksackToSets(inputString);
const badges = findBadges(rucksacks);
return getScore(badges);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment