#B3775. [信息与未来 2022] Mathler(暂无交互库)

[信息与未来 2022] Mathler(暂无交互库)

题目描述

风靡全球的猜单词游戏有了数学版本!在这个游戏中,计算机会秘密产生一个隐藏的表达式,例如 90/5×2=3690/5\times 2=36。但计算机不会把具体的表达式告诉你,而是只把表达式的计算结果(在前面的例子中是 3636)告诉你。接下来,你需要用尽可能少的次数把这个表达式猜出来!

你可以和计算机多次互动完成猜测。在游戏的每一轮中,你都可以告诉计算机一个长度是 66 的字符串表达式,仅由数字 0123456789\texttt{0123456789} 和四则运算 +-*/\texttt{+-*/} 构成,表达式中不含负数且数字不包含前导零,并且表达式的计算结果必须是游戏开始时给出的数值(在我们的例子中是 3636)。计算机收到你猜测的表达式后,会对你给出表达式中每一个字符分别给出反馈:

  • 绿色:这个字符出现在隐藏表达式中,且位置正确;
  • 黄色:这个字符出现在隐藏表达式中,但位置不正确;
  • 灰色:这个字符没有出现在隐藏表达式中。

下面是一个三次猜中隐藏表达式的例子:

在你猜了很多次以后,觉得这个游戏已经有些无聊了。现在你希望编一个程序,让你的程序代替你在 1212 次猜测之内得到隐藏的表达式。

输入格式

本题为交互题,评测时会模拟键盘输入并读取程序的屏幕输出。首先,评测程序会在键盘输入一行一个整数 nn,代表隐藏表达式的计算结果,然后进入交互模式并等待你的程序输出一行(对隐藏的表达式进行猜测)。评测程序读取到你屏幕上的输出后,会及时用键盘输入的方式给出反馈。以下 C++ 代码片段可以实现与评测程序的交互(你需要补全其他必要的内容):

cin >> n; // int n;
while (true) {
 cout << guess(n) << endl; // 作出⼀次猜测,注意需要输出⼀个换⾏
 cin >> res; // string res; 计算机对猜测的反馈
 if (res == "AAAAAA") {
 break; // 游戏结束
 }
}

在交互过程中,评测程序会及时地对你的输出给出反馈(作为键盘输入给程序):

  • 对于不正确的表达式(例如有多余的空格、表达式不合法或值错误等),反馈六个半角减号("-"\texttt{"-"});
  • 对于值正确的表达式,反馈六个字符,其中:
    • "A"\texttt{"A"} 表示在表达式中出现且位置正确;
    • "B"\texttt{"B"} 表示在表达式中出现且位置不正确;
    • "X"\texttt{"X"} 表示在表达式中未出现。

注意隐藏表达式中同一个数字可能多次出现。如果你猜测的表达式中某个数字出现了多次,评测程序会优先给出 "A"\texttt{"A"} 的结果,然后从左到右给出 "B"\texttt{"B"} 的结果,多余的数字给出 "X"\texttt{"X"} 的结果。在 1212 次猜测以内得到 "AAAAAA"\texttt{"AAAAAA"} 且程序正常终止即被判定为正确。

本题中四则运算规则:先乘除、后加减,同优先级从左到右计算,允许计算过程中出现负数。除法是有理数的除法而非整除,即 2/5*10\texttt{2/5*10} 的值为 44 且禁止除零。完整的交互过程应在 11 秒内完成;评测程序的运行时间很短,可以忽略不计。

输出格式

见输入格式。

36

XXXBXB

------

BAXBAX

AAAAAA

6+3*10

6+3*11

50-2*7

90/5*2

8

BXXXXX

XXXXBX

ABBABX

AAAAAA

10-4+2

7*6-34

3+15/3

35/5+1

提示

样例组 11 的交互过程对应了题图的交互过程,但中间有一次输入非法表达式的情况。

对于 50%50\% 的数据,隐藏表达式至多只包含两个运算符,且运算符只有加法和减法。
对于 100%100\% 的数据,1n999,9991\leq n\leq 999,999。保证至少存在一个计算结果等于 nn 的表达式。