#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
using lld = long double;
using vll = int64_t;
int main() {
  map<int, pair<int, int> > hm;
  int a[] = {4, 8, 15, 16, 23, 42};
  for (int i = 0; i < 6; i++) {
    for (int j = i + 1; j < 6; j++) hm[a[i] * a[j]] = {a[i], a[j]};
  }
  int ans[7];
  cout << "? "
       << "1 2\n"
       << flush;
  int x;
  cin >> x;
  auto p1 = hm[x];
  cout << "? 2 3\n" << flush;
  cin >> x;
  auto p2 = hm[x];
  if (p1.first == p2.first || p1.first == p2.second) {
    ans[2] = p1.first;
    ans[1] = p1.second;
    if (p1.first == p2.first) {
      ans[3] = p2.second;
    } else {
      ans[3] = p2.first;
    }
  } else {
    ans[2] = p1.second;
    ans[1] = p1.first;
    if (p1.second == p2.first)
      ans[3] = p2.second;
    else
      ans[3] = p2.first;
  }
  cout << "? 4 5\n" << flush;
  cin >> x;
  p1 = hm[x];
  cout << "? 5 6\n" << flush;
  cin >> x;
  p2 = hm[x];
  if (p1.first == p2.first || p1.first == p2.second) {
    ans[5] = p1.first;
    ans[4] = p1.second;
    if (p1.first == p2.first) {
      ans[6] = p2.second;
    } else {
      ans[6] = p2.first;
    }
  } else {
    ans[5] = p1.second;
    ans[4] = p1.first;
    if (p1.second == p2.first)
      ans[6] = p2.second;
    else
      ans[6] = p2.first;
  }
  cout << "! ";
  for (int i = 1; i < 7; i++) cout << ans[i] << " ";
  cout << "\n" << flush;
  return 0;
}
