From 1feda8609355a108997714fb0c6fa9110e564df9 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Sun, 12 Dec 2021 10:45:16 +0100 Subject: [PATCH] day 12 --- day12/part1.lua | 34 ++++++++++++++++++++++++++++++++++ day12/part2.lua | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100755 day12/part1.lua create mode 100755 day12/part2.lua diff --git a/day12/part1.lua b/day12/part1.lua new file mode 100755 index 0000000..8d67ce8 --- /dev/null +++ b/day12/part1.lua @@ -0,0 +1,34 @@ +#!/usr/bin/env luajit +require("utils") +require("set") + +local graph = {} +local lower = set() +for line in io.lines(arg[3]) do + local a, b = unpack(split(line, "-")) + local as, bs = graph[a] or {}, graph[b] or {} + table.insert(as, b) + table.insert(bs, a) + if string.lower(a) == a then lower:add(a) end + if string.lower(b) == b then lower:add(b) end + graph[a] = as + graph[b] = bs +end + +local function backtrack(i, once) + if i == "end" then + return 1 + else + local paths = 0 + for k, v in pairs(graph[i]) do + if not lower:has(v) or not once:has(v) then + once:add(v) + paths = paths + backtrack(v, once) + once:remove(v) + end + end + return paths + end +end + +print(backtrack("start", set({"start"}))) diff --git a/day12/part2.lua b/day12/part2.lua new file mode 100755 index 0000000..869406b --- /dev/null +++ b/day12/part2.lua @@ -0,0 +1,36 @@ +#!/usr/bin/env luajit +require("utils") +require("set") + +local graph = {} +local lower = set() +for line in io.lines(arg[3]) do + local a, b = unpack(split(line, "-")) + local as, bs = graph[a] or {}, graph[b] or {} + table.insert(as, b) + table.insert(bs, a) + if string.lower(a) == a then lower:add(a) end + if string.lower(b) == b then lower:add(b) end + graph[a] = as + graph[b] = bs +end + +local function backtrack(i, once, smalls) + if i == "end" then + return 1 + else + local paths = 0 + for k, v in pairs(graph[i]) do + if not lower:has(v) or not once:has(v) then + once:add(v) + paths = paths + backtrack(v, once, smalls) + once:remove(v) + elseif smalls > 0 and v ~= "start" and v ~= "end" then + paths = paths + backtrack(v, once, smalls - 1) + end + end + return paths + end +end + +print(backtrack("start", set({"start"}), 1))