Skip to content

Commit e7e1e77

Browse files
committedDec 20, 2016
Day 13;
1 parent 30d9f1c commit e7e1e77

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed
 

‎day13.py

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import numpy as np
2+
from collections import namedtuple
3+
fav_number = 1352
4+
5+
State = namedtuple('State', ['at', 'steps', 'dist'])
6+
7+
8+
def is_wall(x, y):
9+
i = x*x + 3*x + 2*x*y + y + y*y + fav_number
10+
bits = str(bin(i))[2:]
11+
return (bits.count('1') % 2) == 1
12+
13+
14+
def generate_map(size_x, size_y):
15+
wall_map = np.zeros((size_x, size_y))
16+
17+
for x in range(size_x):
18+
for y in range(size_y):
19+
if is_wall(x, y):
20+
wall_map[x, y] = -1
21+
22+
return wall_map
23+
24+
25+
def valid_pos(at, map_size):
26+
if at[0] < 0 or at[1] < 0 or at[0] >= map_size[0] or at[1] >= map_size[1]:
27+
return False
28+
else:
29+
return True
30+
31+
32+
def get_dist(v):
33+
return np.linalg.norm(v, ord=1)
34+
35+
36+
if __name__ == '__main__':
37+
start = np.array([1, 1])
38+
target = np.array([31, 39])
39+
40+
map_size = target + 25
41+
42+
steps = [np.array([0, 1]), np.array([0, -1]), np.array([1, 0]), np.array([-1, 0])]
43+
44+
wall_map = generate_map(map_size[0], map_size[1])
45+
46+
states = [State(start, 0, get_dist(target-start))]
47+
48+
while True:
49+
dist_min = np.sum(map_size)
50+
i_min = -1
51+
52+
# Get best current location
53+
for i, state in enumerate(states):
54+
if state.dist < dist_min:
55+
dist_min = state.dist
56+
i_min = i
57+
58+
state = states[i_min]
59+
del states[i_min]
60+
wall_map[state.at[0], state.at[1]] = 1
61+
62+
if dist_min == 0:
63+
break
64+
65+
# Generate new steps
66+
states_new = []
67+
68+
for step in steps:
69+
new_pos = state.at + step
70+
71+
if not valid_pos(new_pos, map_size) or wall_map[new_pos[0], new_pos[1]] != 0:
72+
continue
73+
74+
new_state = State(new_pos, state.steps + 1, get_dist(target-new_pos))
75+
states_new.append(new_state)
76+
77+
states.extend(states_new)
78+
79+
print('Minimum distance to target: {}'.format(state.steps))
80+
81+
# Reset map
82+
wall_map = generate_map(map_size[0], map_size[1])
83+
84+
positions = [start]
85+
wall_map[start[0], start[1]] = 1
86+
total_fields = 1
87+
88+
for a in range(50):
89+
90+
positions_new = []
91+
92+
for position in positions:
93+
94+
for step in steps:
95+
position_new = position + step
96+
97+
if not valid_pos(position_new, map_size) or wall_map[position_new[0], position_new[1]] != 0:
98+
continue
99+
100+
wall_map[position_new[0], position_new[1]] = 1
101+
positions_new.append(position_new)
102+
total_fields += 1
103+
104+
positions = positions_new
105+
106+
print('Total positions accessible in 50 steps: {}'.format(total_fields))
107+
108+
109+
110+
111+
112+
113+

0 commit comments

Comments
 (0)