diff --git a/CSharp/Blackbaud.Interview.Cards/Deck.cs b/CSharp/Blackbaud.Interview.Cards/Deck.cs index 7b55e56..5e7aba2 100644 --- a/CSharp/Blackbaud.Interview.Cards/Deck.cs +++ b/CSharp/Blackbaud.Interview.Cards/Deck.cs @@ -57,5 +57,16 @@ public Card NextCard() return null; } } + public void ShuffleCards(IShuffler shuffler, int? shuffleRounds = null, int? seed = null) + { + if(shuffler is null) throw new ArgumentNullException(nameof(shuffler)); + var cards=_stackOfCards.Reverse().ToList(); + shuffler.shuffle(cards,shuffleRounds,seed); + _stackOfCards.Clear(); + foreach(var card in cards) + { + _stackOfCards.Push(card); + } + } } diff --git a/CSharp/Blackbaud.Interview.Cards/Program.cs b/CSharp/Blackbaud.Interview.Cards/Program.cs index 6d4dc52..d32b5c5 100644 --- a/CSharp/Blackbaud.Interview.Cards/Program.cs +++ b/CSharp/Blackbaud.Interview.Cards/Program.cs @@ -11,10 +11,10 @@ static void Main() // Create a new deck var deck = Deck.NewDeck(); - + IShuffler shuffler=new FisherYatesShuffler(); // TODO: shuffle the deck Console.WriteLine("Shuffling..."); - + deck.ShuffleCards(shuffler,shuffleRounds:100,seed:null); // Deal all the cards while (!deck.Empty) { diff --git a/CSharp/Blackbaud.Interview.Cards/Shuffler/IShuffler.cs b/CSharp/Blackbaud.Interview.Cards/Shuffler/IShuffler.cs new file mode 100644 index 0000000..4a80438 --- /dev/null +++ b/CSharp/Blackbaud.Interview.Cards/Shuffler/IShuffler.cs @@ -0,0 +1,6 @@ +namespace Blackbaud.Interview.Cards.Shuffler; + +public interface IShuffler +{ + void shuffle(IList cards,int?shuffleRounds=null,int?seed=null); +} \ No newline at end of file diff --git a/CSharp/Blackbaud.Interview.Cards/Shuffler/Shuffler.cs b/CSharp/Blackbaud.Interview.Cards/Shuffler/Shuffler.cs new file mode 100644 index 0000000..e4393bd --- /dev/null +++ b/CSharp/Blackbaud.Interview.Cards/Shuffler/Shuffler.cs @@ -0,0 +1,32 @@ +namespace Blackbaud.Interview.Cards.Shuffler; + +public class FisherYatesShuffler : IShuffler +{ + public void shuffle(IList cards, int? shuffleRounds = null, int? seed = null) + { + if(cards is null) throw new ArgumentNullException(nameof(cards)); + int n=cards.Count; + Random rand = seed.HasValue ? new Random(seed.Value) : new Random(); + if(shuffleRounds==null) + { + for(int i=n-1;i>0;i--) + { + int j=rand.Next(i+1); + (cards[i],cards[j])=(cards[j],cards[i]); + } + } + else + { + int rounds=shuffleRounds.Value; + for(int r = 0; r < rounds; r++) + { + int i=rand.Next(n); + int j=rand.Next(n); + if(i==j) continue; + (cards[i],cards[j])=(cards[j],cards[i]); + } + } + } + + +} \ No newline at end of file