首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(x++ !== x) & (x++ === x)能返回true吗?

(x++ !== x) & (x++ === x)能返回true吗?
EN

Stack Overflow用户
提问于 2018-10-12 11:39:36
回答 1查看 839关注 0票数 11

我的一个朋友在面试时遇到了这个问题。

查找使此函数返回为true的x值。

代码语言:javascript
复制
function f(x) {
    return (x++ !== x) && (x++ === x);
}

采访者补充道:X应该是5 字符 max

我找到了7个字符的多个答案:

代码语言:javascript
复制
[["2**53-1"],["2*3**33"],["2-5**23"],["5**23-2"],["3**33*2"]]

但我找不到一个有五个字的。(甚至不包括6)。我怀疑是否有一个有5个字符的解决方案。但经过研究,我发现了一个网站:https://alf.nu/ReturnTrue,它提供了同样的挑战,并且发现有一个(或多个)有5个字符的解决方案:

有人能帮忙知道这是什么吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-12 15:01:23

使用不同的操作对解决方案进行彻底搜索是很简单的。

由于使f成为现实的唯一解决方案是值>=而不是Number.MAX_SAFE_INTEGER,因此我们立即想到在一个小空间内实现它们的指数化或科学表示法。

指数法

我们使用两个字符,只有3个字符表示数字:

代码语言:javascript
复制
// n**mm
for (n = 0; n <= 9; ++n)
for (m = 0; m <= 99; ++m)
    if (f(n**m))
        console.log(n, m, n**m);

// nn**m
for (n = 0; n <= 99; ++n)
for (m = 0; m <= 9; ++m)
    if (f(n**m))
        console.log(n, m, n**m);

由于只剩下3位数字,所以我们不能在这里使用加法/减法来偏移(它至少需要2个字符)。

科学符号

我们使用一个字符,因此留下了4个潜在的数字:

代码语言:javascript
复制
// nEmmm
for (n = 0; n <= 9; ++n)
for (m = 0; m <= 999; ++m)
    if (f(n*(10**m)))
        console.log(n, m, n*(10**m));

// nnEmm
for (n = 0; n <= 99; ++n)
for (m = 0; m <= 99; ++m)
    if (f(n*(10**m)))
        console.log(n, m, n*(10**m));

// nnnEm
for (n = 0; n <= 999; ++n)
for (m = 0; m <= 9; ++m)
    if (f(n*(10**m)))
        console.log(n, m, n*(10**m));

但是,在这种情况下,我们可以进行加/减:

代码语言:javascript
复制
// nEm+d
for (n = 0; n <= 9; ++n)
for (m = 0; m <= 9; ++m)
for (d = 0; d <= 9; ++d)
    if (f(n*(10**m)+d))
        console.log(n, m, d, n*(10**m)+d);

// nEm-d
for (n = 0; n <= 9; ++n)
for (m = 0; m <= 9; ++m)
for (d = 0; d <= 9; ++d)
    if (f(n*(10**m)-d))
        console.log(n, m, d, n*(10**m)-d);

全表达式搜索

考虑到字符串空间只有5个字符,我们也可以对整个字符串空间进行彻底的搜索。

为了加快速度,让我们只使用我们认为实际可以到达的字符(例如数字、算术运算符等等)。如果我们使用以下24个字符,这就是24**5的可能性,它只需要几百万测试(在现代计算机中应该只需要一分钟左右):

代码语言:javascript
复制
const s = [
    "0","1","2","3","4","5","6","7","8","9",
    "e",".",
    "*","+","-","/","%",
    "!","^","&","|","<",">","~"
];
const l = s.length;
for (var n1 = 0; n1 < l; ++n1)
for (var n2 = 0; n2 < l; ++n2)
for (var n3 = 0; n3 < l; ++n3)
for (var n4 = 0; n4 < l; ++n4)
for (var n5 = 0; n5 < l; ++n5)
    try {
        const expr = s[n1] + s[n2] + s[n3] + s[n4] + s[n5];
        if (f(eval(expr)))
            console.log(expr);
    } catch (e) {};

注意:我们必须使用try...catch,因为许多表达式都是无效的。另外,要小心您使用的变量名(例如,如果您使用e作为循环计数器,您将得到像--e这样的字符串,这将使您进入一个无限循环!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52778747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档