using System.Collections.Generic;
public static void Main(string[] args)
var mastermind = new Mastermind(new List<CodePeg> { CodePeg.Black, CodePeg.Blue, CodePeg.Yellow, CodePeg.Blue });
var hints = mastermind.GetHints(new List<CodePeg> { CodePeg.Black, CodePeg.Blue, CodePeg.Green, CodePeg.Yellow });
foreach (var hint in hints)
private List<CodePeg> code;
private HashSet<Movement> movements;
private HashSet<CodePeg> pegs;
public Mastermind(List<CodePeg> code)
this.movements = code.Select((peg, position) => new Movement { Position = position, Peg = peg }).ToHashSet();
this.pegs = code.ToHashSet();
public List<ResultPeg> GetHints(List<CodePeg> guess)
var blacks = new List<ResultPeg>();
var whites = new List<ResultPeg>();
for (var i = 0; i < guess.Count; i++)
var movement = new Movement { Position = position, Peg = peg };
if (movements.Contains(movement))
blacks.Add(ResultPeg.Black);
else if (pegs.Contains(peg))
whites.Add(ResultPeg.White);
return blacks.Concat(whites).Take(4).ToList();
public class Movement : IEquatable<Movement>
public int Position { get; set; }
public CodePeg Peg { get; set; }
public bool Equals(Movement other)
return other != null && Position == other.Position && Peg == other.Peg;
public override bool Equals(Object obj)
return Equals(obj as Movement);
public override int GetHashCode()
return Position.GetHashCode() ^ Peg.GetHashCode();