/// <summary> /// Can a meld be added to the current accumulator? /// </summary> private bool CanAddMeld(int index, Mentsu mentsu) { if (index > TypesInSuit - mentsu.Stride) { return false; } var max = TilesPerType - mentsu.Amount; return Accumulator.Skip(index).Take(mentsu.Stride).All(i => i <= max); }
/// <summary> /// Creates all possible combinations of used tiles for a number of melds in a single suit by adding a specific meld. /// </summary> private IEnumerable<Combination> Create(int remainingMelds, int currentIndex, Mentsu mentsu) { var indices = Enumerable.Range(currentIndex, TypesInSuit - currentIndex); var freeIndices = indices.Where(i => CanAddMeld(i, mentsu)); foreach (var index in freeIndices) { AddToAccumulator(index, mentsu.Stride, mentsu.Amount); foreach (var combination in Create(remainingMelds - 1, index)) { yield return combination; } AddToAccumulator(index, mentsu.Stride, -mentsu.Amount); } }