@@ -40,41 +40,41 @@ function init_state(hallway::Vector{T}, rooms::Vector{Vector{S}}) where {T <: In
4040end
4141
4242function 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
4444end
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+
4654function 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
4857end
4958
5059function 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)
6468end
6569
6670function 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)
7878end
7979
8080function 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)
108108end
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