Continue with 2016 and 2017.
This commit is contained in:
98
2017/d3.py
Normal file
98
2017/d3.py
Normal file
@@ -0,0 +1,98 @@
|
||||
import sys
|
||||
import lib
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
data = open(0).read().strip()
|
||||
|
||||
|
||||
def more_efficient_part_1(data):
|
||||
def corners():
|
||||
layer = 0
|
||||
corner = 1
|
||||
edge_len = 3
|
||||
yield (corner, layer, edge_len)
|
||||
while True:
|
||||
corner += (edge_len - 1) * 4
|
||||
layer += 1
|
||||
yield (corner, layer, edge_len)
|
||||
edge_len += 2
|
||||
|
||||
square = int(data)
|
||||
corner, layer, edge_len = 0, 0, 0
|
||||
for corner, layer, edge_len in corners():
|
||||
if square < corner:
|
||||
break
|
||||
|
||||
coord = (layer, layer)
|
||||
while corner != square:
|
||||
for dir in [(0, -1), (-1, 0), (0, 1), (1, 0)]:
|
||||
for _ in range(edge_len - 1):
|
||||
corner -= 1
|
||||
coord = lib.add2(coord, dir)
|
||||
if corner == square:
|
||||
break
|
||||
if corner == square:
|
||||
break
|
||||
return sum(map(abs, coord))
|
||||
|
||||
|
||||
|
||||
def walk_spiral():
|
||||
yield (0, 0), 1
|
||||
yield (0, 1), 2
|
||||
|
||||
value = 2
|
||||
coord = (0, 1)
|
||||
step_len = 1
|
||||
|
||||
up = (-1, 0)
|
||||
left = (0, -1)
|
||||
down = (1, 0)
|
||||
right = (0, 1)
|
||||
|
||||
|
||||
while True:
|
||||
for _ in range(step_len):
|
||||
coord = lib.add2(coord, up)
|
||||
value += 1
|
||||
yield coord, value
|
||||
|
||||
step_len += 1
|
||||
|
||||
for _ in range(step_len):
|
||||
coord = lib.add2(coord, left)
|
||||
value += 1
|
||||
yield coord, value
|
||||
|
||||
for _ in range(step_len):
|
||||
coord = lib.add2(coord, down)
|
||||
value += 1
|
||||
yield coord, value
|
||||
|
||||
step_len += 1
|
||||
for _ in range(step_len):
|
||||
coord = lib.add2(coord, right)
|
||||
value += 1
|
||||
yield coord, value
|
||||
|
||||
values = defaultdict(int)
|
||||
values[(0, 0)] = 1
|
||||
part_1 = False
|
||||
|
||||
for coord, value in walk_spiral():
|
||||
if part_1 and value == int(data):
|
||||
print(sum(map(abs, coord)))
|
||||
break
|
||||
|
||||
nval = 0
|
||||
for d in lib.nbs8:
|
||||
nb = lib.add2(coord, d)
|
||||
nval += values[nb]
|
||||
|
||||
if nval > 0:
|
||||
values[coord] = nval
|
||||
|
||||
if nval > int(data):
|
||||
print(nval)
|
||||
break
|
||||
Reference in New Issue
Block a user