12 changed files with 743 additions and 0 deletions
			
			
		@ -0,0 +1,145 @@ | 
				
			|||
function get_param(state, arg) | 
				
			|||
    local param_mode = state.mem[state.pos] // (10 ^ (arg + 1)) % 10 | 
				
			|||
    if #state.mem < state.pos + arg then | 
				
			|||
        print(string.format("Error: Opcode too short at end of memory: %d", state.pos)) | 
				
			|||
        os.exit(false) | 
				
			|||
    end | 
				
			|||
    local arg = state.mem[state.pos + arg] | 
				
			|||
    if param_mode == 0 then | 
				
			|||
        arg = arg + 1 | 
				
			|||
    elseif param_mode == 2 then | 
				
			|||
        arg = arg + state.relbase | 
				
			|||
    end | 
				
			|||
    return arg | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function read_mem(state, arg) | 
				
			|||
    local param_mode = state.mem[state.pos] // (10 ^ (arg + 1)) % 10 | 
				
			|||
    local arg = get_param(state, arg) | 
				
			|||
    if param_mode == 1 then | 
				
			|||
        return arg | 
				
			|||
    end | 
				
			|||
    arg = state.mem[arg] | 
				
			|||
    if not arg then | 
				
			|||
        return 0 | 
				
			|||
    end | 
				
			|||
    return arg | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function write_mem(state, arg, val) | 
				
			|||
    local param_mode = state.mem[state.pos] // (10 ^ (arg + 1)) % 10 | 
				
			|||
    local arg = get_param(state, arg) | 
				
			|||
    if param_mode == 1 then | 
				
			|||
        print(string.format("Error: Invalid inmediate write: %d", arg)) | 
				
			|||
    end | 
				
			|||
    state.mem[arg] = val | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function interpret(state) | 
				
			|||
    if not state.mem then | 
				
			|||
        state.mem = state | 
				
			|||
    end | 
				
			|||
    if not state.pos then | 
				
			|||
        state.pos = 1 | 
				
			|||
        state.relbase = 1 | 
				
			|||
    end | 
				
			|||
    if not state.input then | 
				
			|||
        state.input = input_stdin | 
				
			|||
    end | 
				
			|||
    if not state.output then | 
				
			|||
        state.output = output_stdout | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    while true do | 
				
			|||
        if #state.mem < state.pos then | 
				
			|||
            print(string.format("Instruction pointer ran off of memory")) | 
				
			|||
            os.exit(false) | 
				
			|||
        end | 
				
			|||
 | 
				
			|||
        local opcode = state.mem[state.pos] % 100 | 
				
			|||
        local instr_size = 1 | 
				
			|||
 | 
				
			|||
        if opcode == 1 then | 
				
			|||
            write_mem(state, 3, read_mem(state, 1) + read_mem(state, 2)) | 
				
			|||
            instr_size = 4 | 
				
			|||
        elseif opcode == 2 then | 
				
			|||
            write_mem(state, 3, read_mem(state, 1) * read_mem(state, 2)) | 
				
			|||
            instr_size = 4 | 
				
			|||
        elseif opcode == 3 then | 
				
			|||
            local val = state.input() | 
				
			|||
            if not val then return true end | 
				
			|||
            write_mem(state, 1, val) | 
				
			|||
            instr_size = 2 | 
				
			|||
        elseif opcode == 4 then | 
				
			|||
            state.output(read_mem(state, 1)) | 
				
			|||
            instr_size = 2 | 
				
			|||
        elseif opcode == 5 then | 
				
			|||
            instr_size = 3 | 
				
			|||
            if read_mem(state, 1) ~= 0 then | 
				
			|||
                state.pos = read_mem(state, 2) + 1 | 
				
			|||
                instr_size = 0 | 
				
			|||
            end | 
				
			|||
        elseif opcode == 6 then | 
				
			|||
            instr_size = 3 | 
				
			|||
            if read_mem(state, 1) == 0 then | 
				
			|||
                state.pos = read_mem(state, 2) + 1 | 
				
			|||
                instr_size = 0 | 
				
			|||
            end | 
				
			|||
        elseif opcode == 7 then | 
				
			|||
            write_mem(state, 3, read_mem(state, 1) < read_mem(state, 2) and 1 or 0) | 
				
			|||
            instr_size = 4 | 
				
			|||
        elseif opcode == 8 then | 
				
			|||
            write_mem(state, 3, read_mem(state, 1) == read_mem(state, 2) and 1 or 0) | 
				
			|||
            instr_size = 4 | 
				
			|||
        elseif opcode == 9 then | 
				
			|||
            state.relbase = state.relbase + read_mem(state, 1) | 
				
			|||
            instr_size = 2 | 
				
			|||
        elseif opcode == 99 then | 
				
			|||
            return false | 
				
			|||
        else | 
				
			|||
            print(string.format("Error: Invalid opcode %d at %d", opcode, state.pos - 1)) | 
				
			|||
            os.exit(false) | 
				
			|||
        end | 
				
			|||
 | 
				
			|||
        state.pos = state.pos + instr_size | 
				
			|||
    end | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function input_stdin() | 
				
			|||
    io.stdout:write("> ") | 
				
			|||
    return io.stdin:read("n") | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function output_stdout(val) | 
				
			|||
    io.stdout:write(val) | 
				
			|||
    io.stdout:write("\n") | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function input_array(array) | 
				
			|||
    function inner() | 
				
			|||
        return table.remove(array, 1) | 
				
			|||
    end | 
				
			|||
    return inner | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function output_array(array) | 
				
			|||
    function inner(val) | 
				
			|||
        table.insert(array, val) | 
				
			|||
    end | 
				
			|||
    return inner | 
				
			|||
end | 
				
			|||
 | 
				
			|||
file = io.open(arg[1]) | 
				
			|||
program = {} | 
				
			|||
for num in string.gmatch(file:read(), "(-?%d+),?") do | 
				
			|||
    table.insert(program, tonumber(num)) | 
				
			|||
end | 
				
			|||
file:close() | 
				
			|||
 | 
				
			|||
--interpret(program) | 
				
			|||
 | 
				
			|||
robot_input = {} | 
				
			|||
robot_output = {} | 
				
			|||
while interpret({mem=program, input=input_array(robot_input), output=output_array(robot_output)}) do | 
				
			|||
 | 
				
			|||
end | 
				
			|||
@ -0,0 +1,53 @@ | 
				
			|||
moons = {} | 
				
			|||
for line in io.lines(arg[1]) do | 
				
			|||
    x, y, z = line:match("<x=(-?%d+), +y=(-?%d+), +z=(-?%d+)>") | 
				
			|||
    table.insert(moons, {pos={x=tonumber(x), y=tonumber(y), z=tonumber(z)}, vel={x=0, y=0, z=0}}) | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function update_vel(moon) | 
				
			|||
    for _, omoon in ipairs(moons) do | 
				
			|||
        for _, axis in ipairs({"x", "y", "z"}) do | 
				
			|||
            if omoon.pos[axis] > moon.pos[axis] then | 
				
			|||
                moon.vel[axis] = moon.vel[axis] + 1 | 
				
			|||
            end | 
				
			|||
            if omoon.pos[axis] < moon.pos[axis] then | 
				
			|||
                moon.vel[axis] = moon.vel[axis] - 1 | 
				
			|||
            end | 
				
			|||
        end | 
				
			|||
    end | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function update_pos(moon) | 
				
			|||
    moon.pos.x = moon.pos.x + moon.vel.x | 
				
			|||
    moon.pos.y = moon.pos.y + moon.vel.y | 
				
			|||
    moon.pos.z = moon.pos.z + moon.vel.z | 
				
			|||
end | 
				
			|||
 | 
				
			|||
print("After 0 steps:") | 
				
			|||
for _, moon in ipairs(moons) do | 
				
			|||
    print(string.format("pos=<x=%d, y=%d, z=%d>, vel=<x=%d, y=%d, z=%d>", moon.pos.x, moon.pos.y, moon.pos.z, moon.vel.x, moon.vel.y, moon.vel.z)) | 
				
			|||
end | 
				
			|||
print() | 
				
			|||
for i = 1, 10 do | 
				
			|||
    for _, moon in ipairs(moons) do | 
				
			|||
        update_vel(moon) | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    for _, moon in ipairs(moons) do | 
				
			|||
        update_pos(moon) | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    print(string.format("After %d steps:", i)) | 
				
			|||
    for _, moon in ipairs(moons) do | 
				
			|||
        print(string.format("pos=<x=%d, y=%d, z=%d>, vel=<x=%d, y=%d, z=%d>", moon.pos.x, moon.pos.y, moon.pos.z, moon.vel.x, moon.vel.y, moon.vel.z)) | 
				
			|||
    end | 
				
			|||
    print() | 
				
			|||
end | 
				
			|||
 | 
				
			|||
energy = 0 | 
				
			|||
for _, moon in ipairs(moons) do | 
				
			|||
    pot = math.abs(moon.pos.x) + math.abs(moon.pos.y) + math.abs(moon.pos.z) | 
				
			|||
    kin = math.abs(moon.vel.x) + math.abs(moon.pos.y) + math.abs(moon.pos.z) | 
				
			|||
    energy = energy + pot * kin | 
				
			|||
end | 
				
			|||
print("Energy:", energy) | 
				
			|||
@ -0,0 +1,74 @@ | 
				
			|||
width = nil | 
				
			|||
map = {} | 
				
			|||
for line in io.lines(arg[1]) do | 
				
			|||
    if not width then | 
				
			|||
        width = #line | 
				
			|||
    end | 
				
			|||
    for char in line:gmatch(".") do | 
				
			|||
        table.insert(map, char) | 
				
			|||
    end | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function reachable_keys(map, pos_y, pos_x, keys, dist) | 
				
			|||
    local cell = map[width * pos_y + pos_x] | 
				
			|||
    if cell == "@" then | 
				
			|||
        cell = "." | 
				
			|||
    end | 
				
			|||
    if cell == "." then | 
				
			|||
        map[width * pos_y + pos_x] = "#" | 
				
			|||
        reachable_keys(map, pos_y + 1, pos_x, keys, dist + 1) | 
				
			|||
        reachable_keys(map, pos_y - 1, pos_x, keys, dist + 1) | 
				
			|||
        reachable_keys(map, pos_y, pos_x + 1, keys, dist + 1) | 
				
			|||
        reachable_keys(map, pos_y, pos_x - 1, keys, dist + 1) | 
				
			|||
    elseif string.byte(cell) >= 97 and string.byte(cell) <= 122 then | 
				
			|||
        table.insert(keys, {key=cell, y=pos_y, x=pos_x, dist=dist}) | 
				
			|||
    end | 
				
			|||
    return keys | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function find_paths(map, pos_y, pos_x) | 
				
			|||
    local keys = reachable_keys({table.unpack(map)}, pos_y, pos_x, {}, 0) | 
				
			|||
    local paths = {} | 
				
			|||
    for _, key in ipairs(keys) do | 
				
			|||
        --print(key.key, key.dist) | 
				
			|||
        local open_map = {table.unpack(map)} | 
				
			|||
        open_map[width * pos_y + pos_x] = "." | 
				
			|||
        open_map[width * key.y + key.x] = "@" | 
				
			|||
        for i, x in ipairs(open_map) do | 
				
			|||
            if x:lower() == key.key then | 
				
			|||
                open_map[i] = "." | 
				
			|||
                break | 
				
			|||
            end | 
				
			|||
        end | 
				
			|||
        local path = find_paths(open_map, key.y, key.x) | 
				
			|||
        if #path == 0 then | 
				
			|||
            table.insert(paths, {path={key.key}, dist=key.dist}) | 
				
			|||
        else | 
				
			|||
            for _, p in ipairs(path) do | 
				
			|||
                table.insert(p.path, key.key) | 
				
			|||
                p.dist = p.dist + key.dist | 
				
			|||
                table.insert(paths, p) | 
				
			|||
            end | 
				
			|||
        end | 
				
			|||
    end | 
				
			|||
    return paths | 
				
			|||
end | 
				
			|||
 | 
				
			|||
pos_y = nil | 
				
			|||
pos_x = nil | 
				
			|||
for i, x in ipairs(map) do | 
				
			|||
    if x == "@" then | 
				
			|||
        pos_y = i // width | 
				
			|||
        pos_x = i % width | 
				
			|||
        break | 
				
			|||
    end | 
				
			|||
end | 
				
			|||
 | 
				
			|||
paths = find_paths(map, pos_y, pos_x) | 
				
			|||
smallest = nil | 
				
			|||
for _, path in ipairs(paths) do | 
				
			|||
    if not smallest or smallest.dist > path.dist then | 
				
			|||
        smallest = path | 
				
			|||
    end | 
				
			|||
end | 
				
			|||
print(table.concat(smallest.path, ","), smallest.dist) | 
				
			|||
@ -0,0 +1,81 @@ | 
				
			|||
################################################################################# | 
				
			|||
#...#.........P...................#.....#.........#.......#.........#...........# | 
				
			|||
#.###.#############.#.###########.#.#.###.#########.###.###.#######.#.########### | 
				
			|||
#.#...#.#...V.....#.#..t..#.......#.#..a#...........#.#..c..#...#.#.#...........# | 
				
			|||
#.#.###.#.#######.#####.#.#####.#######.#.###########.#######.#.#.#.###########.# | 
				
			|||
#...#...#...#.#...#.J.#.#.....#.........#.......#.......#.....#.#.#.......#...#.# | 
				
			|||
#Z###.#####.#.#.###.#.###.###.#################.#.###.#.#.#####.#.#######.#.#.#.# | 
				
			|||
#.....#...#.#.......#...#...#.#...#.....#...#.#.#.#...#.#...#.....#.......#.#.#.# | 
				
			|||
###.###.#.#.###########.###.#.#.#.#.###.#.#.#.#.#.#.###.###.#######.#######.#.#.# | 
				
			|||
#.#.#...#..y#.........#...#.#...#...#...#.#...#.#.#.#.......#.......#.......#...# | 
				
			|||
#.#.#.#######.#######.###.#######.###.###.###.#.###.#######.#.#######.#########.# | 
				
			|||
#.#.#..q........#.....#.#...#.E.#...#...#.#...#...#.....#.#.#.#...........#...#.# | 
				
			|||
#.#.#############.#####.###.#.#.#######.#.###.###.#.###.#.#.#.#####.#####.#.#.#.# | 
				
			|||
#.#...F.......#...#...#.......#.........#...#.#...#.#...#.#.#.....#.#.....#.#...# | 
				
			|||
#.#########.###.###.#S###################.#I###.#####.###.#.#####.#.#.#########.# | 
				
			|||
#...#...#...#...#...#....u......#.#.....#.#...#.#...#.#...#.....#.#.#.#.......#.# | 
				
			|||
#.###.#.#.###.###.#############.#.#.###.#####.#.#.#.#.#.#######.#.#.#.#.#####.#.# | 
				
			|||
#.#...#.#.#.#.#s..#...#hG.#...#.#.#...#.#.....#...#...#.#.......#.#.#...#...#.#.# | 
				
			|||
#.#.###.#.#.#O#.###.#.#.#.#.#.#.#.#.###.#.###.#########.#.#######.###.###.###.#.# | 
				
			|||
#m..#.#...#.#.#.#...#...#...#g#.#.#.#...#.#.#.#.........#.#.#...#...#.....#...#.# | 
				
			|||
#.###.#####.#.#.#H###########.#.#.#.#.###.#.#.###.#.#####.#.#.#.#.#.#.#####.###.# | 
				
			|||
#.#.........#...#.....#...#...#.#...#...#.#...#...#.#...#.#.#.#.#.#.#.#..w#.#.#.# | 
				
			|||
#.#.#####.#.#############.#.###U###.###.#.#.###.###.#.#.#.#.###.###.#.#.#.#.#.#.# | 
				
			|||
#.#.....#.#.#.....#.......#.#.....#.#...#.#.....#...#.#.#.#...#...#.#.#.#...#...# | 
				
			|||
#.#######.#.###.#.#####.###.#####.###.#.#.#######.###.#.#.#.#####.#.###.#####.### | 
				
			|||
#.#.......#.....#.....#...#.#...#b#...#.#.#.#.....#...#.....#.....#...#.#.....#.# | 
				
			|||
#.#.#################.#.#.#.#.#.#.#.###.#.#.#.#####.#########.#######.#.#.#####.# | 
				
			|||
#.#.#.......#.......#.#.#.#.B.#...#.#.#.#.#.....#...#.....#...#.......#.#...#...# | 
				
			|||
#.#.#.#######.###.###.#.#.#########.#.#.#.#######.###.#.###.#####.#.###N###.#.### | 
				
			|||
#.#.#...#.....#...#...#.#...........#.#.#.......#.#...#.#...#...#.#.#...#...#...# | 
				
			|||
#.#.#.#.#.#####.###.###.###########.#.#.#.#####.#.#.###.#.###.#.###.#.###.###.#.# | 
				
			|||
#...#.#.#.#...#.....#.#.#...#.......#...#.#..r#...#.#...#.....#.....#.#.#...#.#.# | 
				
			|||
#######.#.###.#######.#.###.#.#######.###.###.#######.#.#############.#.###.#.#.# | 
				
			|||
#.......#...#.......#.#...#.#.#.....#.#.#.....#.......#.......#.......#...#.#.#.# | 
				
			|||
###.###.###.#.#####.#.###.#.#.###.#.#.#.#####.#.#.###########.###.#####.#.#.###.# | 
				
			|||
#...#...#...#...#.#.#.......#...#.#.#.#.#.#...#.#...#...#...#...#.#.....#.#...#.# | 
				
			|||
#D###.###.###.#.#.#.###########.#.###.#.#.#.###.###.#.#.#.#.###.#.#.###.#####.#.# | 
				
			|||
#...#...#.#...#.#.#...........#.#.#...#.#...#...#...#.#...#...#...#.#.#.......#.# | 
				
			|||
#.#.#####.#####.#.###########.#.#.#.###.#.#######.###.#######.#####.#.#########.# | 
				
			|||
#.#.............#...............#.................#.........#.................M.# | 
				
			|||
#######################################.@.####################################### | 
				
			|||
#.#...#.......#...............................#.........#.........#..d#...#.....# | 
				
			|||
#.#.#.#.#####.#.#######################.###.#.#.#######.#.###.###.###.#.#.#.#.#K# | 
				
			|||
#...#...#...#.#.#...#.................#.#...#.#.#.#.....#...#.#.#.....#.#...#.#.# | 
				
			|||
#.#########.#.#.#.#.#.###############.#.#.###.#.#.#.#########.#.#####.#.#####.### | 
				
			|||
#.....#...#.#.#.#.#.#.#...#.........#...#.#...#.#.#.......#...#.#.....#.....#...# | 
				
			|||
#####.#.#.#.#.#.#.#.#.#.#.#.#####.#####.#.#.###.#.#######.#.###.#.#########.###.# | 
				
			|||
#...#.#.#...#.....#.#.#.#.#...#...#...#.#.#.#...#...........#.....#.......#.#...# | 
				
			|||
#.#.#.#.###.#########.#.#.###.#####.#.#.#.#.###.###.###########.###.###.###.#.#.# | 
				
			|||
#.#.#...#.W...#.......#.#...#.......#.#.#.#...#...#.#...#.#...#.#...#l#.#...#.#.# | 
				
			|||
#.###.#########.#######.###.#.#######.#.#.###.###.#.#.#.#.#.#.###.###.#.#.###.#.# | 
				
			|||
#.....#.........#...#...#...#.......#...#.#...#...#...#...#.#.#.......#.#...#.#.# | 
				
			|||
#.#####.#######.#.#.#.###.###.#####.#####.###.#.#####.#####.#.#.#######.###.#.### | 
				
			|||
#.#...#.#.....#.#.#...#...#...#...#.....#...#.R.#...#.#.....#.....#...#...#x#...# | 
				
			|||
#.#.#.#.###.###.#.#####.#######.#.#######.#.#####.#.###.###########.#.#.###.###.# | 
				
			|||
#...#.#...#...#.#.#...#...#...#.#.#.....#.#.#.....#.#...#.#.........#.#.......#.# | 
				
			|||
#####.###.###.#.#.###.###.#.#.#.#.#.###.#.#.#.#####.#.###.#.#########.#.#######.# | 
				
			|||
#...#...#...#...#...#.......#...#.#...#.#.#...#.#...#.....#.#.......#.#.#.......# | 
				
			|||
###.###.###.###.###.#############.###.#.#.#####.#.#######.#.#.#.#####Y###.#####.# | 
				
			|||
#...#.....#...#...#.......#.#...#.....#.#.#..i..#.......#.#.#.#.......#...#.#...# | 
				
			|||
#.###.#######.###.#######.#.#.#.#######.#.#.###.#####.###.#Q###.#######.###.#.### | 
				
			|||
#...#.#.......#..n#.#.....#...#...#.....#.#.#...#...#.#...#.#.#.#...#...#.#...#.# | 
				
			|||
#.#.#.#.###.#####.#.#######.#####.#.#####.#.#.###.###.#.###.#.#.#.#.#.###.#.###.# | 
				
			|||
#.#...#.#...#...#.....#...#.#...#...#...#...#...#.#...#...#..o#...#.#.#.......#.# | 
				
			|||
#.#####.#####.#.#######.#.#.#.#.#####.#.#######.#.#.###.###########.#.#######.#.# | 
				
			|||
#.....#...#...#.#.......#.#.#.#.....#.#.#.....#.#.#.....#.........#.#.#...#.....# | 
				
			|||
#####L###.#.###.#.#######.#.###.###.###.###.#.#.#.#######.#.#####.#.#.#.#.####### | 
				
			|||
#...#.#...#.#...#...#...#.#...#.#.......#...#.#...#.....#.#.....#.#.#.#.#.......# | 
				
			|||
#.#.#.#.###.#.#.###.#.#.#.###.#.#######.#.#######.#.#.###.#####.###.#.#.#######.# | 
				
			|||
#.#.#.#.....#.#.#...#.#.....#.#.......#.#.......#...#.#...#..j..#..v#.........#.# | 
				
			|||
#.#.#.#######.#.#.###.#.#####.###.###.###.#####.###.###.###.###.#.###.#########.# | 
				
			|||
#.#.#.#...#...#.#...#.#.#...#...#...#...#...#.#.#...#...#.#.#...#.#.#.#.........# | 
				
			|||
###.#.#.#.#.#######.#.###.#.###.#####.#.###.#.#.#.###.###.#.#####.#.#.#.#######.# | 
				
			|||
#...#...#.#.........#.....#...#.....#f#.#.....#.....#e..#.#.......#.#.#.#.#...#.# | 
				
			|||
#.#######.#################.#.#####.###.#.#############A#.#########.#.#.#.#.#.#.# | 
				
			|||
#...#.....#.....#...#.....#.#.....#.....#...#...#.....#...#...#.......#.#.#.#..z# | 
				
			|||
#.#.#.#####.###.###.#.###C#.###########.###.#.#T#.#.#####.#.###.#######.#.#.##### | 
				
			|||
#.#.#.X.#k..#.#...#...#...#.....#.....#.#...#.#...#.......#.....#....p..#...#...# | 
				
			|||
#.#.###.###.#.###.#####.#.#####.#.#.###.#.###.###################.#######.###.#.# | 
				
			|||
#.#.........#...........#.....#...#.....#...#.....................#...........#.# | 
				
			|||
################################################################################# | 
				
			|||
@ -0,0 +1,125 @@ | 
				
			|||
                                     Q           I     B   S     J     P   J                                          | 
				
			|||
                                     I           P     B   L     M     Q   H                                          | 
				
			|||
  ###################################.###########.#####.###.#####.#####.###.#######################################   | 
				
			|||
  #.#...#.........#.#...#.#...#.....#...#.#.#.#.#...#.....#.......#.....#.........#...#.........#.#.....#...#.....#   | 
				
			|||
  #.#.###.###.###.#.###.#.###.#.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.#.###.#.#####.#.#.#.#########.#.#####.###.###.#   | 
				
			|||
  #.........#.#.................#.#...#.....#.#.#.#...#...#.#.#.#.#.#...#.#...#.....#.#.............#.....#...#.#.#   | 
				
			|||
  ###############.###.#.###.###.###.###.#####.#.#.#.#####.#####.#.#.#########.#########.###.#####.#####.#.#.#.#.###   | 
				
			|||
  #.............#.#...#.#.....#.#.........#.#...#.....#.......#.#.#.......#.......#...#.#...#...#.#.#...#...#.#.#.#   | 
				
			|||
  #########.###.#######.#.#.#######.#####.#.#.#.#.#######.###.###.#####.#.#.###.###.###.#####.#####.#.###.#####.#.#   | 
				
			|||
  #.........#.........#.#.#.#...#...#.....#...#.#.#...#.#...#.#.#.#...#.#.#.#.#.#...#.#...#...#.......#.#.#...#.#.#   | 
				
			|||
  ###############.###.#######.#########.#.#.###.#.###.#.#.###.#.#.#.#.###.#.#.#####.#.#.###.###.#######.#####.#.#.#   | 
				
			|||
  #.#...#.#.#.....#.......#.....#.#...#.#.#.#.......#.#.....#.#...#.#.....#...#.#.#.#...#.#.....#.#.#.......#.#.#.#   | 
				
			|||
  #.#.###.#.#.#########.#######.#.#.###.###.###.#.#.#.###.###.###.#.###.###.#.#.#.#.#.###.#.#.#.#.#.#.#######.#.#.#   | 
				
			|||
  #...........#.........#.#.#...........#.....#.#.#.#.......#.#...#.#.#.#...#...............#.#.#.........#.......#   | 
				
			|||
  #######.#########.###.#.#.#######.#######.###.#.#.###.#.#######.#.#.###.#######.#######.#######.#########.#####.#   | 
				
			|||
  #.#...#.#...#.#.#.#.........#...#.......#...#.#.#.#.#.#...#.#...#.....#...#.....#...#.#.#...#.#.#.#.#.#.......#.#   | 
				
			|||
  #.#.#######.#.#.#####.###.#.###.#.#####.#.#####.#.#.#.#.###.#.#.#.###.#####.###.#.#.#.###.###.#.#.#.#.###.#.#####   | 
				
			|||
  #.#.......#.#.........#...#.........#.#.#.#.#...#...#.#...#...#.#.#...#.....#.#...#.#.#...#...#.......#.#.#.#.#.#   | 
				
			|||
  #.#.#.#.###.###.#.#.#.#####.#.#.#####.#.#.#.###########.#####.#.#.#######.###.#.#.###.###.#.###.#######.#.###.#.#   | 
				
			|||
  #.#.#.#...#.#.#.#.#.#.#.#...#.#.#.......#.#.#.#.#.#.#...#.....#.#...#...#.....#.#.#.#.....#.#...........#...#...#   | 
				
			|||
  #.#####.###.#.#########.#.###.#######.#.#.#.#.#.#.#.###.###.###.###.#.#####.#####.#.#####.#.###.###.###.#.###.#.#   | 
				
			|||
  #.#.........#.#.#.#.#...#.#.#.....#.#.#.#...#...#.......#...#.....#...#.#.......#.#.#.#.....#.....#...#.#.....#.#   | 
				
			|||
  #.#####.#####.#.#.#.#.#####.#######.###.#.#.#.#.###.###.###.###.###.###.#.#########.#.###.#####.#.#######.#######   | 
				
			|||
  #.#...#.#.#.#...#.....#.#.#.#.#.#.#.#.#.#.#...#.#.....#.#.#.#.....#.....#...#.........#.#.#.#.#.#.#.#.#...#...#.#   | 
				
			|||
  #.#.###.#.#.#.#######.#.#.#.#.#.#.#.#.#.###.###.#.#####.#.#####.#######.###.#.#.#.#####.#.#.#.#.###.#.###.#.#.#.#   | 
				
			|||
  #.#...........#...#.#.....#.#.#.........#...#...#.....#.#...#.#...#.....#.....#.#.#.#...#...#.....#...#.....#...#   | 
				
			|||
  #.#.###.#########.#.#.#####.#.###.#.###.###.#.#####.#####.###.#.#.#.#.###.#####.###.###.#.###.#####.#####.#######   | 
				
			|||
  #...#.#.....#.#...#.#.#.....#.#.#.#.#.....#.#...#.......#.......#.#.#...#.....#.#.........#.#.#.#.....#.#...#.#.#   | 
				
			|||
  ###.#.#######.#.###.#.#####.#.#.#######.#.###.###.#.#####.#########.###.#.#########.###.###.#.#.#.#####.#.###.#.#   | 
				
			|||
  #.#.#.......#.....#.#...#.#.....#.#.....#.#...#.#.#.#.......#...#.#...#.#.#.#.....#.#.#...#.#.......#.......#.#.#   | 
				
			|||
  #.#.#.#######.###.#.#.###.#.#####.###.#.#####.#.###.#.#####.#.#.#.#.#.###.#.###.#####.###.#.#.###.###.#.#####.#.#   | 
				
			|||
  #...#.#.#...#...#.#...#...#.#.#.......#...#.....#...#...#.....#...#.#.#.............#.#.#.#...#.#.#.#.#.....#...#   | 
				
			|||
  ###.#.#.###.#####.#.###.###.#.#########.#######.#.#######.#####.###.#########.#######.#.#.#.#.#.###.###.#######.#   | 
				
			|||
  #.......#.....#.#.#...#.#...#.#        J       Q E       P     W   J         M    #.....#...#.#.#...#.....#.....#   | 
				
			|||
  ###.#######.#.#.#.#.###.###.#.#        M       I A       Q     C   K         Q    ###.###.#####.#.#.###.#####.###   | 
				
			|||
  #...#.#.#...#.#.#.............#                                                   #...#.........#.#.............#   | 
				
			|||
  ###.#.#.###.###.###.#######.#.#                                                   #.#.#.#####.#####.###.###.#.###   | 
				
			|||
SF........#.......#.#...#.#...#.#                                                 YL..#...#...#.#...#...#.#.#.#.#..WC | 
				
			|||
  #.###.#########.#.###.#.#.#####                                                   #.###.#.#.#.#.#########.#.#.#.#   | 
				
			|||
  #.#.......#...#.....#...#.....#                                                   #.#...#.#...#.#.#.#.#.....#...#   | 
				
			|||
  #.#####.###.#.#.###.#.#######.#                                                   #.#.#.#.#####.#.#.#.#.#######.#   | 
				
			|||
  #.#...#.....#...#.......#......SL                                                 #.#.#.#.................#.#.#.#   | 
				
			|||
  #####.#########################                                                   #.#######################.#.###   | 
				
			|||
  #...................#...#...#.#                                                   #.#...................#.......#   | 
				
			|||
  ###.#.###.#####.###.#.#.###.#.#                                                   #####.###.###.#######.#.#.#.#.#   | 
				
			|||
YY..#.#.#.......#.#.....#...#....OB                                               VN..#.#.#.#.#.......#.....#.#.#.#   | 
				
			|||
  #.#.#######.###.#.#####.#####.#                                                   #.#.#.#.#####.###.###.#.#####.#   | 
				
			|||
  #.#...#.#...#.#.#.#.....#.#...#                                                   #.......#.....#.#.#.#.#.....#..HV | 
				
			|||
  #.#.#.#.###.#.###.#####.#.###.#                                                   #####.#######.#.###.###########   | 
				
			|||
  #...#...#.#...#.....#.........#                                                   #...#.#.#.......#.....#.#...#.#   | 
				
			|||
  #####.###.###############.#####                                                   #.#.###.#####.#.###.#.#.#.###.#   | 
				
			|||
  #.#.#.#.#...#...#.#.#...#.#...#                                                 SF..#.#.......#.#.#.#.#.#...#...#   | 
				
			|||
  #.#.###.#.###.###.#.#.#.#####.#                                                   #.#.###.#########.#.#.#.#.#.#.#   | 
				
			|||
  #.#...........#.#.#...#........HI                                                 #.#.....#...#...#...#.#.#.#.#..EA | 
				
			|||
  #.#.#####.#####.#.###.#####.#.#                                                   #######.#.###.#####.#.#.#.#.###   | 
				
			|||
YL..#...#...#...#.#.#.....#.#.#.#                                                   #.#...#.............#...#...#.#   | 
				
			|||
  #.#.###.###.###.#.###.###.#.###                                                   #.#.#########.###.#.###.#.###.#   | 
				
			|||
  #.....#.................#.....#                                                   #.#.....#...#...#.#.#...#.#...#   | 
				
			|||
  #####################.#####.###                                                   #.#.#.#.#.###########.#.###.#.#   | 
				
			|||
ZZ............#.......#...#.#...#                                                   #...#.#...#.#.#.#...#.#.#...#.#   | 
				
			|||
  #.#######.#.#.#####.#####.#####                                                   #.#.###.###.#.#.#.#########.#.#   | 
				
			|||
  #...#.#...#.....#.....#.....#.#                                                 EJ..#.#.....#.#...#.#.....#...#.#   | 
				
			|||
  #.###.#############.#####.###.#                                                   #########.#.###.#.###.###.#.#.#   | 
				
			|||
  #.......#.....#.#.#...#.....#..PD                                                 #.........................#.#..PD | 
				
			|||
  #.###.###.#.###.#.###.#.#.###.#                                                   #######################.#.#####   | 
				
			|||
MQ..#.#...#.#.#.#...#.....#.....#                                                   #...#.#.#.......#.....#.#.....#   | 
				
			|||
  ###.#######.#.#.###############                                                   #.###.#.#.#####.#.###.#########   | 
				
			|||
  #.......#...#.......#.........#                                                   #.#.#...#...#.....#...#...#...#   | 
				
			|||
  #.#.###.#.#.#.###.#.#.#.###.#.#                                                   #.#.###.###.###.#.#.#####.###.#   | 
				
			|||
OB..#.#.....#...#...#...#.#...#.#                                                 PT....#...#.....#.#.#.#...#...#..LH | 
				
			|||
  #########.#.###.###.#########.#                                                   #.#.#.#.#.#####.###.#.#.#.###.#   | 
				
			|||
  #.....#.#.#.#...#.......#.#.#..GJ                                                 #.#...#.......#...#...#.......#   | 
				
			|||
  ###.###.#################.#.###                                                   #.#####.#.#.###################   | 
				
			|||
  #...#.......#.#...#.#.#.......#                                                   #.#...#.#.#.#.#.........#.....#   | 
				
			|||
  #.#.#.#####.#.#.###.#.###.#####                                                   #.###.#######.#####.#.#.#.###.#   | 
				
			|||
  #.#.#.#...#.......#.#.#.#...#.#                                                   #...#...#.....#.#...#.#.#...#.#   | 
				
			|||
  #.#.#.#.#.###.#####.#.#.###.#.#                                                   #####.###.###.#.#.###.#.###.#.#   | 
				
			|||
DU..#.#...#.#.....#.........#...#                                                   #.......#.#...#.#...#.#.#...#..BC | 
				
			|||
  ###.#####.#.#######.#.#####.###                                                   ###.#.#.#####.#.###.###.#.#.#.#   | 
				
			|||
  #.#.......#.........#..........LH                                               YY....#.#...............#...#.#.#   | 
				
			|||
  #.#####.#.#.###.#####.#####.#.#                                                   #.#####.###.#.#################   | 
				
			|||
  #...#.#.#.#.#.#.#.#.......#.#.#                                                   #...#.....#.#.#...#.........#.#   | 
				
			|||
  #.#.#.#######.###.#.###.#######                                                   ###.#############.###.#####.#.#   | 
				
			|||
GJ..#...#.#.......#...#.#.#...#.#                                                 HV..#.#.#.#...#.....#...#...#.#.#   | 
				
			|||
  ###.###.#####.#.#####.#####.#.#                                                   #.###.#.###.#####.###.#.#.#.#.#   | 
				
			|||
  #...#.#...#...#.#.#.#...#.#...#                                                   #.......#.....#.#...#...#.#.#..EJ | 
				
			|||
  #.###.###.#####.#.#.###.#.#.#.#                                                   #.###.#####.###.#.#.#####.#.#.#   | 
				
			|||
  #...........................#..BB                                                 #...#.............#.......#...#   | 
				
			|||
  ###.###.#.#.#.#.#.#.###.#.###.#                                                   #.###.#######.#####.###.#.#.#.#   | 
				
			|||
  #...#...#.#.#.#.#.#...#.#...#.#                                                   #.#.#.#.#.#.....#.#...#.#.#.#.#   | 
				
			|||
  #.#.###.###########.#.#.###.###        J     B         I   D       P       F      #.#.#.#.#.###.###.#.#####.#.###   | 
				
			|||
  #.#...#.....#.#.#...#.#.#.#.#.#        H     C         P   U       A       K      #.#.....#.#...#.........#.#...#   | 
				
			|||
  #.#####.#.###.#.#####.#.#.###.#########.#####.#########.###.#######.#######.#############.#.#.#.#.###.###.#.#####   | 
				
			|||
  #...#...#.....#.......#...#.#.#.........#.....#.#.....#.#...#.....#.#...#...........#.....#...#.#...#.#...#.....#   | 
				
			|||
  #.#######.###.#########.###.#.#.###.###.###.###.#.###.#.#.###.#####.#.#.###.###.###.#####.###.#.#.###.###########   | 
				
			|||
  #.....#...#.#.....#.#.....#...#...#...#...#.....#...#...#.....#.#...#.#.#...#...#.#...#.....#.#.#.#.........#...#   | 
				
			|||
  #.#.###.###.###.###.#########.#.###.###.#####.###.#.#.###.###.#.###.#.#.#####.###.#.#####.#.#########.#####.#.###   | 
				
			|||
  #.#.#.......#...#.......#.......#.#...#.#.#.#.#.#.#.#.#...#.#.....#...#.#.#...#.#.#.....#.#.....#.#.......#.....#   | 
				
			|||
  ###.#.###.#.#######.###.#.###.###.###.###.#.#.#.#.#.#.#.###.###.###.###.#.###.#.#.#.#.#.#.#.#####.#.#.###.#.#.###   | 
				
			|||
  #...#...#.#...#.....#.......#.#.....#...#.....#...#.#.#.#.........#.#.....#...#.#.#.#.#.#.#.....#...#...#.#.#.#.#   | 
				
			|||
  #.#.###########.###########.#####.#.###.#.#######.###.#.###.#######.#.#######.#.#.#.#.#######.#.###.###.#.#.#.#.#   | 
				
			|||
  #.#.........#...#.#.........#...#.#.....#.#...#.#...#.#.#.#.....#.#.#...#.#.......#.#...#.....#...#.#...#.#.#...#   | 
				
			|||
  ###.#.#.###.#####.#.###.###.###.#.#.#####.#.#.#.#.#######.#.#.#.#.#####.#.#####.#####.#.###.#.#.###.#########.#.#   | 
				
			|||
  #...#.#.#.#.#.#.....#...#.#.#.....#.#.#.....#...#.....#.....#.#.....#...#...........#.#...#.#.#.#.#...#.......#.#   | 
				
			|||
  #.#.#####.###.#####.#.#.#.#######.###.###.#####.#.#############.#####.###.#.#.#.#####.#########.#.###.#########.#   | 
				
			|||
  #.#...#.#...........#.#.#.#.#...#.....#.....#.#.#.#.....#.#...#.#.......#.#.#.#.#...#.#...#.........#.......#...#   | 
				
			|||
  #.#.#.#.###########.#####.#.#.###.#.#########.#.#.#.#####.###.#.#.###.###.#######.#######.#.#.###.###.#####.###.#   | 
				
			|||
  #.#.#...#...#.........#.#.........#.....#.#.....#.#.#...#.#.#...#...#.#...................#.#.#...#...#.....#...#   | 
				
			|||
  ###.###.#.#####.#.#.###.#####.###.#######.###.#.#.###.#.#.#.#.###.###.#.#.###.###.###.#######.###.###.###.#####.#   | 
				
			|||
  #.....#.#.......#.#.#...#.#...#.......#...#...#.#.....#.#...#.#...#.#.#.#...#.#.....#.....#.#.#.#...#.#.......#.#   | 
				
			|||
  #.#####.#####.#.#######.#.#.#.###.#####.#######.#######.#.#.#.###.#.#####.#######.###.#####.###.#####.###.#.#.#.#   | 
				
			|||
  #.#.#.#.#.#...#.#.......#...#...#.........#.#.....#.....#.#.....#...#...#...#.#.....#.#.#...#.....#.#.#...#.#.#.#   | 
				
			|||
  #.#.#.#.#.#.###.###.#.###.#############.###.###.###.#.###.#######.#####.#.###.#########.#.#####.###.#####.###.#.#   | 
				
			|||
  #.....#.#...#...#...#.......#.............#...#.#...#...#.#.....#.#.....#...#.#.#.#.#...#...#.#.#.#.#.#.#...#.#.#   | 
				
			|||
  #.###.#.#######.###.###.###.#####.###########.#.###.#.###.###.#.#.#####.#.#.#.#.#.#.###.#.###.#.#.#.#.#.#.###.###   | 
				
			|||
  #...#.#...#.#...#...#.#.#.#...#...#.......#.#.....#.#.#.......#.#.......#.#.#.#.#.....#.#...#.#.......#.....#...#   | 
				
			|||
  #.#########.#########.###.#.###.#.#.#.#.###.#.#.###.###.###.###.###.#.#####.#.#.#.#####.#.###.#.#######.#####.###   | 
				
			|||
  #.....#.#.....................#.#.#.#.#.#.....#.#.....#.#...#.....#.#...#.#.....#.#...#...#.#.......#.#...#.....#   | 
				
			|||
  #.#.###.#.###.###.###.#.#########.###.#.###.###.###.#.#######.#######.###.#####.#.#.###.###.#.###.###.#.###.#####   | 
				
			|||
  #.#.....#.#.....#.#.#.#.#.............#.#...#.....#.#...#...#.......#.#.........................#.....#.#.......#   | 
				
			|||
  #.#.#####.#.###.#.#.#.#.#######.#.#####.###.#.#.###.#.#.#.#.###.#####.#####.###.#.#.###.#####.###.#.#.#######.#.#   | 
				
			|||
  #.#.....#.#.#...#.#...#.#.......#.....#...#.#.#.#...#.#.#.#.......#.....#.....#.#.#.#.......#...#.#.#.....#...#.#   | 
				
			|||
  #######################################.#######.#.#.#####.###########.#######.###################################   | 
				
			|||
                                         P       V P A     J           F       H                                      | 
				
			|||
                                         A       N T A     K           K       I                                      | 
				
			|||
								
									
										File diff suppressed because one or more lines are too long
									
								
							
						
					@ -0,0 +1,71 @@ | 
				
			|||
bignum = require "_openssl.bignum" | 
				
			|||
 | 
				
			|||
function find(card, deck, times) | 
				
			|||
    local revert = false | 
				
			|||
    local increment = bignum.new(0) | 
				
			|||
    local multiply = bignum.new(1) | 
				
			|||
    for line in io.lines(arg[1]) do | 
				
			|||
        if line:find("^deal into new stack$") then | 
				
			|||
            revert = not revert | 
				
			|||
        elseif line:find("^cut %-?%d+$") then | 
				
			|||
            local val = tonumber(line:match("^cut (%-?%d+)$")) | 
				
			|||
            if not revert then | 
				
			|||
                increment = (increment - val) % deck | 
				
			|||
            else | 
				
			|||
                increment = (increment + val) % deck | 
				
			|||
            end | 
				
			|||
        elseif line:find("^deal with increment %d+$") then | 
				
			|||
            local val = tonumber(line:match("^deal with increment (%d+)$")) | 
				
			|||
            multiply = (multiply * val) % deck | 
				
			|||
            increment = (increment * val) % deck | 
				
			|||
            if revert then | 
				
			|||
                increment = (increment + (val - 1)) % deck | 
				
			|||
            end | 
				
			|||
        end | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    print(card, multiply, increment, deck) | 
				
			|||
    card = (card * multiply * times + increment * times) % deck | 
				
			|||
    if revert then | 
				
			|||
        card = deck - (card + 1) | 
				
			|||
    end | 
				
			|||
    return card | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function revfind(card, deck, times) | 
				
			|||
    local revert = false | 
				
			|||
    local increment = bignum.new(0) | 
				
			|||
    local multiply = bignum.new(1) | 
				
			|||
    for line in io.lines(arg[1]) do | 
				
			|||
        if line:find("^deal into new stack$") then | 
				
			|||
            revert = not revert | 
				
			|||
        elseif line:find("^cut %-?%d+$") then | 
				
			|||
            local val = tonumber(line:match("^cut (%-?%d+)$")) | 
				
			|||
            if not revert then | 
				
			|||
                increment = (increment - val) % deck | 
				
			|||
            else | 
				
			|||
                increment = (increment + val) % deck | 
				
			|||
            end | 
				
			|||
        elseif line:find("^deal with increment %d+$") then | 
				
			|||
            local val = tonumber(line:match("^deal with increment (%d+)$")) | 
				
			|||
            multiply = (multiply * val) % deck | 
				
			|||
            increment = (increment * val) % deck | 
				
			|||
            if revert then | 
				
			|||
                increment = (increment + (val - 1)) % deck | 
				
			|||
            end | 
				
			|||
        end | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    print(card, multiply, increment, deck) | 
				
			|||
    card = (card * multiply * times + increment * times) % deck | 
				
			|||
    if revert then | 
				
			|||
        card = deck - (card + 1) | 
				
			|||
    end | 
				
			|||
    return card | 
				
			|||
end | 
				
			|||
 | 
				
			|||
print("Part 1:", find(2019, 10007, 1)) | 
				
			|||
print("Part 2:", find(2020, 119315717514047, 101741582076661)) | 
				
			|||
 | 
				
			|||
print("Part 1:", revfind(7744, 10007, 1)) | 
				
			|||
print("Part 2:", revfind(2020, 119315717514047, 101741582076661)) | 
				
			|||
@ -0,0 +1 @@ | 
				
			|||
https://boards.4channel.org/g/thread/74086545#p74095430 | 
				
			|||
@ -0,0 +1,100 @@ | 
				
			|||
deal with increment 24 | 
				
			|||
cut -9655 | 
				
			|||
deal with increment 20 | 
				
			|||
cut -3052 | 
				
			|||
deal with increment 14 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 12 | 
				
			|||
cut 2041 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 13 | 
				
			|||
cut -5574 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 52 | 
				
			|||
cut 2735 | 
				
			|||
deal with increment 14 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 72 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 11 | 
				
			|||
cut -7008 | 
				
			|||
deal with increment 7 | 
				
			|||
cut -3920 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 68 | 
				
			|||
cut -7497 | 
				
			|||
deal with increment 7 | 
				
			|||
cut 8878 | 
				
			|||
deal with increment 39 | 
				
			|||
cut -3407 | 
				
			|||
deal with increment 74 | 
				
			|||
cut -3728 | 
				
			|||
deal into new stack | 
				
			|||
cut 483 | 
				
			|||
deal with increment 55 | 
				
			|||
cut 8147 | 
				
			|||
deal with increment 48 | 
				
			|||
cut 5734 | 
				
			|||
deal with increment 35 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 53 | 
				
			|||
deal into new stack | 
				
			|||
cut 9833 | 
				
			|||
deal with increment 21 | 
				
			|||
cut -1328 | 
				
			|||
deal with increment 29 | 
				
			|||
cut 469 | 
				
			|||
deal with increment 34 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 50 | 
				
			|||
cut 8218 | 
				
			|||
deal with increment 8 | 
				
			|||
cut 1546 | 
				
			|||
deal with increment 27 | 
				
			|||
cut 3699 | 
				
			|||
deal with increment 44 | 
				
			|||
cut 1167 | 
				
			|||
deal into new stack | 
				
			|||
cut -9744 | 
				
			|||
deal with increment 71 | 
				
			|||
cut -6111 | 
				
			|||
deal with increment 19 | 
				
			|||
cut 2592 | 
				
			|||
deal with increment 17 | 
				
			|||
cut 3257 | 
				
			|||
deal with increment 11 | 
				
			|||
cut 4618 | 
				
			|||
deal with increment 64 | 
				
			|||
deal into new stack | 
				
			|||
cut -1513 | 
				
			|||
deal into new stack | 
				
			|||
cut -2976 | 
				
			|||
deal with increment 58 | 
				
			|||
cut 2744 | 
				
			|||
deal with increment 4 | 
				
			|||
cut 6408 | 
				
			|||
deal with increment 66 | 
				
			|||
cut 5182 | 
				
			|||
deal with increment 6 | 
				
			|||
cut -1767 | 
				
			|||
deal with increment 12 | 
				
			|||
cut -7805 | 
				
			|||
deal with increment 45 | 
				
			|||
cut -4126 | 
				
			|||
deal with increment 52 | 
				
			|||
cut 2112 | 
				
			|||
deal with increment 35 | 
				
			|||
cut 863 | 
				
			|||
deal with increment 55 | 
				
			|||
cut 3159 | 
				
			|||
deal with increment 67 | 
				
			|||
deal into new stack | 
				
			|||
deal with increment 65 | 
				
			|||
cut -3194 | 
				
			|||
deal with increment 69 | 
				
			|||
cut 5695 | 
				
			|||
deal with increment 7 | 
				
			|||
cut -5035 | 
				
			|||
deal with increment 30 | 
				
			|||
cut -2282 | 
				
			|||
deal with increment 70 | 
				
			|||
@ -0,0 +1,82 @@ | 
				
			|||
field = {} | 
				
			|||
for line in io.lines(arg[1]) do | 
				
			|||
    row = {} | 
				
			|||
    for char in line:gmatch(".") do | 
				
			|||
        table.insert(row, char) | 
				
			|||
    end | 
				
			|||
    table.insert(field, row) | 
				
			|||
end | 
				
			|||
 | 
				
			|||
function hash(field) | 
				
			|||
    local res = 0 | 
				
			|||
 | 
				
			|||
    for y, row in ipairs(field) do | 
				
			|||
        for x, cell in ipairs(row) do | 
				
			|||
            local data = 0 | 
				
			|||
            if cell == "#" then | 
				
			|||
                data = 2 ^ ((y - 1) * #row + (x - 1)) | 
				
			|||
            end | 
				
			|||
            res = res + data | 
				
			|||
        end | 
				
			|||
    end | 
				
			|||
 | 
				
			|||
    return res | 
				
			|||
end | 
				
			|||
 | 
				
			|||
 | 
				
			|||
function next_field(field) | 
				
			|||
    local new = {} | 
				
			|||
    for y, row in ipairs(field) do | 
				
			|||
        local new_row = {} | 
				
			|||
        for x, cell in ipairs(row) do | 
				
			|||
            local adjacent = 0 | 
				
			|||
            if field[y - 1] and field[y - 1][x] == "#" then | 
				
			|||
                adjacent = adjacent + 1 | 
				
			|||
            end | 
				
			|||
            if field[y + 1] and field[y + 1][x] == "#" then | 
				
			|||
                adjacent = adjacent + 1 | 
				
			|||
            end | 
				
			|||
            if field[y][x - 1] == "#" then | 
				
			|||
                adjacent = adjacent + 1 | 
				
			|||
            end | 
				
			|||
            if field[y][x + 1] == "#" then | 
				
			|||
                adjacent = adjacent + 1 | 
				
			|||
            end | 
				
			|||
            if cell == "#" then | 
				
			|||
                if adjacent ~= 1 then | 
				
			|||
                    cell = "." | 
				
			|||
                end | 
				
			|||
            else | 
				
			|||
                if adjacent == 1 or adjacent == 2 then | 
				
			|||
                    cell = "#" | 
				
			|||
                end | 
				
			|||
            end | 
				
			|||
            table.insert(new_row, cell) | 
				
			|||
        end | 
				
			|||
        table.insert(new, new_row) | 
				
			|||
    end | 
				
			|||
    return new | 
				
			|||
end | 
				
			|||
 | 
				
			|||
field_orig = {table.unpack(field)} | 
				
			|||
 | 
				
			|||
hashes = {} | 
				
			|||
while true do | 
				
			|||
    cur_hash = hash(field) | 
				
			|||
    if hashes[cur_hash] then | 
				
			|||
        break | 
				
			|||
    end | 
				
			|||
    hashes[cur_hash] = true | 
				
			|||
    field = next_field(field) | 
				
			|||
end | 
				
			|||
 | 
				
			|||
for _, row in ipairs(field) do | 
				
			|||
    for _, cell in ipairs(row) do | 
				
			|||
        io.stdout:write(cell) | 
				
			|||
    end | 
				
			|||
    io.stdout:write("\n") | 
				
			|||
end | 
				
			|||
 | 
				
			|||
print("Part 1:", hash(field)) | 
				
			|||
 | 
				
			|||
field = field_orig | 
				
			|||
@ -0,0 +1,5 @@ | 
				
			|||
#..## | 
				
			|||
##... | 
				
			|||
.#.#. | 
				
			|||
##### | 
				
			|||
####. | 
				
			|||
@ -0,0 +1,5 @@ | 
				
			|||
....# | 
				
			|||
#..#. | 
				
			|||
#..## | 
				
			|||
..#.. | 
				
			|||
#.... | 
				
			|||
					Loading…
					
					
				
		Reference in new issue