#include<bits/stdc++.h>
using namespace std;
char znak[] = {'P', 'K', 'N'};
int akt;
int zagraj(int x){
cout << znak[x] << endl;
char a;
cin >> a;
if(a == znak[x]){}
else if(a == 'P' && znak[x] == 'K')akt --;
else if(a == 'K' && znak[x] == 'N')akt--;
else if(a == 'N' && znak[x] == 'P')akt--;
else akt++;
if(a == 'P')return 0;
else if(a == 'K')return 1;
return 2;
// return a;
}
void wyrownaj(){
if(akt == 0)return;
if(akt == 1)zagraj(1);
else zagraj(0);
assert(akt == 0);
// akt = 0;
}
string xdd(string num, int z, int do_){
if (num == "0") return "0";
vector<int> digits;
for (char c : num){
digits.push_back(c - '0');
}
string res = "";
while (!digits.empty()){
long long r = 0;
vector<int> next_digits;
for (int d : digits) {
long long cur = d + r * z;
int q = cur / do_;
r = cur % do_;
if (!(next_digits.empty() && q == 0)){
next_digits.push_back(q);
}
}
res += to_string(r);
digits = next_digits;
}
reverse(res.begin(), res.end());
return res;
}
string binToTri(string bin) { return xdd(bin, 2, 3); }
string triToBin(string tri) { return xdd(tri, 3, 2); }
string niekto;
string kto;
string odp(string cc, string x){
int n = x.size();
mt19937 rng(cc[0] + n);
for(auto &a : x){
if(rng() % 2){
if(a == '1')a = '0';
else a = '1';
}
}
return x;
}
// void debug(string msg) {
// ofstream logfile("log.txt", ios::app);
// if (logfile.is_open()) {
// logfile << msg << endl;
// logfile.close();
// }
// }
int ile(string a){
int x = 0;
for(auto i : a){
if(i == '1')x ++;
}
return x;
}
void solve(int n, string a){
a = odp(kto,a);
a = binToTri(a);
// debug(kto + " " + a);
int x = a.size();
// debug("roz " + kto + " " + to_string(x));
int m = 0;
int pot = 1;
for(int i = 0; i < 8; i++){
int y = zagraj(x%3);
wyrownaj();
x /= 3;
m += pot * y;
pot *= 3;
}
// debug("roz " + kto + " rozsz " + to_string(m));
string b;
for(int i = 0; i < (int)a.size(); i++){
b.push_back((zagraj(a[i] - '0')) + '0');
if(i >= m && !b.empty())b.pop_back();
wyrownaj();
}
for(int i = a.size(); i < m ; i++){
b.push_back(zagraj(2) + '0');
wyrownaj();
}
// debug(kto + " tri " + b);
b = triToBin(b);
// debug(kto + " bin " + b);
while(b.size() < n)b.insert(b.begin(),'0');
// debug(kto + b);
// debug(kto + " " + odp(b));
cout << "! " << odp(niekto,b) << endl;
}
int main(){
cin >> kto;
// debug(kto);
if(kto == "Algosia")niekto = "Bajtek";
else niekto = "Algosia";
int n, t;
cin >> n >> t;
// if(kto[0] == 'A')cerr << kto << " " << n << " " << t << '\n';
while(t--){
akt = 0;
string a;
for(int i = 0; i < n; i++){
char c;
cin >> c;
a.push_back(c);
}
solve(n,a);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | #include<bits/stdc++.h> using namespace std; char znak[] = {'P', 'K', 'N'}; int akt; int zagraj(int x){ cout << znak[x] << endl; char a; cin >> a; if(a == znak[x]){} else if(a == 'P' && znak[x] == 'K')akt --; else if(a == 'K' && znak[x] == 'N')akt--; else if(a == 'N' && znak[x] == 'P')akt--; else akt++; if(a == 'P')return 0; else if(a == 'K')return 1; return 2; // return a; } void wyrownaj(){ if(akt == 0)return; if(akt == 1)zagraj(1); else zagraj(0); assert(akt == 0); // akt = 0; } string xdd(string num, int z, int do_){ if (num == "0") return "0"; vector<int> digits; for (char c : num){ digits.push_back(c - '0'); } string res = ""; while (!digits.empty()){ long long r = 0; vector<int> next_digits; for (int d : digits) { long long cur = d + r * z; int q = cur / do_; r = cur % do_; if (!(next_digits.empty() && q == 0)){ next_digits.push_back(q); } } res += to_string(r); digits = next_digits; } reverse(res.begin(), res.end()); return res; } string binToTri(string bin) { return xdd(bin, 2, 3); } string triToBin(string tri) { return xdd(tri, 3, 2); } string niekto; string kto; string odp(string cc, string x){ int n = x.size(); mt19937 rng(cc[0] + n); for(auto &a : x){ if(rng() % 2){ if(a == '1')a = '0'; else a = '1'; } } return x; } // void debug(string msg) { // ofstream logfile("log.txt", ios::app); // if (logfile.is_open()) { // logfile << msg << endl; // logfile.close(); // } // } int ile(string a){ int x = 0; for(auto i : a){ if(i == '1')x ++; } return x; } void solve(int n, string a){ a = odp(kto,a); a = binToTri(a); // debug(kto + " " + a); int x = a.size(); // debug("roz " + kto + " " + to_string(x)); int m = 0; int pot = 1; for(int i = 0; i < 8; i++){ int y = zagraj(x%3); wyrownaj(); x /= 3; m += pot * y; pot *= 3; } // debug("roz " + kto + " rozsz " + to_string(m)); string b; for(int i = 0; i < (int)a.size(); i++){ b.push_back((zagraj(a[i] - '0')) + '0'); if(i >= m && !b.empty())b.pop_back(); wyrownaj(); } for(int i = a.size(); i < m ; i++){ b.push_back(zagraj(2) + '0'); wyrownaj(); } // debug(kto + " tri " + b); b = triToBin(b); // debug(kto + " bin " + b); while(b.size() < n)b.insert(b.begin(),'0'); // debug(kto + b); // debug(kto + " " + odp(b)); cout << "! " << odp(niekto,b) << endl; } int main(){ cin >> kto; // debug(kto); if(kto == "Algosia")niekto = "Bajtek"; else niekto = "Algosia"; int n, t; cin >> n >> t; // if(kto[0] == 'A')cerr << kto << " " << n << " " << t << '\n'; while(t--){ akt = 0; string a; for(int i = 0; i < n; i++){ char c; cin >> c; a.push_back(c); } solve(n,a); } } |
English