publicclassFabricSlicing{publicintGetOverlap(intwidth,intheight,IEnumerable<string>fabricClaims){varfabric=GetFabricLayout(width,height,fabricClaims);returnfabric.GetOverlapArea();}publicIEnumerable<FabricSegments>GetNoOverlap(intwidth,intheight,IEnumerable<string>fabricClaims){varfabric=GetFabricLayout(width,height,fabricClaims);returnfabric.GetNoOverlap();}protectedFabricGetFabricLayout(intwidth,intheight,IEnumerable<string>fabricClaims){varfabric=newFabric(width,height,PopulateFabricClaims(fabricClaims));returnfabric;}protectedIEnumerable<FabricSegments>PopulateFabricClaims(IEnumerable<string>fabricClaims){List<FabricSegments>fabricSegments=newList<FabricSegments>();// #1 @ 1,3: 4x4Regexregex=newRegex(@"^#(?<id>\d*)\s@\s(?<x>\d*),(?<y>\d*):\s(?<width>\d*)x(?<height>\d*)$");foreach(varclaiminfabricClaims){varmatches=regex.Match(claim);fabricSegments.Add(newFabricSegments(){ClaimId=int.Parse(matches.Groups["id"].Value),Height=int.Parse(matches.Groups["height"].Value),Width=int.Parse(matches.Groups["width"].Value),StartCoordinateX=int.Parse(matches.Groups["x"].Value),StartCoordinateY=int.Parse(matches.Groups["y"].Value)});}returnfabricSegments;}}publicclassFabric{privatereadonlyPoint[,]_points;publicFabric(intwidth,intheight,IEnumerable<FabricSegments>fabricClaims){Width=width;Height=height;FabricClaims=fabricClaims;_points=newPoint[Width,Height];// Instantiate all the points (is there a better way to do this?)for(varrow=0;row<Width;row++){for(varcolumn=0;column<Height;column++){_points[row,column]=newPoint();}}PopulatePoints();}publicintWidth{get;}publicintHeight{get;}publicIEnumerable<FabricSegments>FabricClaims{get;}publicintGetOverlapArea(){intcount=0;for(varrow=0;row<Width;row++){for(varcolumn=0;column<Height;column++){if(_points[row,column].HasOverlap){count++;}}}returncount;}publicIEnumerable<FabricSegments>GetNoOverlap(){varoverlap=GetOverlap();returnFabricClaims.ToList().Except(overlap);}privatevoidPopulatePoints(){foreach(varfabricClaiminFabricClaims){for(varwidth=0;width<fabricClaim.Width;width++){for(varheight=0;height<fabricClaim.Height;height++){varpoint=_points[fabricClaim.StartCoordinateX+width,fabricClaim.StartCoordinateY+height];point.Occupied.Add(fabricClaim);}}}}privateIEnumerable<FabricSegments>GetOverlap(){List<FabricSegments>list=newList<FabricSegments>();for(varrow=0;row<Width;row++){for(varcolumn=0;column<Height;column++){varpoint=_points[row,column];if(point.HasOverlap){list.AddRange(point.Occupied);}}}returnlist;}}publicclassFabricSegments{publicintClaimId{get;set;}publicintWidth{get;set;}publicintHeight{get;set;}publicintStartCoordinateX{get;set;}publicintStartCoordinateY{get;set;}}publicclassPoint{publicboolIsOccupied=>Occupied.Count>0;publicboolHasOverlap=>Occupied.Count>1;publicList<FabricSegments>Occupied{get;set;}=newList<FabricSegments>();}
c# again
Tests: