当前位置: 首页 > 编程语言 > C#

分享_111

时间:2023-04-10 23:57:29 C#

在C#中使用MasterMind评分算法与LINQ使用LINQ。在MasterMind中,代码生成器使用数字1到6生成4位密码。号码可以多次使用。例如密码为:int[]secret={1,2,3,1};代码破解者试图通过猜测来破解密码。在这个例子中,猜测是:int[]guess={1,1,2,2};(代码和猜测现在都存储在一个数组中,但其他集合类型也可以)。然后,代码制作者通过宣布“黑人”和“白人”的人数来为猜测“打分”。从每个猜出的数字中获得黑色,其值和位置都是正确的。对于每个放置在错误位置的正确数字,都会获得白色。在示例中,得分为1黑色(对于位置1中的“1”)和2白色(对于位置2和3中的“1”和“2”)。回到问题:我正在寻找一种优雅的方法来计算C#中的猜测分数,最好使用LINQ。到目前为止,我想出了一个计算黑人人数的语句:intblacks=newint[]{0,1,2,3}.Count(i=>(guess[i]==secret[i]));我要继续说白人的数量是匹配总数(3)减去黑人的数量。所以我尝试了:intwhites=guess.Intersect(secret).Count()-blacks;但是,唉,IEnumerable.Intersect()生成{1,2}而不是{1,1,2}因为它只查看不同的数字。所以它计算的是white=1而不是2。除了使用“C”样式的嵌套循环之外,我想不出另一种方法来计算“whites”。你可以?最好使用LINQ-我喜欢LINQ用于在代码中表示算法的方式。执行速度不是真正的问题。varblack=guess.Zip(secret,(g,s)=>g==s).Count(z=>z);varwhite=guess.Intersect(secret).Sum(c=>System.Math.Min(secret.Count(x=>x==c),guess.Count(x=>x==c)))-黑色;给定:int[]secret={1,2,3,1};int[]猜测={1,1,2,2};然后:black==1&&white==2这是一种方法(假设我正确理解了问题):找到黑色分数-这很容易;它只是一个压缩序列并计算匹配对应元素的数量。找出两个序列之间“共同元素”的数量——这必须是白色和黑色分数的总和。找到白色分数-就是2和1之间的差值。//一定有更好的方法来做这个位intblackPlusWhite=secret.GroupBy(sNum=>sNum).Join(guess.GroupBy(gNum=>gNum),g=>g.Key,g=>g.Key,(g1,g2)=>Math.Min(g1.Count(),g2.Count())).Sum();intblack=guess.Zip(secret,(gNum,sNum)=>gNum==sNum).Count(correct=>correct);intwhite=blackPlusWhite-黑色;编辑:混合黑色和白色。编辑:(OP不在.NET4上)在.NET3.5中,您可以使用以下方法计算黑色:intblack=Enumerable.Range(0,secret.Count).Count(i=>secret[i]==guess[i]);阿尼的回答很棒。这是进行分组和加入的更好(和更清洁)的方法。以上就是C#学习教程:UsingLINQ在C#中使用MasterMind打分算法的全部内容分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——ILookupguessLookup=guess.ToLookup(i=>i);intblackPlusWhite(fromsecretNumberinsecret.GroupBy(i=>i)letsecretCount=secretNumber.Count()letguessCount=guessLookup[secretNumber.Key].Count()选择Math.Min(secretCount,guessCount)).Sum()intblack=Enumerable.Range(0,secret.Count).Count(i=>guess[i]==secret[i]);intwhite=blackPlusWhite-黑色;如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: