day 14, parts 1 and 2!

This commit is contained in:
sejo 2023-12-14 08:02:45 +01:00
parent b36105c595
commit 46dde0d268
2 changed files with 179 additions and 0 deletions

169
12023/14/14.lua Normal file
View File

@ -0,0 +1,169 @@
io.input("input")
r = 0
cols = {}
for line in io.lines() do
if r==0 then
len = #line
for i=1,len do
cols[i] = {}
end
end
r = r+1
for i=1,len do
local c = line:sub(i,i)
cols[i][r] = c
end
end
function tilt(t)
local cols = {}
table.move(t,1,#t,1,cols)
for i=1,len do
--print("\ncol"..i,table.concat(cols[i]))
local o,f=1,1
local done = false
while o<=len-1 do
--print("o",o)
local cs,cr = 0,0
local curr = cols[i][o]
if curr~="." then goto fixed end
f=o+1
done = false
repeat --search for next rock
--print("f",f)
local nxt = cols[i][f]
if nxt=="O" then -- swap?
cols[i][o] = "O"
cols[i][f] = "."
--print("swapped",o,f)
elseif nxt=="#" then --skip
o=f
--print("skipped to",f)
end
f=f+1
until f>len or nxt~="."
if f>len then break end
::fixed::
o=o+1
end
--print("->",table.concat(cols[i]))
end
return cols
end
function get_load(t)
local sum = 0
for i=1,len do
for j=1,len do
local c = t[j][i]
if c=="O" then
local res = len-i+1
sum = sum + res
end
end
end
return sum
end
function print_map(t)
for i=1,len do
local s = ""
for j=1,len do
s = s .. t[i][j]
end
print(s)
end
end
function encode(t)
local s = ""
for i,c in ipairs(t) do
s = s .. table.concat(c)
end
return s
end
newcols = tilt(cols)
sum1 = get_load(newcols)
print("part 1",sum1)
trans = {}
table.move(cols,1,len,1,trans)
history = {}
loads = {}
repeated = 0
exit = 0
for n=1,1000000 do
--print("<N ^W")
newcols = tilt(trans)
-- WEST
--print("<W ^N")
for i=1,len do
trans[i] = {}
for j=1,len do
trans[i][j] = newcols[j][i]
end
end
newcols = tilt(trans)
--SOUTH
--print("<S ^E")
for i=1,len do
trans[i] = {}
for j=1,len do
trans[i][j] = newcols[len-j+1][len-i+1]
end
end
newcols = tilt(trans)
-- EAST
--print("<E ^S")
for i=1,len do
trans[i] = {}
for j=1,len do
trans[i][j] = newcols[j][i]
end
end
newcols = tilt(trans)
--NORTH
--print("<N ^W")
for i=1,len do
trans[i] = {}
for j=1,len do
trans[i][j] = newcols[len-j+1][len-i+1]
end
end
local curr_load = get_load(trans)
--[[
if n%10==1 then
print("N",n)
--print_map(trans)
print(curr_load)
print()
end
--]]
local s = encode(trans)
if not history[s] then
history[s] = n
loads[n] = curr_load
else
exit=n
repeated = history[s]
break
end
end
period = exit-repeated
target = 1000000000
rtarget = target-repeated
modulo = rtarget%period
resultn = repeated + modulo
--print(repeated, exit, period, rtarget%period)
print("part 2", loads[resultn])

10
12023/14/test Normal file
View File

@ -0,0 +1,10 @@
O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....