day 5, part 2!

This commit is contained in:
sejo 2023-12-07 16:04:23 +01:00
parent 6e00934819
commit 8a55c734e3
1 changed files with 57 additions and 45 deletions

View File

@ -1,46 +1,29 @@
--incomplete so far
io.input("input")
seeds = {}
nseeds = {}
ranges = {}
nranges = {}
mapi = 0
for line in io.lines() do
if mapi == 0 then
--[[
for num in line:gmatch("%d+") do
table.insert(seeds,tonumber(num))
for s,r in line:gmatch("(%d+) (%d+)") do
s = tonumber(s)
r = tonumber(r)
table.insert(ranges, {start=s, fin=s+r-1})
end
--]]
--[
for start,range in line:gmatch("(%d+) (%d+)") do
start = tonumber(start)
range = tonumber(range)
for i=start,start+range-1 do
table.insert(seeds,i)
end
end
--]]
end
if line:match("^$") then
if mapi>0 then
-- print("result")
for i, seed in ipairs(seeds) do
if not nseeds[i] then
nseeds[i] = seed
end
-- print(i, seed, "->", nseeds[i])
end
for i,seed in ipairs(nseeds) do
seeds[i] = seed
end
nseeds = {}
-- add new ranges for next iteration
table.move(nranges, 1, #nranges, #ranges+1, ranges)
nranges = {}
end
mapi = mapi + 1
print(mapi)
--print(mapi)
goto continue
end
@ -49,28 +32,57 @@ for line in io.lines() do
end
dst, src, len = line:match("(%d+) (%d+) (%d+)")
dst = tonumber(dst)
src = tonumber(src)
dsts = tonumber(dst)
srcs = tonumber(src)
len = tonumber(len)
-- print(dst, src, len)
dstf = dsts+len-1
srcf = srcs+len-1
--print(dst, src, len, dsts, dstf, srcs, srcf)
for i, seed in ipairs(seeds) do
if seed >= src and seed<src+len then -- transform
diff = seed - src
nseeds[i] = dst + diff
-- print(seed,"->", dst+diff)
--transform
nextranges = {}
repeat
range = table.remove(ranges)
if range then
ns = math.max( range.start, srcs )
nf = math.min( range.fin, srcf )
if ns <= nf then -- intersection
--print("intersect")
diff = nf - ns
offsetsrcs = ns - srcs
offsetdsts = dsts + offsetsrcs
-- transform range
transformed = {start=offsetdsts, fin=offsetdsts+diff}
--print(ns, nf, "->", transformed.start, transformed.fin)
table.insert(nranges, transformed)
-- remainders?
if range.start<ns then
keep = {start=range.start, fin=ns-1}
--print("keep", keep.start, keep.fin)
table.insert(nextranges, keep)
end
if range.fin>nf then
keep = {start=nf+1, fin=range.fin}
--print("keep", keep.start, keep.fin)
table.insert(nextranges, keep)
end
else --range stays as is
table.insert(nextranges, range)
end
end
end
until not range
-- copy next ranges to ranges
table.move(nextranges, 1, #nextranges, 1, ranges)
::continue::
end
print("final")
for i,s in ipairs(seeds) do
if i==1 then min = s
else if s<min then min=s end
end
print(i,s)
end
print("part 1", min)
table.sort(ranges, function(a,b) return a.start < b.start end)
--[[
for i,r in ipairs(ranges) do
print(i, r.start, r.fin)
end
--]]
print("part 2", ranges[1].start)