/// <summary> /// P (card in {cardsToSearch}) /// </summary> public Probability GetProbability(IEnumerable <Card> cardsToSearch, IEnumerable <Card> excludedCards) { if (cardsToSearch == null) { throw new ArgumentNullException(nameof(cardsToSearch)); } if (excludedCards == null) { throw new ArgumentNullException(nameof(excludedCards)); } Matrix excludedCardsMatrix = _converter.Encode(excludedCards); Matrix guessMatrix = GetCorrectedGuess(excludedCardsMatrix); int positiveWays = cardsToSearch.Sum(card => guessMatrix[card.Rank, card.Color]); int allWays = 0; foreach (Rank number in _provider.Ranks) { foreach (var color in _provider.Colors) { allWays += guessMatrix[number, color]; } } return(new Probability(positiveWays / (double)allWays)); }
// карты, которые нельзя сбрасывать, для которых верно: // их нет в фейерверке; // они должны быть в фейерверке; // на руках или в колоде осталась всего одна такая карта. public IReadOnlyList <Card> GetUniqueCards(FireworkPile fireworkPile, DiscardPile discardPile) { if (fireworkPile == null) { throw new ArgumentNullException(nameof(fireworkPile)); } if (discardPile == null) { throw new ArgumentNullException(nameof(discardPile)); } Matrix resultMatrix = _provider.CreateFullDeckMatrix(); // вычитаем сброшенные карты Matrix thrown = _converter.Encode(discardPile.Cards); foreach (var number in _provider.Ranks) { foreach (var color in _provider.Colors) { if (resultMatrix[number, color] > 0 && thrown[number, color] > 0) { resultMatrix[number, color] -= thrown[number, color]; } } } // уберём недостижимые карты foreach (var color in _provider.Colors) { bool wasZero = false; foreach (var number in _provider.Ranks) { if (!wasZero) { if (resultMatrix[number, color] == 0) { wasZero = true; } } else { resultMatrix[number, color] = 0; } } } // учтём сыгранные карты Matrix played = _converter.Encode(fireworkPile.Cards); foreach (var number in _provider.Ranks) { foreach (var color in _provider.Colors) { if (played[number, color] == 1) { resultMatrix[number, color] = 0; } } } // интересуют только те ячейки, в которых значение 1 // остальные зануляем foreach (var number in _provider.Ranks) { foreach (var color in _provider.Colors) { if (resultMatrix[number, color] != 1) { resultMatrix[number, color] = 0; } } } // в итоге получили матрицу, в которой // 0 стоит у неуникальных карт, // 1 стоит у уникальных карт return(_converter.Decode(resultMatrix)); }