summary refs log tree commit diff
diff options
context:
space:
mode:
authordzwdz2022-12-24 13:17:44 +0100
committerdzwdz2022-12-24 13:17:44 +0100
commit8b859a325322960934344accc35650a68bafabd3 (patch)
tree309bc518bac5b28e5e123806ff31e2933c8ed8c9
parent05c2d1627fdbd28dc5986f9e057773350b3c6625 (diff)
day 24 gotta go fast
-rw-r--r--22.24/main.py71
1 files changed, 44 insertions, 27 deletions
diff --git a/22.24/main.py b/22.24/main.py
index bd348a0..9e5783e 100644
--- a/22.24/main.py
+++ b/22.24/main.py
@@ -1,14 +1,21 @@
 from sys import stdin
 from math import lcm
+from heapq import heappop, heappush
 
 def tadd(a, b):
-    return tuple(map(sum, zip(a, b)))
+    return (a[0] + b[0], a[1] + b[1])
+    # return tuple(map(sum, zip(a, b)))
 
 def tmul(a, b):
-    return tuple([n*b for n in a])
+    return (a[0] * b, a[1] * b)
+    # return tuple([n*b for n in a])
 
 def tmod(a, b):
-    return tuple([a%b for (a,b) in zip(a, b)])
+    return (a[0] % b[0], a[1] % b[1])
+    # return tuple([a%b for (a,b) in zip(a, b)])
+
+def tdist(a, b):
+    return abs(a[0] - b[0]) + abs(a[1] - b[1])
 
 # direction tuple
 def tdir(f):
@@ -42,31 +49,41 @@ def coll(x, y, t):
     return False
 
 def search():
-    cur = {(start, 0, 0)}
-    frontier = set()
-    visited = set(cur)
+    partOne = None
+    cur = [(0, (start, 0, 0))]
+    visited = set(cur[0][1])
+    asdf = 0
+    gid_bonus = tdist(start, end)
+    def dist(node):
+        bv, t, gid = node
+        goal = end if gid != 1 else start
+        score = 0
+        score += tdist(bv, goal)
+        score += t
+        score -= gid * gid_bonus
     while True:
-        for bv, t, gid in cur:
-            vs = [bv]
-            for d in range(4):
-                vs.append(tadd(bv, tdir(d)))
-            for v in vs:
-                if not coll(*v, t+1):
-                    new = None
-                    if v == end and gid == 0:
-                        new = (v, t+1, 1)
-                    elif v == start and gid == 1:
-                        new = (v, t+1, 2)
-                    elif v == end and gid == 2:
-                        return t+1
-                    else:
-                        new = (v, t+1, gid)
-                    chk = (new[0], new[1] % cycle, new[2])
-                    if not chk in visited:
-                        visited.add(chk)
-                        frontier.add(new)
-        cur = frontier
-        frontier = set()
+        _, node = heappop(cur)
+        bv, t, gid = node
+        vs = [bv]
+        for d in range(4):
+            vs.append(tadd(bv, tdir(d)))
+        for v in vs:
+            if not coll(*v, t+1):
+                node = None
+                if v == end and gid == 0:
+                    if not partOne: partOne = t+1
+                    node = (v, t+1, 1)
+                elif v == start and gid == 1:
+                    node = (v, t+1, 2)
+                elif v == end and gid == 2:
+                    return partOne, t+1
+                else:
+                    node = (v, t+1, gid)
+                chk = (node[0], node[1], node[2])
+                if not chk in visited:
+                    visited.add(chk)
+                    heappush(cur, (asdf, node))
+                    asdf += 1
     return None
 
 print(search())