using System.Collections.Generic;
public static void Main()
var p1 = new PlayData(TimeSpan.Zero, new TimeSpan(11,0,0), false);
var p5 = new PlayData(new TimeSpan(7,0,0), new TimeSpan(9,0,0), true);
var p2 = new PlayData(new TimeSpan(11,0,0), new TimeSpan(14,0,0), false);
var p3 = new PlayData(new TimeSpan(14,0,0), new TimeSpan(16,0,0), false);
var p4 = new PlayData(new TimeSpan(16,0,0), new TimeSpan(24,0,0), false);
var p6 = new PlayData(new TimeSpan(22,0,0), new TimeSpan(23,0,0), true);
var p7 = new PlayData(new TimeSpan(23,0,0), new TimeSpan(24,0,0), true);
var list = new List<PlayData>{ p1, p2, p3, p4, p5,p6, p7};
var results = Flatten(list);
foreach(PlayData item in results.OrderBy(x => x.Start))
Console.WriteLine($"{item.Start.ToString("hhmm")}_{item.End.ToString("hhmm")}_{item.IsPeak.ToString()}");
private static Boolean between(TimeSpan compare, TimeSpan start, TimeSpan end){
if(compare > start && compare < end){
private static Boolean between(TimeSpan compare, PlayData segment){
return between(compare, segment.Start, segment.End);
private static Boolean hasOverlap(PlayData one, PlayData two){
return between(one.Start, two) || between(one.End, two) || between(two.Start, one) || between(two.End, one) || (one.Start == two.Start && one.End == two.End);
private static Boolean hasPeakOverlap(PlayData segment, List<PlayData> plays){
foreach(PlayData compare in plays){
if(compare.IsPeak != true || compare == segment){
if(hasOverlap(segment, compare)){
private static List<PlayData> splitPlays(PlayData peak, PlayData datum){
Console.WriteLine("Splitting plays");
List<PlayData> newPlays = new List<PlayData>();
if(datum.Start < peak.Start){
newPlays.Add(new PlayData(datum.Start, peak.Start, false));
if(datum.End > peak.End){
newPlays.Add(new PlayData(peak.End, datum.End, false));
private static List<PlayData> BisectPlays(List<PlayData> plays, PlayData peak){
List<PlayData> newPlays = new List<PlayData>();
foreach(PlayData current in plays){
if(hasOverlap(current, peak)){
newPlays.AddRange(splitPlays(peak, current));
private static List<PlayData> Flatten(List<PlayData> plays)
List<PlayData> poop = new List<PlayData>();
foreach(PlayData current in plays){
if(hasPeakOverlap(current, plays)){
List<PlayData> modifiedPlays = plays;
foreach(PlayData current in plays){
modifiedPlays = BisectPlays(modifiedPlays, current);
public TimeSpan Start { get; set; }
public TimeSpan End { get; set; }
public bool IsPeak { get; set; }
public PlayData(TimeSpan start, TimeSpan end, bool isPeak)
return new PlayData(Start, End, IsPeak);