猜数字的算法的一个简单实现

猜数字的算法的一个简单实现,用的最简单的算法,权当编程练习。

 1      class GuessNumber
 2     {
 3          public  static IEnumerable< int> Guess(Func< intint> testHanlder)
 4         {
 5              var validNumers = Enumerable.Range( 19);     // 有效数字范围为1-9
 6               var candicateNum =  from n1  in validNumers
 7                                 from n2  in validNumers
 8                                 from n3  in validNumers
 9                                 from n4  in validNumers
10                                 where  new  int[] { n1, n2, n3, n4 }.Distinct().Count() ==  4     // 过滤掉有重复的数字
11                                  select n1 *  1000 + n2 *  100 + n3 *  10 + n4;
12 
13              while ( true)
14             {
15                  var num = candicateNum.First();
16                  yield  return num;
17 
18                  var result = testHanlder(num);
19                  if (result ==  40)
20                      yield  break;
21 
22                 candicateNum = candicateNum.Where(i => Test(i, num) == result);
23             }
24         }
25 
26          public  static IEnumerable< int> Guess( int num)
27         {
28              return Guess(i => Test(i, num));
29         }
30         
31          // 为了简单返回值为int型,如2A1B则返回21
32           public  static  int Test( int num1,  int num2)
33         {
34              var value1 = num1.ToString( " 0000 ");
35              var value2 = num2.ToString( " 0000 ");
36 
37             Contract.Assume((value1.Length ==  4) && (value2.Length ==  4));
38 
39              var query = value1.Zip(value2, (ch1, ch2) =>  new 
40                                     {
41                                         MatchA = (ch1 == ch2),
42                                         MatchB = (ch1 != ch2) && (value1.Contains(ch2))
43                                     }).ToArray();
44 
45              var aCount = query.Count(i => i.MatchA);
46              var bCount = query.Count(i => i.MatchB);
47 
48              return aCount *  10 + bCount;
49         }
50     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值