#include <bits/stdc++.h>

#ifndef LOCAL_
#define fprintf if( false ) fprintf
#endif // LOCAL_
#define dump() fprintf(stderr, "#%s.%d\n", __func__, __LINE__);
#define dumpl(x1) fprintf(stderr, "#%s.%d (%s) = (%ld)\n", __func__, __LINE__, #x1, x1);
#define dumpll(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%ld, %ld)\n", __func__, __LINE__, #x1, #x2, x1, x2);
#define dumplll(x1, x2, x3) fprintf(stderr, "#%s.%d (%s, %s, %s) = (%ld, %ld, %ld)\n", __func__, __LINE__, #x1, #x2, #x3, x1, x2, x3);
#define dumpd(x1) fprintf(stderr, "#%s.%d (%s) = (%lf)\n", __func__, __LINE__, #x1, x1);
#define dumpdd(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%lf, %lf)\n", __func__, __LINE__, #x1, #x2, x1, x2);
#define loop for(;;)
typedef std::vector<long> LI;
typedef std::queue<long> QI;
#define rep(i,n) for(long i = 0; i < (long)n; ++i)
const double pi = M_PI;
const long mod = 1000000007;

template<typename T> void scan1(T& x) { fprintf(stderr, "unknown type\n"); }
template<> void scan1(long& x) { if( scanf("%ld", &x) < 0 ) exit(0); }
template<> void scan1(std::string& x) { if( not ( std::cin >> x ) ) exit(0); }
void scan() {}
template<typename Head, typename... Tail>
void scan(Head& x, Tail&... xs) {
  scan1(x); scan(xs...);
}

struct Solver {
   Solver() { fprintf(stderr, "--------Solver begin--------\n"); }
   ~Solver() { fprintf(stderr, "--------Solver end--------\n"); }
   bool test(long n, long q) {
      bool res = false;
      if( q <= n and std::to_string(q) <= std::to_string(n) ) res = true;
      if( q >  n and std::to_string(q) >  std::to_string(n) ) res = true;
      long t = res ? 1 : 0;
      // dumplll(n, q, t);
      return res;
   }
   bool query(long q) {
      printf("? %ld\n", q);
      fflush(stdout);
      std::string str;
      std::cin >> str;
      if( str[0] == 'Y' ) return true;
      return false;
   }
   void solve() {
      // long x; scan(x);
      long base = 100000000;
      long addtail = 1000000000;
      // long res = (1LL << 32) - 1;
      std::string cmp = "000000000009";
      for(long i = 0; i < 10; ++i) {
         long tt = 0;
         for(long k = 3; k >= 0; --k) {
            long ttt = tt + (1LL << k);
            if( ttt >= 10 ) { continue; }
            cmp[i] = ttt + '0';
            // if( not test(x, std::stol(cmp)) ) tt = ttt;
            if( not query(std::stol(cmp)) ) tt = ttt;
         }
         cmp[i] = tt + '0';
      }
      cmp.pop_back();
      long res = std::stol(cmp) + 10;
      dumpl(res);
      while( res % 10 == 0 ) res /= 10;
      if( res == 1 ) {
         res = 1;
         long t = 2;
         for(long i = 0; i < 10; ++i) {
            // dumpl(t);
            // bool b = test(x, t);
            bool b = query(t);
            // puts(test(x, t) ? "Yes" : "No");
            if( b ) {
               for(long k = 0; k < i; ++k) {
                  res *= 10;
               }
               break;
            }
            t *= 10;
         }
         printf("! %ld\n", res);
         fflush(stdout);
      }
      else {
         while( res % 10 == 0 ) res /= 10;
         // printf("%ld\n", res);
         long t = 1;
         for(long i = 0; i < 10; ++i) {
            // dumpl(t);
            // bool b = test(x, t);
            bool b = query(t);
            // puts(test(x, t) ? "Yes" : "No");
            if( not b ) {
               long len = i - (long)std::to_string(res).size();
               for(long k = 0; k < len; ++k) {
                  res *= 10;
               }
               break;
            }
            t *= 10;
         }
         printf("! %ld\n", res);
         fflush(stdout);
      }
   }
};

int main() {
   // loop std::unique_ptr<Solver>(new Solver())->solve();
   std::unique_ptr<Solver>(new Solver())->solve();
}



Measured memory_bytes: 596