#include <iostream>
#include <cstring>
#include <limits>
using namespace std;
void Split(int x, int& a, int& b, int& c, int& d)
{
d = x % 10; x /= 10;
c = x % 10; x /= 10;
b = x % 10; x /= 10;
a = x % 10;
}
bool IsValid(int x)
{
int a, b, c, d;
Split(x, a, b, c, d);
return
(a >= 1) && (a <= 9) &&
(a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d);
}
bool Matches(int n1, int n2, int bulls, int cows)
{
int a1, b1, c1, d1, a2, b2, c2, d2;
Split(n1, a1, b1, c1, d1);
Split(n2, a2, b2, c2, d2);
return
bulls == (
(a1 == a2) + (b1 == b2) + (c1 == c2) + (d1 == d2)
) &&
cows == (
(a1 == b2) + (a1 == c2) + (a1 == d2) +
(b1 == a2) + (b1 == c2) + (b1 == d2) +
(c1 == a2) + (c1 == b2) + (c1 == d2) +
(d1 == a2) + (d1 == b2) + (d1 == c2)
);
}
const int setSize = 10000;
bool badNum[setSize];
int main()
{
memset(badNum, 0, sizeof(badNum));
for (int i = 0; i < setSize; i++)
badNum[i] = !IsValid(i);
while (true)
{
int bulls, cows;
int question;
for (question = 0; question < setSize && badNum[question]; question++);
if (question >= setSize)
{
cout << "bye 8-|";
break;
}
cout << question << " ???" << endl;
cout << "bulls, cows: ";
cin >> bulls >> cows;
if (bulls == 4 && cows == 0)
{
cout << "that's it :-)";
break;
}
for (int i = 0; i < setSize; i++)
badNum[i] = badNum[i] || !Matches(i, question, bulls, cows);
}
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGxpbWl0cz4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnZvaWQgU3BsaXQoaW50IHgsIGludCYgYSwgaW50JiBiLCBpbnQmIGMsIGludCYgZCkKewogICAgZCA9IHggJSAxMDsgeCAvPSAxMDsKICAgIGMgPSB4ICUgMTA7IHggLz0gMTA7CiAgICBiID0geCAlIDEwOyB4IC89IDEwOwogICAgYSA9IHggJSAxMDsKfQogCmJvb2wgSXNWYWxpZChpbnQgeCkKewogICAgaW50IGEsIGIsIGMsIGQ7CiAgICBTcGxpdCh4LCBhLCBiLCBjLCBkKTsKICAgIHJldHVybgogICAgICAgIChhID49IDEpICYmIChhIDw9IDkpICYmCiAgICAgICAgKGEgIT0gYikgJiYgKGEgIT0gYykgJiYgKGEgIT0gZCkgJiYgKGIgIT0gYykgJiYgKGIgIT0gZCkgJiYgKGMgIT0gZCk7Cn0KIApib29sIE1hdGNoZXMoaW50IG4xLCBpbnQgbjIsIGludCBidWxscywgaW50IGNvd3MpCnsKICAgIGludCBhMSwgYjEsIGMxLCBkMSwgYTIsIGIyLCBjMiwgZDI7CiAgICBTcGxpdChuMSwgYTEsIGIxLCBjMSwgZDEpOwogICAgU3BsaXQobjIsIGEyLCBiMiwgYzIsIGQyKTsKICAgIHJldHVybgogICAgICAgIGJ1bGxzID09ICgKICAgICAgICAgICAgKGExID09IGEyKSArIChiMSA9PSBiMikgKyAoYzEgPT0gYzIpICsgKGQxID09IGQyKQogICAgICAgICkgJiYKICAgICAgICBjb3dzID09ICgKICAgICAgICAgICAgKGExID09IGIyKSArIChhMSA9PSBjMikgKyAoYTEgPT0gZDIpICsKICAgICAgICAgICAgKGIxID09IGEyKSArIChiMSA9PSBjMikgKyAoYjEgPT0gZDIpICsKICAgICAgICAgICAgKGMxID09IGEyKSArIChjMSA9PSBiMikgKyAoYzEgPT0gZDIpICsKICAgICAgICAgICAgKGQxID09IGEyKSArIChkMSA9PSBiMikgKyAoZDEgPT0gYzIpCiAgICAgICAgKTsKfQogCmNvbnN0IGludCBzZXRTaXplID0gMTAwMDA7CmJvb2wgYmFkTnVtW3NldFNpemVdOwogCmludCBtYWluKCkKewogICAgbWVtc2V0KGJhZE51bSwgMCwgc2l6ZW9mKGJhZE51bSkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXRTaXplOyBpKyspCiAgICAgICAgYmFkTnVtW2ldID0gIUlzVmFsaWQoaSk7CiAgICB3aGlsZSAodHJ1ZSkKICAgIHsKICAgICAgICBpbnQgYnVsbHMsIGNvd3M7CiAgICAgICAgaW50IHF1ZXN0aW9uOwogICAgICAgIGZvciAocXVlc3Rpb24gPSAwOyBxdWVzdGlvbiA8IHNldFNpemUgJiYgYmFkTnVtW3F1ZXN0aW9uXTsgcXVlc3Rpb24rKyk7CiAgICAgICAgaWYgKHF1ZXN0aW9uID49IHNldFNpemUpCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJieWUgOC18IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgcXVlc3Rpb24gPDwgIiA/Pz8iIDw8IGVuZGw7CiAgICAgICAgY291dCA8PCAiYnVsbHMsIGNvd3M6ICI7CiAgICAgICAgY2luID4+IGJ1bGxzID4+IGNvd3M7CiAgICAgICAgaWYgKGJ1bGxzID09IDQgJiYgY293cyA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAidGhhdCdzIGl0IDotKSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldFNpemU7IGkrKykKICAgICAgICAgICAgYmFkTnVtW2ldID0gYmFkTnVtW2ldIHx8ICFNYXRjaGVzKGksIHF1ZXN0aW9uLCBidWxscywgY293cyk7CiAgICB9CiAgICBjaW4uaWdub3JlKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgoKSwgJ1xuJyk7CiAgICBjaW4uaWdub3JlKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgoKSwgJ1xuJyk7Cn0=