Files

53 lines
1.5 KiB
Python

import sys; sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent))
from interval_cover import min_interval_cover
# basic
assert min_interval_cover([(0,5),(5,10)], 10) is not None
r = min_interval_cover([(0,5),(5,10)], 10)
assert len(r)==2
# impossible
assert min_interval_cover([(0,4),(5,10)], 10) is None
# single
assert min_interval_cover([(0,10)], 10) == [(0,10)]
# empty target
assert min_interval_cover([(0,5)], 0) == []
# greedy optimal check vs brute for small
import itertools
def brute(intervals,target):
# min subset covering [0,target)
best=None
for r in range(1,len(intervals)+1):
for combo in itertools.combinations(intervals,r):
# check coverage
cur=0
# sort
s=sorted(combo)
ok=True
for a,b in s:
if a>cur: ok=False;break
cur=max(cur,b)
if ok and cur>=target:
best=r; break
if best: break
return best
import random
random.seed(1)
for _ in range(2000):
n=random.randint(1,6)
ivs=[]
for _ in range(n):
a=random.randint(0,6); b=a+random.randint(1,4)
ivs.append((a,b))
t=random.randint(1,8)
res=min_interval_cover(ivs,t)
got = len(res) if res is not None else None
# feasibility
feas = any(True for _ in [0])
# compute brute min if feasible
b=brute(ivs,t)
if b is None:
assert res is None, (ivs,t,res)
else:
assert res is not None and len(res)==b, (ivs,t,res,b)
print("all ok")