Skip to content

Commit df4eef1

Browse files
committed
[Day 23] Further optimize
1 parent bd3042b commit df4eef1

File tree

2 files changed

+29
-30
lines changed

2 files changed

+29
-30
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ This Julia package contains my solutions for [Advent of Code 2021](https://adven
3131
| 20 | [:white_check_mark:](https://adventofcode.com/2021/day/20) | 83.659 ms | 95.07 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day20.jl) |
3232
| 21 | [:white_check_mark:](https://adventofcode.com/2021/day/21) | 10.961 ms | 4.56 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day21.jl) |
3333
| 22 | [:white_check_mark:](https://adventofcode.com/2021/day/22) | 51.400 ms | 17.66 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day22.jl) |
34-
| 23 | [:white_check_mark:](https://adventofcode.com/2021/day/23) | 172.330 ms | 56.06 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day23.jl) |
34+
| 23 | [:white_check_mark:](https://adventofcode.com/2021/day/23) | 145.604 ms | 44.15 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day23.jl) |
3535
| 24 | [:white_check_mark:](https://adventofcode.com/2021/day/24) | 2.247 ms | 160.56 KiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day24.jl) |
3636
| 25 | [:white_check_mark:](https://adventofcode.com/2021/day/25) | 32.100 ms | 49.86 MiB | [:white_check_mark:](https://github.com/goggle/AdventOfCode2021.jl/blob/master/src/day25.jl) |
3737

src/day23.jl

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,41 @@ function init_state(hallway::Vector{T}, rooms::Vector{Vector{S}}) where {T <: In
4040
end
4141

4242
function get_hallway_entry(state::State, i::Integer)
43-
return (state.hallway >> (3 * (i - 1) + 2) & 1) << 2 + (state.hallway >> (3 * (i - 1) + 1) & 1) << 1 + (state.hallway >> (3 * (i - 1)) & 1)
43+
return (state.hallway >> (3 * (i - 1))) & 0x7
4444
end
4545

46+
# function get_hallway_entry(state::State, i::Integer)
47+
# return (state.hallway >> (3 * (i - 1) + 2) & 1) << 2 + (state.hallway >> (3 * (i - 1) + 1) & 1) << 1 + (state.hallway >> (3 * (i - 1)) & 1)
48+
# end
49+
50+
# function get_room_entry(state::State, room::Integer, i::Integer)
51+
# return (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1) + 2) & 1) << 2 + (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1) + 1) & 1) << 1 + (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1)) & 1)
52+
# end
53+
4654
function get_room_entry(state::State, room::Integer, i::Integer)
47-
return (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1) + 2) & 1) << 2 + (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1) + 1) & 1) << 1 + (state.rooms >> (3 * (room - 1) * state.roomlength + 3 * (i - 1)) & 1)
55+
pos = 3 * ((room - 1) * state.roomlength + (i - 1))
56+
return (state.rooms >> pos) & 0x7
4857
end
4958

5059
function swap(state::State, i::Integer, room::Integer, j::Integer)
5160
hpos = 3 * (i - 1)
52-
rpos = 3 * (room - 1) * state.roomlength + 3 * (j - 1)
53-
54-
hallway = state.hallway
55-
rooms = state.rooms
56-
for k 0:2
57-
hallway_bit = (state.hallway >> (hpos + k)) & 1
58-
room_bit = (state.rooms >> (rpos + k)) & 1
59-
hallway_bit == room_bit && continue
60-
hallway = (1 << (hpos + k)) hallway
61-
rooms = (1 << (rpos + k)) rooms
62-
end
63-
return State(hallway, rooms, state.roomlength)
61+
rpos = 3 * ((room - 1) * state.roomlength + (j - 1))
62+
mask_h = (state.hallway >> hpos) & 0x7
63+
mask_r = (state.rooms >> rpos) & 0x7
64+
delta = mask_h mask_r
65+
new_hallway = state.hallway (delta << hpos)
66+
new_rooms = state.rooms (delta << rpos)
67+
return State(new_hallway, new_rooms, state.roomlength)
6468
end
6569

6670
function swap(state::State, i::Integer, room1::Integer, j::Integer, room2::Integer)
67-
r1pos = 3 * (room1 - 1) * state.roomlength + 3 * (i - 1)
68-
r2pos = 3 * (room2 - 1) * state.roomlength + 3 * (j - 1)
69-
rooms = state.rooms
70-
for k 0:2
71-
r1bit = (state.rooms >> (r1pos + k)) & 1
72-
r2bit = (state.rooms >> (r2pos + k)) & 1
73-
r1bit == r2bit && continue
74-
mask = 1 << (r1pos + k) | 1 << (r2pos + k)
75-
rooms = rooms mask
76-
end
77-
return State(state.hallway, rooms, state.roomlength)
71+
r1pos = 3 * ((room1 - 1) * state.roomlength + (i - 1))
72+
r2pos = 3 * ((room2 - 1) * state.roomlength + (j - 1))
73+
mask1 = (state.rooms >> r1pos) & 0x7
74+
mask2 = (state.rooms >> r2pos) & 0x7
75+
delta = mask1 mask2
76+
new_rooms = state.rooms (delta << r1pos) (delta << r2pos)
77+
return State(state.hallway, new_rooms, state.roomlength)
7878
end
7979

8080
function day23(input::String = readInput(joinpath(@__DIR__, "..", "data", "day23.txt")))
@@ -107,10 +107,9 @@ function transform_part2(state::State)
107107
return init_state([get_hallway_entry(state, i) for i 1:11], rooms)
108108
end
109109

110-
function next_states_and_costs(state::State)
110+
function next_states_and_costs(state::State, room_entries::NTuple{4,Int})
111111
add = MVector{4, Int}(0, 0, 0, 0) # how many entries from the start are set to 0
112112
room_sorted = MVector{4, Bool}(true, true, true, true)
113-
room_entries = (3, 5, 7, 9)
114113
for room 1:4
115114
a = 0
116115
while a + 1 <= state.roomlength && get_room_entry(state, room, a + 1) == 0
@@ -208,11 +207,11 @@ function solve(state::State, goal::State, h)
208207
queue[state] = 0
209208

210209
# camefrom = Dict{State,State}()
211-
210+
room_entries = (3, 5, 7, 9)
212211
while !isempty(queue)
213212
current = dequeue!(queue)
214213
current == goal && break
215-
for (neighbour, cost) next_states_and_costs(current)
214+
for (neighbour, cost) next_states_and_costs(current, room_entries)
216215
ndist = dist[current] + cost
217216
if ndist < dist[neighbour]
218217
dist[neighbour] = ndist

0 commit comments

Comments
 (0)