fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <limits>
  4.  
  5. using namespace std;
  6.  
  7. void Split(int x, int& a, int& b, int& c, int& d)
  8. {
  9. d = x % 10; x /= 10;
  10. c = x % 10; x /= 10;
  11. b = x % 10; x /= 10;
  12. a = x % 10;
  13. }
  14.  
  15. bool IsValid(int x)
  16. {
  17. int a, b, c, d;
  18. Split(x, a, b, c, d);
  19. return
  20. (a >= 1) && (a <= 9) &&
  21. (a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d);
  22. }
  23.  
  24. bool Matches(int n1, int n2, int bulls, int cows)
  25. {
  26. int a1, b1, c1, d1, a2, b2, c2, d2;
  27. Split(n1, a1, b1, c1, d1);
  28. Split(n2, a2, b2, c2, d2);
  29. return
  30. bulls == (
  31. (a1 == a2) + (b1 == b2) + (c1 == c2) + (d1 == d2)
  32. ) &&
  33. cows == (
  34. (a1 == b2) + (a1 == c2) + (a1 == d2) +
  35. (b1 == a2) + (b1 == c2) + (b1 == d2) +
  36. (c1 == a2) + (c1 == b2) + (c1 == d2) +
  37. (d1 == a2) + (d1 == b2) + (d1 == c2)
  38. );
  39. }
  40.  
  41. const int setSize = 10000;
  42. bool badNum[setSize];
  43.  
  44. int main()
  45. {
  46. memset(badNum, 0, sizeof(badNum));
  47. for (int i = 0; i < setSize; i++)
  48. badNum[i] = !IsValid(i);
  49. while (true)
  50. {
  51. int bulls, cows;
  52. int question;
  53. for (question = 0; question < setSize && badNum[question]; question++);
  54. if (question >= setSize)
  55. {
  56. cout << "bye 8-|";
  57. break;
  58. }
  59. cout << question << " ???" << endl;
  60. cout << "bulls, cows: ";
  61. cin >> bulls >> cows;
  62. if (bulls == 4 && cows == 0)
  63. {
  64. cout << "that's it :-)";
  65. break;
  66. }
  67. for (int i = 0; i < setSize; i++)
  68. badNum[i] = badNum[i] || !Matches(i, question, bulls, cows);
  69. }
  70. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  71. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  72. }
Success #stdin #stdout 0s 3356KB
stdin
Standard input is empty
stdout
1023 ???
bulls, cows: bye 8-|