diff --git a/2020/10/input.txt b/2020/10/input.txt new file mode 100644 index 0000000..ffc1992 --- /dev/null +++ b/2020/10/input.txt @@ -0,0 +1,104 @@ +152 +18 +146 +22 +28 +133 +114 +67 +19 +37 +66 +14 +90 +163 +26 +149 +71 +106 +46 +143 +145 +12 +151 +105 +58 +130 +93 +49 +74 +83 +129 +122 +63 +134 +86 +136 +166 +169 +159 +3 +178 +88 +103 +97 +110 +53 +125 +128 +9 +15 +78 +1 +50 +87 +56 +89 +60 +139 +113 +43 +36 +118 +170 +96 +135 +23 +144 +153 +150 +142 +95 +180 +35 +179 +80 +13 +115 +2 +171 +32 +70 +6 +72 +119 +29 +79 +27 +47 +107 +73 +162 +172 +57 +40 +48 +100 +64 +59 +175 +104 +156 +94 +77 +65 \ No newline at end of file diff --git a/2020/10/part1.js b/2020/10/part1.js new file mode 100644 index 0000000..7936ab5 --- /dev/null +++ b/2020/10/part1.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const data = fs.readFileSync('input.txt', 'utf-8'); +const lines = data.split('\n').map(num => parseInt(num)).sort((a,b)=>(a-b)); +lines.unshift(0); // add the outlet with joltage 0 +lines.push(lines[lines.length-1]+3); // your device has a joltage 3 above the highest +let threes = 0; // keep track of differences for puzzle solution +let ones = 0; +for (let i = 1; i < lines.length; i++) { + switch (lines[i]-lines[i-1]) { + case 3: + threes++; + break; + case 1: + ones++; + break; + } +} +console.log(ones * threes) \ No newline at end of file diff --git a/2020/10/part2.js b/2020/10/part2.js new file mode 100644 index 0000000..bc9861d --- /dev/null +++ b/2020/10/part2.js @@ -0,0 +1,69 @@ +const fs = require('fs'); +const data = fs.readFileSync('input.txt', 'utf-8'); +const lines = data.split('\n').map(num => parseInt(num)).sort((a,b)=>(a-b)); +lines.unshift(0); +lines.push(lines[lines.length-1]+3); + + +// convert to linked list +let last = {}; +let i = 0 +do { + let entry = { + value: lines[i], + prev: last + }; + last.next = entry; + last = entry; + i++; +} while (i < lines.length) + +// find removeable adaptors +let removeableAdaptors = []; +const lastVal = last +last = last.prev +while (last.prev) { + if (last.next.value - last.prev.value <= 3){ + removeableAdaptors.push(last) + } + last = last.prev +} + +// divide removeable adaptors into groups that don't interfere with one another when removed +// this changes the runtime with the given input from a over a month to less than a millisecond +// however, in a worst case scenareo, where every adaptor is removeable, this would still take trillions of years. +let adaptorGroups = [] +function makeGroups(removeableAdaptors) { + for (let i = removeableAdaptors.length-1; i>-1; i--) { + // if the gap between two removeable adaptors > 2 then you know they will not intefere with each other + if (i == 0 || removeableAdaptors[i-1].value - removeableAdaptors[i].value > 2) { + adaptorGroups.push(removeableAdaptors.slice(i)) + makeGroups(removeableAdaptors.slice(0, i)) + break; + } + } +} +makeGroups(removeableAdaptors) + +function findArrangements (removeableAdaptors, s = 0) { + total = 1 + // for each adaptor in the group + for (let i = s; i < removeableAdaptors.length; i++){ + // if you can remove this adaptor + if (removeableAdaptors[i].next.value-removeableAdaptors[i].prev.value <= 3) { + // remove the adaptor and find arrangements with it gone + removeableAdaptors[i].prev.next = removeableAdaptors[i].next + total += findArrangements (removeableAdaptors, i+1) + // add the adaptor back for following tests + removeableAdaptors[i].prev.next = removeableAdaptors[i] + } + } + return total +} + +console.time('time') +// multipy the amount of arrangements in each group to get the total amount of arrangements. +answer = adaptorGroups.reduce((a, g) => {return a*findArrangements(g)},1) +console.timeEnd('time') + +console.log(answer) diff --git a/2020/10/test1.txt b/2020/10/test1.txt new file mode 100644 index 0000000..cd1b40b --- /dev/null +++ b/2020/10/test1.txt @@ -0,0 +1,11 @@ +16 +10 +15 +5 +1 +11 +7 +19 +6 +12 +4 \ No newline at end of file diff --git a/2020/10/test2.txt b/2020/10/test2.txt new file mode 100644 index 0000000..be5c492 --- /dev/null +++ b/2020/10/test2.txt @@ -0,0 +1,31 @@ +28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3 \ No newline at end of file diff --git a/2020/10/worst_scenareo.txt b/2020/10/worst_scenareo.txt new file mode 100644 index 0000000..d82f05d --- /dev/null +++ b/2020/10/worst_scenareo.txt @@ -0,0 +1,25 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 \ No newline at end of file diff --git a/README.md b/README.md index 99ba950..d0974ea 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ if (advent) { 7. [:star: :star:](https://adventofcode.com/2020/day/7 "see puzzle") 8. [:star: :star:](https://adventofcode.com/2020/day/8 "see puzzle") 9. [:star: :star:](https://adventofcode.com/2020/day/9 "see puzzle") +10. [:star: :star:](https://adventofcode.com/2020/day/10 "see puzzle") ## Languages Used * Python