add Day12
This commit is contained in:
parent
326760eb72
commit
2f84c62133
148
Day12/Caves.ts
Normal file
148
Day12/Caves.ts
Normal file
@ -0,0 +1,148 @@
|
||||
import { readLines } from "https://deno.land/std@0.177.1/io/read_lines.ts";
|
||||
|
||||
interface Cave {
|
||||
name: string;
|
||||
LargeNeighbours: number[];
|
||||
SmallNeighbours: number[];
|
||||
big: boolean;
|
||||
}
|
||||
|
||||
async function Part1() {
|
||||
const file = await Deno.open("./Day12/input.txt");
|
||||
const lines = readLines(file);
|
||||
|
||||
const smallCaves: Cave[] = [];
|
||||
const bigCaves: Cave[] = [];
|
||||
|
||||
for await (const line of lines) {
|
||||
const [start,end] = line.split("-");
|
||||
addCave(smallCaves,bigCaves,start)
|
||||
addCave(smallCaves,bigCaves,end)
|
||||
addNeighbour(smallCaves,bigCaves,start,end)
|
||||
}
|
||||
|
||||
const visited: boolean[] = [];
|
||||
let curr = smallCaves[0];
|
||||
for (const i in smallCaves) {
|
||||
visited.push(false)
|
||||
if (smallCaves[i].name == "start") {
|
||||
visited[i] = true;
|
||||
curr = smallCaves[i]
|
||||
}
|
||||
}
|
||||
|
||||
return DFS(curr, visited, 0, smallCaves, bigCaves);
|
||||
}
|
||||
|
||||
async function Part2() {
|
||||
const file = await Deno.open("./Day12/input.txt");
|
||||
const lines = readLines(file);
|
||||
|
||||
const smallCaves: Cave[] = [];
|
||||
const bigCaves: Cave[] = [];
|
||||
|
||||
for await (const line of lines) {
|
||||
const [start,end] = line.split("-");
|
||||
addCave(smallCaves,bigCaves,start)
|
||||
addCave(smallCaves,bigCaves,end)
|
||||
addNeighbour(smallCaves,bigCaves,start,end)
|
||||
}
|
||||
|
||||
const visited: boolean[] = [];
|
||||
let curr = smallCaves[0];
|
||||
for (const i in smallCaves) {
|
||||
visited.push(false)
|
||||
if (smallCaves[i].name == "start") {
|
||||
visited[i] = true;
|
||||
curr = smallCaves[i]
|
||||
}
|
||||
}
|
||||
return DFS2(curr, visited, 0, smallCaves, bigCaves, false);
|
||||
|
||||
}
|
||||
|
||||
console.log("Part1: " + await Part1());
|
||||
console.log("Part2: " + await Part2());
|
||||
|
||||
function DFS(curr: Cave, visited: boolean[], paths: number, smallCaves: Cave[], bigCaves: Cave[]) {
|
||||
if (curr.name == "end") {
|
||||
return ++paths;
|
||||
}
|
||||
for (const i of curr.LargeNeighbours) {
|
||||
paths = DFS(bigCaves[i],visited,paths,smallCaves,bigCaves)
|
||||
}
|
||||
for (const i of curr.SmallNeighbours) {
|
||||
if (visited[i]) {
|
||||
continue
|
||||
}
|
||||
const VisitedCopy = Array.from(visited);
|
||||
VisitedCopy[i] = true;
|
||||
paths = DFS(smallCaves[i],VisitedCopy,paths,smallCaves,bigCaves)
|
||||
}
|
||||
return paths;
|
||||
}
|
||||
|
||||
function DFS2(curr: Cave, visited: boolean[], paths: number, smallCaves: Cave[], bigCaves: Cave[], twice: boolean) {
|
||||
if (curr.name == "end") {
|
||||
return ++paths;
|
||||
}
|
||||
for (const i of curr.LargeNeighbours) {
|
||||
paths = DFS2(bigCaves[i],visited,paths,smallCaves,bigCaves,twice)
|
||||
}
|
||||
for (const i of curr.SmallNeighbours) {
|
||||
if (visited[i] && twice) {
|
||||
continue
|
||||
}
|
||||
if (smallCaves[i].name == "start") {
|
||||
continue
|
||||
}
|
||||
const VisitedCopy = Array.from(visited);
|
||||
VisitedCopy[i] = true;
|
||||
const TwiceCopy = visited[i] || twice
|
||||
paths = DFS2(smallCaves[i],VisitedCopy,paths,smallCaves,bigCaves, TwiceCopy)
|
||||
}
|
||||
return paths;
|
||||
}
|
||||
|
||||
|
||||
function addCave(smallCaves: Cave[], bigCaves: Cave[], c: string) {
|
||||
let list = (c == c.toUpperCase()) ? bigCaves : smallCaves;
|
||||
for (const d of list) {
|
||||
if (d.name == c) {
|
||||
return
|
||||
}
|
||||
}
|
||||
list.push({
|
||||
name: c,
|
||||
LargeNeighbours: [],
|
||||
SmallNeighbours: [],
|
||||
big: c == c.toUpperCase()
|
||||
})
|
||||
}
|
||||
|
||||
function addNeighbour(smallCaves: Cave[], bigCaves: Cave[], s: string, t: string) {
|
||||
const slist = (s == s.toUpperCase()) ? bigCaves : smallCaves;
|
||||
const tlist = (t == t.toUpperCase()) ? bigCaves : smallCaves;
|
||||
let sIndex = 0
|
||||
let tIndex = 0
|
||||
for (const c in slist) {
|
||||
if (slist[c].name == s) {
|
||||
sIndex = +c;
|
||||
break
|
||||
}
|
||||
}
|
||||
for (const d in tlist) {
|
||||
if (tlist[d].name == t) {
|
||||
tIndex = +d;
|
||||
break
|
||||
}
|
||||
}
|
||||
const sgoal = (t == t.toUpperCase()) ? slist[sIndex].LargeNeighbours : slist[sIndex].SmallNeighbours;
|
||||
const tgoal = (s == s.toUpperCase()) ? tlist[tIndex].LargeNeighbours : tlist[tIndex].SmallNeighbours;
|
||||
if (!sgoal.includes(+tIndex)) {
|
||||
sgoal.push(+tIndex)
|
||||
}
|
||||
if (!tgoal.includes(+sIndex)) {
|
||||
tgoal.push(+sIndex)
|
||||
}
|
||||
}
|
||||
22
Day12/input.txt
Normal file
22
Day12/input.txt
Normal file
@ -0,0 +1,22 @@
|
||||
EO-jc
|
||||
end-tm
|
||||
jy-FI
|
||||
ek-EO
|
||||
mg-ek
|
||||
jc-jy
|
||||
FI-start
|
||||
jy-mg
|
||||
mg-FI
|
||||
jc-tm
|
||||
end-EO
|
||||
ds-EO
|
||||
jy-start
|
||||
tm-EO
|
||||
mg-jc
|
||||
ek-jc
|
||||
tm-ek
|
||||
FI-jc
|
||||
jy-EO
|
||||
ek-jy
|
||||
ek-LT
|
||||
start-mg
|
||||
Loading…
x
Reference in New Issue
Block a user