public static void RunClaims(ClaimCount claimCount, IEnumerable <Claim> claims)
 {
     foreach (var claim in claims)
     {
         RunClaim(claimCount, claim);
     }
 }
 public static void Init(ClaimCount claimCount)
 {
     for (int i = 0; i < claimCount.Size.X; i++)
     {
         for (int j = 0; j < claimCount.Size.Y; j++)
         {
             claimCount.Count[i, j] = 0;
         }
     }
 }
 public static void RunClaim(ClaimCount claimCount, Claim claim)
 {
     for (int i = claim.Location.X; i < claim.Location.X + claim.Size.X; i++)
     {
         for (int j = claim.Location.Y; j < claim.Location.Y + claim.Size.Y; j++)
         {
             claimCount.Count[i, j] += 1;
         }
     }
 }
        public static ClaimsResult Calculate(Size boardSize, IEnumerable <Claim> claims)
        {
            var claimCount = new ClaimCount(boardSize);

            RunClaims(claimCount, claims);

            return(new ClaimsResult()
            {
                OverlappingCount = Count(claimCount),
                NonOverlappingClaims = FindFreeClaims(claimCount, claims)
            });
        }
        public static bool IsClaimFree(ClaimCount claimCount, Claim claim)
        {
            for (int i = claim.Location.X; i < claim.Location.X + claim.Size.X; i++)
            {
                for (int j = claim.Location.Y; j < claim.Location.Y + claim.Size.Y; j++)
                {
                    if (claimCount.Count[i, j] > 1)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        public static IEnumerable <int> FindFreeClaims(ClaimCount claimCount, IEnumerable <Claim> claims)
        {
            var freeClaims = new List <int>();

            foreach (var claim in claims)
            {
                var free = IsClaimFree(claimCount, claim);

                if (free)
                {
                    freeClaims.Add(claim.Id);
                }
            }

            return(freeClaims);
        }
        public static int Count(ClaimCount claimCount)
        {
            var count = 0;

            for (int i = 0; i < claimCount.Size.X; i++)
            {
                for (int j = 0; j < claimCount.Size.Y; j++)
                {
                    if (claimCount.Count[i, j] > 1)
                    {
                        count++;
                    }
                }
            }

            return(count);
        }