题解:B3981 [信息与未来 2024] 图灵完备

· · 题解

这个 5000 的限制就很烦,否则我们可以构造一个 1 然后拼在一起。

但是这启发我们,答案一定是用什么东西拼起来的。正常的什么二进制不行,因为本题没有乘法操作,只能加法凑。

但是我们根据已有的 JavaScript 语法经验或者单纯对于给出的字符组合,发现 +[] 返回一个 Number,[]+[] 返回一个 String。执行 +([]+[]) 对一个空字符串求值又得到了一个 0。也就是说,我们把 n 的每一位用 String 表示出来拼接在一起,然后转成 Number 类型即可。一个 +!![] 就是 1,每一位最多拼接 9 次。长度显然不会超过 5000

Fun Fact:有一个为本题而生的网站 https://jsfuck.com/。也许下面的信息可以对于做这题给出一些启发。

#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
    cin >> s;
    cout << "+(";
    for (int i = 0; i < s.size(); i++)
    {
        if (i)
            cout << "+";
        s[i] ^= '0';
        cout << "(";
        for (int j = 1; j <= s[i]; j++)
            cout << string("+!![]").substr(!(j >= 1));
        cout << "+[])";
    }
    cout << ")";
    cout << endl;
    return 0;
}