From 563e354df57b8c45891ede5f094a88f9bf07ef3c Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Mon, 6 Dec 2021 22:02:21 +0100 Subject: [PATCH] use deque in fish solution --- day06/part1.lua | 20 ++++++++++---------- day06/part2.lua | 20 ++++++++++---------- deque.lua | 16 ++++++++++++++++ prepare | 1 + 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/day06/part1.lua b/day06/part1.lua index 581a543..b9daba7 100644 --- a/day06/part1.lua +++ b/day06/part1.lua @@ -1,26 +1,26 @@ #!/usr/bin/env luajit require("utils") +require("deque") -local fishes = {} +local fishes = deque() for timer = 0, 9 do - fishes[timer] = 0 + fishes:append(0) end for _, timer in pairs(split(io.open(arg[3]):read("*a"), ",")) do - fishes[tonumber(timer)] = fishes[tonumber(timer)] + 1 + fishes:set(tonumber(timer), fishes:get(tonumber(timer)) + 1) end for day = 1, 80 do - fishes[9] = (fishes[0] or 0) + (fishes[9] or 0) - fishes[7] = (fishes[0] or 0) + (fishes[7] or 0) - for timer = 0, 9 do - fishes[timer] = fishes[timer + 1] - end + local breeding = fishes:popleft() or 0 + fishes:append(0) + fishes:set(8, (fishes:get(8) or 0) + breeding) + fishes:set(6, (fishes:get(6) or 0) + breeding) end local sum = 0 -for timer, fishday in pairs(fishes) do - sum = sum + fishday +while fishes.size > 0 do + sum = sum + (fishes:pop() or 0) end print(sum) diff --git a/day06/part2.lua b/day06/part2.lua index c0bad9c..ef1646e 100644 --- a/day06/part2.lua +++ b/day06/part2.lua @@ -1,26 +1,26 @@ #!/usr/bin/env luajit require("utils") +require("deque") -local fishes = {} +local fishes = deque() for timer = 0, 9 do - fishes[timer] = 0 + fishes:append(0) end for _, timer in pairs(split(io.open(arg[3]):read("*a"), ",")) do - fishes[tonumber(timer)] = fishes[tonumber(timer)] + 1 + fishes:set(tonumber(timer), fishes:get(tonumber(timer)) + 1) end for day = 1, 256 do - fishes[9] = (fishes[0] or 0) + (fishes[9] or 0) - fishes[7] = (fishes[0] or 0) + (fishes[7] or 0) - for timer = 0, 9 do - fishes[timer] = fishes[timer + 1] - end + local breeding = fishes:popleft() or 0 + fishes:append(0) + fishes:set(8, (fishes:get(8) or 0) + breeding) + fishes:set(6, (fishes:get(6) or 0) + breeding) end local sum = 0 -for timer, fishday in pairs(fishes) do - sum = sum + fishday +while fishes.size > 0 do + sum = sum + (fishes:pop() or 0) end print(sum) diff --git a/deque.lua b/deque.lua index 8d8a4c7..c2bbe29 100644 --- a/deque.lua +++ b/deque.lua @@ -14,6 +14,8 @@ function deque() prepend = prepend, append = append, popleft = popleft, + get = get, + set = set, } end @@ -79,3 +81,17 @@ function popleft(self) return nil end end + +function get(self, i) + if 0 <= i and i < self.size then + return self.elems[(self.start + i) % self.cap] + else + return nil + end +end + +function set(self, i, n) + if 0 <= i and i < self.size then + self.elems[(self.start + i) % self.cap] = n + end +end diff --git a/prepare b/prepare index 821c878..968aff7 100755 --- a/prepare +++ b/prepare @@ -7,6 +7,7 @@ day="$(printf '%02d' "$day")" if test -f "day${day}/part${part}.lua"; then /usr/bin/env luajit -v >/dev/null cp "day${day}/part${part}.lua" run + chmod u+x run elif test -f "day${day}/part${part}.hs"; then #stack build stack ghc -- -O3 "day${day}/part${part}.hs" -o run