#include <iostream>
#include <vector>
char S[3] = {'P', 'K', 'N'};
int to_tit(char c) {
if (c == S[0]) return 0;
else if (c == S[1]) return 1;
else if (c == S[2]) return 2;
else return -1;
}
std::string to_bits(int pack, int bits = 19) {
std::string msg;
for (int i=0;i<bits;++i) {
msg.push_back( (pack & (1<<i)) ? '1' : '0');
}
return msg;
}
char winner(char looser) {
if (looser == 'P') return 'N';
else if (looser == 'K') return 'P';
else if (looser == 'N') return 'K';
else return -1;
}
int n;
std::vector<int> to_packs(const std::string &msg, int bits = 19) {
std::vector<int> P;
int b = 0;
int v = 0;
for (int i=0;i<n;++i) {
if (msg[i] == '1') v|=1<<b;
++b;
if (b >= bits) {
P.push_back(v);
b = 0;
v = 0;
}
}
if (b > 0) P.push_back(v);
return P;
}
int play(int output_pack, int tits = 12) {
int input_pack = 0;
int mul = 1;
for (int i=0;i<tits;++i) {
char output_c = S[output_pack%3];
output_pack /= 3;
std::cout << output_c << std::endl;
char input_c;
std::cin >> input_c;
input_pack += to_tit(input_c)*mul;
mul *= 3;
if (output_c == input_c) continue; // tie
// reverse
std::cout << input_c << std::endl;
std::cin >> input_c;
}
return input_pack;
}
int main() {
std::ios_base::sync_with_stdio(0);
std::string role;
std::cin >> role;
int T;
std::cin >> n >> T;
for (int t=0;t<T;++t) {
std::string msg;
std::cin >> msg;
std::string input_msg;
int nn = n;
for (int output_pack : to_packs(msg)) {
int input_pack = play(output_pack);
int bits = std::min(19, nn);
nn -= bits;
input_msg += to_bits(input_pack, bits);
}
std::cout << "! " << input_msg << std::endl;
}
// if (role == "Algosia") {
// } else if (role == "Bajtek") {
// } else {
// std::cerr << "unsupported role" << std::endl;
// }
return 0;
}
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 | #include <iostream> #include <vector> char S[3] = {'P', 'K', 'N'}; int to_tit(char c) { if (c == S[0]) return 0; else if (c == S[1]) return 1; else if (c == S[2]) return 2; else return -1; } std::string to_bits(int pack, int bits = 19) { std::string msg; for (int i=0;i<bits;++i) { msg.push_back( (pack & (1<<i)) ? '1' : '0'); } return msg; } char winner(char looser) { if (looser == 'P') return 'N'; else if (looser == 'K') return 'P'; else if (looser == 'N') return 'K'; else return -1; } int n; std::vector<int> to_packs(const std::string &msg, int bits = 19) { std::vector<int> P; int b = 0; int v = 0; for (int i=0;i<n;++i) { if (msg[i] == '1') v|=1<<b; ++b; if (b >= bits) { P.push_back(v); b = 0; v = 0; } } if (b > 0) P.push_back(v); return P; } int play(int output_pack, int tits = 12) { int input_pack = 0; int mul = 1; for (int i=0;i<tits;++i) { char output_c = S[output_pack%3]; output_pack /= 3; std::cout << output_c << std::endl; char input_c; std::cin >> input_c; input_pack += to_tit(input_c)*mul; mul *= 3; if (output_c == input_c) continue; // tie // reverse std::cout << input_c << std::endl; std::cin >> input_c; } return input_pack; } int main() { std::ios_base::sync_with_stdio(0); std::string role; std::cin >> role; int T; std::cin >> n >> T; for (int t=0;t<T;++t) { std::string msg; std::cin >> msg; std::string input_msg; int nn = n; for (int output_pack : to_packs(msg)) { int input_pack = play(output_pack); int bits = std::min(19, nn); nn -= bits; input_msg += to_bits(input_pack, bits); } std::cout << "! " << input_msg << std::endl; } // if (role == "Algosia") { // } else if (role == "Bajtek") { // } else { // std::cerr << "unsupported role" << std::endl; // } return 0; } |
English