"""Offline switch/cart BFS; only normal reachable lever and cart interactions.""" import ast,json,heapq,re,subprocess,copy,pickle,sys from pathlib import Path from collections import deque from static_cart_model import cart_transition R=Path(__file__).resolve().parents[1];ns=dict(ROOT=R,json=json,heapq=heapq,re=re) t=ast.parse((R/'scripts/nav.py').read_text());f=next(n for n in t.body if isinstance(n,ast.FunctionDef)and n.name=='route');exec(compile(ast.Module(body=[f],type_ignores=[]),'route','exec'),ns) cs=json.loads((R/'work/191-sw-cart88.json').read_text())['pages'][1]['list'];positions={int(k):tuple(v)for k,v in json.loads((R/'work/191-sw-cart-positions.json').read_text()).items()};cache=R/'work/192-sw-entry-graphs.pkl' if cache.exists():graphs,events=pickle.loads(cache.read_bytes()) else: graphs=[] for mask in range(128): extra={'switches':{str(1136+i):bool(mask&(1<1 else 0 levers=['70','72','74','76','79','80','82'];q=deque([((90,59),initialmask,0,[])]);seen=set() while q: p,mask,state,plan=q.popleft();g=graphs[mask];cart=positions[state];rr={p};qq=deque([p]) while qq: for k,n in g.get(qq.popleft(),[]): if n!=cart and n not in rr:rr.add(n);qq.append(n) key=(min(rr),mask,state) if key in seen:continue seen.add(key) adjacent=lambda xy:sorted(rr.intersection({(xy[0]+dx,xy[1]+dy)for dx,dy in [(0,1),(0,-1),(1,0),(-1,0)]})) for a in adjacent(cart): new,xy=cart_transition(cs,497,state,{1136+i:bool(mask&(1<