Add solution day 23
This commit is contained in:
parent
f7a3f19b9b
commit
096208c2e5
32
day_23/example.txt
Normal file
32
day_23/example.txt
Normal file
@ -0,0 +1,32 @@
|
||||
kh-tc
|
||||
qp-kh
|
||||
de-cg
|
||||
ka-co
|
||||
yn-aq
|
||||
qp-ub
|
||||
cg-tb
|
||||
vc-aq
|
||||
tb-ka
|
||||
wh-tc
|
||||
yn-cg
|
||||
kh-ub
|
||||
ta-co
|
||||
de-co
|
||||
tc-td
|
||||
tb-wq
|
||||
wh-td
|
||||
ta-ka
|
||||
td-qp
|
||||
aq-cg
|
||||
wq-ub
|
||||
ub-vc
|
||||
de-ta
|
||||
wq-aq
|
||||
wq-vc
|
||||
wh-yn
|
||||
ka-de
|
||||
kh-ta
|
||||
co-tc
|
||||
wh-qp
|
||||
tb-vc
|
||||
td-yn
|
3380
day_23/input.txt
Normal file
3380
day_23/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
44
day_23/solve_1.ts
Normal file
44
day_23/solve_1.ts
Normal file
@ -0,0 +1,44 @@
|
||||
export type Interconnected = {
|
||||
[key: string]: string[]
|
||||
}
|
||||
|
||||
export async function readData(path: string): Promise<Interconnected> {
|
||||
const data = await Deno.readTextFile(path);
|
||||
return data.trim().split('\n').reduce((acc, line) => {
|
||||
const [key, value] = line.split('-');
|
||||
const original = acc[key] ?? [];
|
||||
acc[key] = [...original, value];
|
||||
// Add the reverse
|
||||
const original2 = acc[value] ?? [];
|
||||
acc[value] = [...original2, key];
|
||||
|
||||
return acc;
|
||||
}, {} as Interconnected);
|
||||
}
|
||||
|
||||
function findConnected3(data: Interconnected, target: string): Set<string> {
|
||||
const connected = new Set<string>();
|
||||
const lst = data[target].toSorted();
|
||||
|
||||
for (let i = 0; i < lst.length; i++) {
|
||||
for (let j = i + 1; j < lst.length; j++) {
|
||||
if (data[lst[i]].includes(lst[j])) {
|
||||
connected.add([target, lst[i], lst[j]].toSorted().join('-'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return connected;
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
const data = await readData('./input.txt');
|
||||
let acc = new Set<string>();
|
||||
for (const key in data) {
|
||||
console.log(key, data[key]);
|
||||
if (!key.startsWith("t")) continue;
|
||||
const connected = findConnected3(data, key);
|
||||
acc = acc.union(connected);
|
||||
}
|
||||
console.log(acc);
|
||||
}
|
53
day_23/solve_2.ts
Normal file
53
day_23/solve_2.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import { readData, Interconnected } from "./solve_1.ts";
|
||||
|
||||
function checkConnected(data: Interconnected, curConnected: Set<string>, target: string): boolean {
|
||||
// console.log(curConnected, target);
|
||||
if (curConnected.has(target)) return true;
|
||||
for (const key of curConnected) {
|
||||
// console.log(key, data[key], target);
|
||||
if (!data[key].includes(target)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function findMaxConnected(data: Interconnected, target: string) {
|
||||
const lst = data[target];
|
||||
|
||||
let connectedSet = new Set<string>();
|
||||
|
||||
for (let i = 0; i < lst.length; i++) {
|
||||
const connected = new Set<string>();
|
||||
connected.add(target);
|
||||
connected.add(lst[i]);
|
||||
for (let j = i+1; j < lst.length; j++) {
|
||||
if (checkConnected(data, connected, lst[j])) {
|
||||
connected.add(lst[j]);
|
||||
}
|
||||
}
|
||||
if (connected.size > connectedSet.size) {
|
||||
connectedSet = connected;
|
||||
}
|
||||
}
|
||||
return connectedSet;
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
const data = await readData('./input.txt');
|
||||
const acc = new Set<string>();
|
||||
for (const key in data) {
|
||||
// console.log(key, data[key]);
|
||||
const connected = findMaxConnected(data, key);
|
||||
acc.add([...connected.keys()].toSorted().join("-"));
|
||||
}
|
||||
console.log(acc);
|
||||
|
||||
const max = [...acc].map(x => {
|
||||
const keys = x.split("-");
|
||||
return {
|
||||
length: keys.length,
|
||||
keys,
|
||||
}
|
||||
}).sort((a, b) => b.length - a.length)[0];
|
||||
console.log(max);
|
||||
const password = max.keys.join(",");
|
||||
console.log(password);
|
||||
}
|
Loading…
Reference in New Issue
Block a user