day 5, part 2!
This commit is contained in:
parent
6e00934819
commit
8a55c734e3
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue