mid-kid
4 years ago
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