mirror of
https://github.com/seigler/aoc2021
synced 2025-07-26 00:46:09 +00:00
day 19 incomplete
This commit is contained in:
parent
11dfb6e947
commit
c9d3680a69
2 changed files with 254 additions and 0 deletions
9
src/day19/README.md
Normal file
9
src/day19/README.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
# 🎄 Advent of Code 2021 - day 19 🎄
|
||||
|
||||
## Info
|
||||
|
||||
Task description: [link](https://adventofcode.com/2021/day/19)
|
||||
|
||||
## Notes
|
||||
|
||||
...
|
245
src/day19/index.js
Normal file
245
src/day19/index.js
Normal file
|
@ -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)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue