""" Construct a 7-day schedule using triangle pairing. 24 people → 8 triples of 3 → pair triples into boats of 6. """ import itertools, math, json N = 24 TOTAL = math.comb(N, 2) def norm(p,q): return (min(p,q), max(p,q)) def count_pairs(sched): pairs = set() for day in sched: for b in day: pairs.update(norm(p,q) for p,q in itertools.combinations(b, 2)) return len(pairs) def missing_pairs(sched): pairs = set() for day in sched: for b in day: pairs.update(norm(p,q) for p,q in itertools.combinations(b, 2)) return set(norm(i,j) for i in range(N) for j in range(i+1,N)) - pairs # 8 triples (groups of 3). Each person p is in triple t = p // 3. # Person p is in triple t = p // 3, at position pos = p % 3. triples = [[3*t + j for j in range(3)] for t in range(8)] # A 1-factorization of K_8 (vertices 0..7 representing the triples) # Using the standard construction: vertices are elements of Z_7 ∪ {∞} # For round r = 0..6: pair (∞, r) and (r+i, r-i) for i = 1..3 one_factorization = [] vertices = list(range(7)) # 0..6 for r in range(7): matching = [(r, 7)] # (triple r, triple 7) [7 represents ∞, i.e., triple 7] for i in range(1, 4): a = (r + i) % 7 b = (r - i) % 7 matching.append((a, b)) one_factorization.append(matching) print("1-factorization of K_8:") for i, matching in enumerate(one_factorization): print(f" Factor {i+1}: {matching}") # Build schedule def matching_to_boats(matching): boats = [] for (t1, t2) in matching: boat = sorted(triples[t1] + triples[t2]) boats.append(tuple(boat)) return boats sched = [matching_to_boats(m) for m in one_factorization] cov = count_pairs(sched) print(f"\n7-day coverage: {cov}/{TOTAL}") if cov == TOTAL: print("SUCCESS! All 276 pairs covered.") print("\nSchedule:") for i, day in enumerate(sched): print(f" Day {i+1}: {day}") print(f"\nJSON format:\n{json.dumps(sched)}") else: print(f"Missing: {len(missing_pairs(sched))} pairs") print(f"Missing pairs: {sorted(missing_pairs(sched))[:20]}...")