public static int Solve1(List <string> data) { var claims = data.Select(Parse).ToList(); var fabric = new Dictionary <SquareInch, int>(); foreach (var claim in claims) { for (var i = 0; i < claim.Width; i++) { for (var j = 0; j < claim.Height; j++) { var claimedSquare = new SquareInch { Left = claim.Left + i, Top = claim.Top + j }; if (!fabric.ContainsKey(claimedSquare)) { fabric.Add(claimedSquare, 0); } fabric[claimedSquare]++; } } } return(fabric.Values.Count(v => v > 1)); }
public static int Solve2(List <string> data) { var claims = data.Select(Parse).ToList(); var fabric = new Dictionary <SquareInch, List <int> >(); var noOverlaps = new HashSet <int>(); foreach (var claim in claims) { var hasOverlaps = false; for (var i = 0; i < claim.Width; i++) { for (var j = 0; j < claim.Height; j++) { var claimedSquare = new SquareInch { Left = claim.Left + i, Top = claim.Top + j }; if (!fabric.ContainsKey(claimedSquare)) { fabric.Add(claimedSquare, new List <int>()); } else { hasOverlaps = true; foreach (var overlapping in fabric[claimedSquare]) { if (noOverlaps.Contains(overlapping)) { noOverlaps.Remove(overlapping); } } } fabric[claimedSquare].Add(claim.Id); } } if (!hasOverlaps) { noOverlaps.Add(claim.Id); } } return(noOverlaps.Single()); }
public bool Equals(SquareInch other) { return(Top == other.Top && Left == other.Left); }