Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Schedule Mode Builder by tokiojapan55
def schedule(tasks: list[str], mode: int) -> list[str]:
result = []
to_min = lambda t: int(t[:2]) * 60 + int(t[3:])
to_clock = lambda t: '{:02d}:{:02d}-{:02d}:{:02d}'.format(t[0] // 60, t[0] % 60, t[1] // 60, t[1] % 60)
duration = lambda path: sum([(tasks2[i][1] - tasks2[i][0]) for i in path])
overlap = lambda a, b: tasks2[a][0] < tasks2[b][1] and tasks2[a][1] > tasks2[b][0]
tasks2 = sorted([(to_min(task[:5]), to_min(task[6:])) for task in tasks], key=lambda t: t[0] * 1440 + t[1])
def compare1(result, path):
if result == []:
return 1
if tasks2[result[0]][0] < tasks2[path[0]][0]:
return -1
if tasks2[result[0]][0] > tasks2[path[0]][0]:
return 1
for r, p in zip(result, path):
if tasks2[r][1] - tasks2[r][0] < tasks2[p][1] - tasks2[p][0]:
return -1
if tasks2[r][1] - tasks2[r][0] > tasks2[p][1] - tasks2[p][0]:
return 1
return 0
def compare2(result, path):
if result == []:
return 1
if tasks2[result[0]][0] < tasks2[path[0]][0]:
return -1
if tasks2[result[0]][0] > tasks2[path[0]][0]:
return 1
for r, p in zip(result, path):
if tasks2[r][1] - tasks2[r][0] > tasks2[p][1] - tasks2[p][0]:
return -1
if tasks2[r][1] - tasks2[r][0] < tasks2[p][1] - tasks2[p][0]:
return 1
return 0
def compare3(result, path):
if result == []:
return 1
if duration(result) > duration(path):
return -1
if duration(result) < duration(path):
return 1
if len(result) > len(path):
return -1
if len(result) < len(path):
return 1
if tasks2[result[0]][0] < tasks2[path[0]][0]:
return -1
if tasks2[result[0]][0] > tasks2[path[0]][0]:
return 1
return 0
def compare4(result, path):
if result == []:
return 1
if len(result) > len(path):
return -1
if len(result) < len(path):
return 1
if duration(result) > duration(path):
return -1
if duration(result) < duration(path):
return 1
if tasks2[result[-1]][1] < tasks2[path[-1]][1]:
return -1
if tasks2[result[-1]][1] > tasks2[path[-1]][1]:
return 1
return 0
def search(index, path, head):
tail = True
compare = [compare1, compare2, compare3, compare4]
for i in range(index + 1, len(tasks2)):
if not overlap(index, i):
search(i, path + [index], True)
tail = False
break
elif head:
search(i, path, False)
if tail and compare[mode - 1](result, path + [index]) > 0:
result.clear()
result.extend(path + [index])
search(0, [], True)
return [to_clock(tasks2[i]) for i in result]
March 27, 2023
Comments: