#SPJINT1C. 1A2B (Bulls and Cows)

1A2B (Bulls and Cows)

提示

本题比较考验码力。

这是一道交互题。

注意,请在输出之后,加一行 flush\mathtt{flush}

下面给出 C,C++,Java,Python\mathtt{C, C++, Java, Python} 的输出方式:

  1. C\mathtt{C}

    printf("! 1234");
    fflush(stdout);
    
  2. C++\mathtt{C++}

    cout << "!" << 1234 << '\n';
    cout.flush();
    
  3. Java\mathtt{Java}

    System.out.println("! 1234");
    System.out.flush();
    
  4. Python\mathtt{Python}

    print("! 1234")
    stdout.flush()
    

背景

众所周知,cls 最近给 OJ 增加了很多道难度较大的搜索题。

为了解决这些搜索题,PC 每天都在和大法师(dfs)、蝙蝠衫(bfs)博弈。

终于,在连续做了三天搜索题后,他的脑子里仿佛时时刻刻有大法师在爬。

为了防止彻底被大法师上身,他决定去找一些小游戏来玩一玩,放松一下。

在论坛上逛了好久后,一款叫做 1A2B 的益智猜数游戏吸引了 PC 的注意。

但这款游戏需要两个人一起游玩,而 O神 又在忙着打 Arcaea,所以 PC 现在决定和你来一起玩这个小游戏。

说明

每次游戏开始时,PC 会在心里想出一个四位数 xx

xx 可能包含前导 00,但保证 xx[0,9][0, 9] 中不同的四个数字组成。

比如说,0148,12340148, 1234 是合法的,1145,00011145, 0001 是不合法的。

你可以随意想一个四位数 yy 然后告诉 PC,PC 会根据你的询问,回答你一个字符串,字符串按照 pAqB\mathtt{p}A\mathtt{q}B 的格式给出。

询问的四位数 yy 也可以包含前导 00且没有类似于 xx 的 由不同数字组成 的限制。

回答中的 p,q\mathtt{p, q} 是根据以下规则来确定的:

  1. 遍历 yy 的每一位数字;
  2. 每有一位数字 位置相同且值相同,则 p\mathtt{p} 加一;
  3. 每有一位数字 位置不相同但值相同,则 q\mathtt{q} 加一

比如:

x=1347,y=3456x = 1347, y = 3456,你将会得到 0A2B\mathtt{0}A\mathtt{2}B,因为 yy 中的数字 3,43, 4xx都出现了,但是位置都不相同

x=0412,y=0721x = 0412, y = 0721,你将会得到 1A2B\mathtt{1}A\mathtt{2}B,因为 yy 中的数字 0,2,10, 2, 1xx 中都出现了,但是 00 对应的位置 相同2,12, 1 对应的位置 不相同

x=1234,y=1212x = 1234, y = 1212,你将会得到 2A2B\mathtt{2}A\mathtt{2}B,因为 yy 中的数字 1,2,1,21, 2, 1, 2xx 中都出现了,但是前两个 1,21, 2 对应的位置 相同,后两个 1,21, 2 对应的位置 不相同

显然,只要询问次数够多,猜对指定的数字是很容易的。

所以,PC 想考考你,如何在最多 1515 次询问里,确定具体的四位数字呢?

有趣的是,1515 次绝对不是最优解,但是本题放宽了限制。

交互

本题有多组测试用例。

首先,你需要读入一行整数 tt,代表测试用例的数量。

接下来,对于每个测试用例,你需要进行最多 1515 次询问,并确定答案。

对于一次询问,输出 ? y,代表你给 PC 的四位数字 yy

接下来,读入一个字符串 vv,如果 vv 不为 ok,代表 yy 不是四位数字 或 询问次数超过了 1515 次,此时你需要立刻退出程序以得到 Wrong Answer 判定,否则你会遇到其他任意可能的评测结果。如果 vvok,请继续接下来的读入。

接下来,读入一个字符串 pAqB\mathtt{p}A\mathtt{q}B,代表 PC 的回复,并进行你的下一步计算。

如果你能唯一确定答案,输出 ! x,代表 PC 的数字 xx

同样的,你需要读入一个字符串 vv,如果 vv 不为 ok,代表你猜错了,此时你需要立刻退出程序以得到 Wrong Answer 判定,否则你会遇到其他任意可能的评测结果。如果 vvok,请继续接下来的读入。

只要你的答案是正确的,你就会得到 Accepted 判定。

如果你没有在输出后 flush\mathtt{flush},你将会得到除 Accepted 之外的其他任意评测结果。

样例

样例输入1

2

ok
3A0B

ok
2A1B

ok

ok
0A3B

ok
2A1B

ok
3A0B

ok

样例输出1

? 2738

? 2734

! 2748

? 9782

? 7829

? 3827

! 3825

样例解释1

在第一个测试用例中,x=2748x = 2748

玩家给出了询问 y=2738y = 27382,7,82, 7, 8xx 中出现了,且位置均相同,因此返回 3A0B\mathtt{3}A\mathtt{0}B

玩家给出了询问 y=2734y = 27342,7,42, 7, 4xx 中出现了,且 2,72, 7 对应的位置相同,44 对应的位置不相同,因此返回 2A1B\mathtt{2}A\mathtt{1}B

此时,44 个位置的数字都已确定,从而玩家确定答案为 x=2748x = 2748

请注意,样例的询问方式和游玩方式似乎很愚蠢,所以它也许只是一个形象化的例子。

提示

1t1041 \leq t \leq 10 ^ 4

xx 可能包含前导 00,但保证 xx[0,9][0, 9] 中不同的四个数字组成。

询问的四位数 yy 也可以包含前导 00且没有类似于 xx 的 由不同数字组成 的限制。