From c9d3680a693e13f51d6a8b5f086a927d87138b66 Mon Sep 17 00:00:00 2001 From: Joshua Seigler Date: Wed, 22 Dec 2021 18:47:49 -0500 Subject: [PATCH] day 19 incomplete --- src/day19/README.md | 9 ++ src/day19/index.js | 245 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 src/day19/README.md create mode 100644 src/day19/index.js diff --git a/src/day19/README.md b/src/day19/README.md new file mode 100644 index 0000000..b8c3947 --- /dev/null +++ b/src/day19/README.md @@ -0,0 +1,9 @@ +# 🎄 Advent of Code 2021 - day 19 🎄 + +## Info + +Task description: [link](https://adventofcode.com/2021/day/19) + +## Notes + +... \ No newline at end of file diff --git a/src/day19/index.js b/src/day19/index.js new file mode 100644 index 0000000..9b56bd6 --- /dev/null +++ b/src/day19/index.js @@ -0,0 +1,245 @@ +import run from "aocrunner" + +const parseInput = (rawInput) => + rawInput.split`\n\n`.map((s) => + s.split`\n`.slice(1).map((p) => { + const [x, y, z] = p.split`,`.map((x) => +x) + return { x, y, z } + }), + ) + +function fingerprint(p1, p2) { + const dx = p2.x - p1.x, + dy = p2.y - p1.y, + dz = p2.z - p1.z + return `${dx * dx + dy * dy + dz * dz}/${Math.abs(dx * dy * dz)}` +} + +const rotations = [ + ({ x, y, z }) => ({ x: x, y: y, z: z }), + ({ x, y, z }) => ({ x: y, y: z, z: x }), + ({ x, y, z }) => ({ x: z, y: x, z: y }), + ({ x, y, z }) => ({ x: -x, y: z, z: y }), + ({ x, y, z }) => ({ x: z, y: y, z: -x }), + ({ x, y, z }) => ({ x: y, y: -x, z: z }), + ({ x, y, z }) => ({ x: x, y: z, z: -y }), + ({ x, y, z }) => ({ x: z, y: -y, z: x }), + ({ x, y, z }) => ({ x: -y, y: x, z: z }), + ({ x, y, z }) => ({ x: x, y: -z, z: y }), + ({ x, y, z }) => ({ x: -z, y: y, z: x }), + ({ x, y, z }) => ({ x: y, y: x, z: -z }), + ({ x, y, z }) => ({ x: -x, y: -y, z: z }), + ({ x, y, z }) => ({ x: -y, y: z, z: -x }), + ({ x, y, z }) => ({ x: z, y: -x, z: -y }), + ({ x, y, z }) => ({ x: -x, y: y, z: -z }), + ({ x, y, z }) => ({ x: y, y: -z, z: -x }), + ({ x, y, z }) => ({ x: -z, y: -x, z: y }), + ({ x, y, z }) => ({ x: x, y: -y, z: -z }), + ({ x, y, z }) => ({ x: -y, y: -z, z: x }), + ({ x, y, z }) => ({ x: -z, y: x, z: -y }), + ({ x, y, z }) => ({ x: -x, y: -z, z: -y }), + ({ x, y, z }) => ({ x: -z, y: -y, z: -x }), + ({ x, y, z }) => ({ x: -y, y: -x, z: -z }), +] + +const part1 = (rawInput) => { + const scanners = parseInput(rawInput) + scanners.forEach((scanner) => { + scanner.fingerprints = new Map() + for (let i = 0; i < scanner.length; i++) + for (let j = i; j < scanner.length; j++) { + scanner.fingerprints.set(fingerprint(scanner[i], scanner[j]), [ + scanner[i], + scanner[j], + ]) + } + }) + while (scanners.length > 1) { + const reference = scanners.shift() + let newbie + for (let i = 0; i < scanners.length; i++) { + let sharedFingerprints = commonElements( + reference.fingerprints, + scanners[i].fingerprints, + ) + if (sharedFingerprints.length >= (12 * 11) / 2) { + ;[newbie] = scanners.splice(i, 1) + + for (const rotate of rotations) { + } + } + } + } + return +} + +const part2 = (rawInput) => { + const input = parseInput(rawInput) + return +} + +run({ + part1: { + tests: [ + { + input: `--- scanner 0 --- +404,-588,-901 +528,-643,409 +-838,591,734 +390,-675,-793 +-537,-823,-458 +-485,-357,347 +-345,-311,381 +-661,-816,-575 +-876,649,763 +-618,-824,-621 +553,345,-567 +474,580,667 +-447,-329,318 +-584,868,-557 +544,-627,-890 +564,392,-477 +455,729,728 +-892,524,684 +-689,845,-530 +423,-701,434 +7,-33,-71 +630,319,-379 +443,580,662 +-789,900,-551 +459,-707,401 + +--- scanner 1 --- +686,422,578 +605,423,415 +515,917,-361 +-336,658,858 +95,138,22 +-476,619,847 +-340,-569,-846 +567,-361,727 +-460,603,-452 +669,-402,600 +729,430,532 +-500,-761,534 +-322,571,750 +-466,-666,-811 +-429,-592,574 +-355,545,-477 +703,-491,-529 +-328,-685,520 +413,935,-424 +-391,539,-444 +586,-435,557 +-364,-763,-893 +807,-499,-711 +755,-354,-619 +553,889,-390 + +--- scanner 2 --- +649,640,665 +682,-795,504 +-784,533,-524 +-644,584,-595 +-588,-843,648 +-30,6,44 +-674,560,763 +500,723,-460 +609,671,-379 +-555,-800,653 +-675,-892,-343 +697,-426,-610 +578,704,681 +493,664,-388 +-671,-858,530 +-667,343,800 +571,-461,-707 +-138,-166,112 +-889,563,-600 +646,-828,498 +640,759,510 +-630,509,768 +-681,-892,-333 +673,-379,-804 +-742,-814,-386 +577,-820,562 + +--- scanner 3 --- +-589,542,597 +605,-692,669 +-500,565,-823 +-660,373,557 +-458,-679,-417 +-488,449,543 +-626,468,-788 +338,-750,-386 +528,-832,-391 +562,-778,733 +-938,-730,414 +543,643,-506 +-524,371,-870 +407,773,750 +-104,29,83 +378,-903,-323 +-778,-728,485 +426,699,580 +-438,-605,-362 +-469,-447,-387 +509,732,623 +647,635,-688 +-868,-804,481 +614,-800,639 +595,780,-596 + +--- scanner 4 --- +727,592,562 +-293,-554,779 +441,611,-461 +-714,465,-776 +-743,427,-804 +-660,-479,-426 +832,-632,460 +927,-485,-438 +408,393,-506 +466,436,-512 +110,16,151 +-258,-428,682 +-393,719,612 +-211,-452,876 +808,-476,-593 +-575,615,604 +-485,667,467 +-680,325,-822 +-627,-443,-432 +872,-547,-609 +833,512,582 +807,604,487 +839,-516,451 +891,-625,532 +-652,-548,-490 +30,-46,-14`, + expected: 79, + }, + ], + solution: part1, + }, + part2: { + tests: [ + // { input: ``, expected: "" }, + ], + solution: part2, + }, + trimTestInputs: true, +}) + +function commonElements(...arr) { + // https://stackoverflow.com/a/62548484 + const lookup = arr.reduce((map, a) => { + const unique = [...new Set(a)] + unique.forEach((v) => { + map.set(v, (map.get(v) || 0) + 1) + }) + return map + }, new Map()) + return [...lookup.keys()].filter((k) => lookup.get(k) === arr.length) +}