我正在寻找一种优雅的方法来计算C#中MasterMind游戏的猜测得分,最好是使用LINQ.
在MasterMind中,代码生成器使用数字1到6生成4位数的密码.可以多次使用数字.例如,密码是:
int[] secret = { 1, 2, 3, 1 };
Run Code Online (Sandbox Code Playgroud)
代码破解者试图通过猜测来破解密码.在这个例子中,猜测是:
int[] guess = { 1, 1, 2, 2 };
Run Code Online (Sandbox Code Playgroud)
(代码和猜测现在都存储在一个数组中,但其他集合类型也可以).
然后,代码制作者通过宣布"黑人"和"白人"的数量来"评分"这个猜测.从猜测的每个数字中奖励黑色,其在值和位置都是正确的.对于放置在错误位置的每个正确数字,将获得白色.在该示例中,得分为1黑色(对于位置1中的"1")和2个白色(对于位置2和3中的"1"和"2").
回到问题:我正在寻找一种优雅的方法来计算C#中的猜测分数,最好使用LINQ.到目前为止,我已经提出了一个计算黑人数量的声明:
int blacks = new int[] { 0, 1, 2, 3 }.Count(i => (guess[i] == secret[i]));
Run Code Online (Sandbox Code Playgroud)
我打算按照白色数量是匹配总数(3)减去黑色数量的方式进行.所以我尝试过:
int whites = guess.Intersect(secret).Count() - blacks;
Run Code Online (Sandbox Code Playgroud)
但是,唉,IEnumerable.Intersect()产生{1,2}而不是{1,1,2},因为它只查看不同的数字.所以它计算白色= 1而不是2.
除了使用"C"样式的嵌套循环之外,我无法想出另一种计算"白人"的方法.你能?最好使用LINQ - 我喜欢使用LINQ在代码中表示算法的方式.执行速度不是真正的问题.
我有一个包含一系列(基类)车辆的Fleet类.阵列中的车辆是车辆的子类:平原,火车和汽车.该阵列是私有的,但Fleet类必须提供一种方法来获取给定类型的车辆.
就像是:
class Fleet
{
private Vehicle[] _vehicles;
// returns the vehicles of the specified subclass
public ???? Get(????)
{
return ????
}
}
Fleet fleet = new Fleet("fleet.def");
Trains[] trains = fleet.Get(Trains); // looks clean but isn't possible
Plains[] plains = fleet.Get<Plains>(); // looks okay but don't know
// how to implement
Run Code Online (Sandbox Code Playgroud)
(我正在使用数组,但实际上任何可以迭代的集合类型都很好.)
现在,正如您所看到的,我完全不知道如何实现这一点.我正在为Get方法寻找一个优雅的解决方案,效率并不是真正的问题.请详细说明解决方案中涉及的关键技术,以便我可以在我的C#书中查找它们......
谢谢!