Added day 12
This commit is contained in:
parent
89696e54a5
commit
5cbd3f0a0a
|
@ -1,7 +1,7 @@
|
|||
import std.stdio;
|
||||
|
||||
import day11.part1;
|
||||
import day12.part1;
|
||||
|
||||
void main() {
|
||||
dumboOctopus();
|
||||
passagePathing();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
re-js
|
||||
qx-CG
|
||||
start-js
|
||||
start-bj
|
||||
qx-ak
|
||||
js-bj
|
||||
ak-re
|
||||
CG-ak
|
||||
js-CG
|
||||
bj-re
|
||||
ak-lg
|
||||
lg-CG
|
||||
qx-re
|
||||
WP-ak
|
||||
WP-end
|
||||
re-lg
|
||||
end-ak
|
||||
WP-re
|
||||
bj-CG
|
||||
qx-start
|
||||
bj-WP
|
||||
JG-lg
|
||||
end-lg
|
||||
lg-iw
|
|
@ -0,0 +1,73 @@
|
|||
module day12.part1;
|
||||
|
||||
import std.file;
|
||||
import std.stdio;
|
||||
import std.string;
|
||||
import std.algorithm;
|
||||
import std.conv;
|
||||
import std.array;
|
||||
|
||||
bool isLarge(string name) {
|
||||
return name.toUpper() == name;
|
||||
}
|
||||
|
||||
void registerPath(ref string[][string] paths, string[] caves) {
|
||||
if (caves[0] !in paths) {
|
||||
paths[caves[0]] = [caves[1]];
|
||||
} else {
|
||||
paths[caves[0]] ~= caves[1];
|
||||
}
|
||||
if (caves[1] !in paths) {
|
||||
paths[caves[1]] = [caves[0]];
|
||||
} else {
|
||||
paths[caves[1]] ~= caves[0];
|
||||
}
|
||||
}
|
||||
|
||||
uint[string] getVisitCounts(string[] history) {
|
||||
uint[string] visitCounts;
|
||||
foreach (p; history) {
|
||||
if (p !in visitCounts) {
|
||||
visitCounts[p] = 1;
|
||||
} else {
|
||||
visitCounts[p]++;
|
||||
}
|
||||
}
|
||||
return visitCounts;
|
||||
}
|
||||
|
||||
bool canVisit(string cave, string[] history) {
|
||||
if (cave.isLarge) return true;
|
||||
uint[string] visitCounts = getVisitCounts(history);
|
||||
bool visitedSmallCaveTwice = false;
|
||||
foreach (p, c; visitCounts) {
|
||||
if (!p.isLarge && c > 1) {
|
||||
visitedSmallCaveTwice = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
uint availablePathVisitCount = visitCounts.require(cave, 0);
|
||||
return visitedSmallCaveTwice ? availablePathVisitCount < 1 : availablePathVisitCount < 2;
|
||||
}
|
||||
|
||||
string[][] findPaths(ref string[][string] paths, string cave, string[] history) {
|
||||
if (cave == "end") return [history ~ cave];
|
||||
string[][] nextPaths = [];
|
||||
foreach (availablePath; paths[cave]) {
|
||||
if (availablePath == "start") continue;
|
||||
if (canVisit(availablePath, history ~ cave)) nextPaths ~= findPaths(paths, availablePath, history ~ cave);
|
||||
}
|
||||
return nextPaths;
|
||||
}
|
||||
|
||||
void passagePathing() {
|
||||
string[] pathDescriptors = readText("source/day12/input.txt").strip.split("\n")
|
||||
.map!(s => s.strip).array;
|
||||
string[][string] paths;
|
||||
foreach (desc; pathDescriptors) {
|
||||
registerPath(paths, desc.split("-"));
|
||||
}
|
||||
findPaths(paths, "start", [])
|
||||
.map!(p => p.joiner!(string[], string)(",").to!string)
|
||||
.array.length.writeln;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
start-A
|
||||
start-b
|
||||
A-c
|
||||
A-b
|
||||
b-d
|
||||
A-end
|
||||
b-end
|
|
@ -0,0 +1,10 @@
|
|||
dc-end
|
||||
HN-start
|
||||
start-kj
|
||||
dc-start
|
||||
dc-HN
|
||||
LN-dc
|
||||
HN-end
|
||||
kj-sa
|
||||
kj-HN
|
||||
kj-dc
|
|
@ -0,0 +1,18 @@
|
|||
fs-end
|
||||
he-DX
|
||||
fs-he
|
||||
start-DX
|
||||
pj-DX
|
||||
end-zg
|
||||
zg-sl
|
||||
zg-pj
|
||||
pj-he
|
||||
RW-he
|
||||
fs-DX
|
||||
pj-RW
|
||||
zg-RW
|
||||
start-pj
|
||||
he-WI
|
||||
zg-he
|
||||
pj-fs
|
||||
start-RW
|
Loading…
Reference in New Issue