Javascript Can(x+;+;!==x)&&;(x+;+;==x);返回真值?

Javascript Can(x+;+;!==x)&&;(x+;+;==x);返回真值?,javascript,Javascript,我的一个朋友在面试时遇到了这个问题 查找将使此函数返回true的x值 function f(x) { return (x++ !== x) && (x++ === x); } 采访者补充道:x应该是5个字符的最大值 我找到了7个字符的多个答案: [["2**53-1"],["2*3**33"],["2-5**23"],["5**23-2"],["3**33*2"]] 但是我找不到有5个字符的。(甚至不到6)。我怀疑是否存在一个包含5个字符的解决方案。但经过研究,我发现

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

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

function f(x) {
    return (x++ !== x) && (x++ === x);
}
采访者补充道:x应该是5个字符的最大值

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

[["2**53-1"],["2*3**33"],["2-5**23"],["5**23-2"],["3**33*2"]]
但是我找不到有5个字符的。(甚至不到6)。我怀疑是否存在一个包含5个字符的解决方案。但经过研究,我发现了这个网站:它提供了同样的挑战,结果是有5个字符的解决方案:

[["2**53-1"],["2*3**33"],["2-5**23"],["5**23-2"],["3**33*2"]]


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

使用不同的操作进行彻底的搜索很简单

由于使
f
为真的唯一解决方案是值
=
大于
Number.MAX\u SAFE\u INTEGER
,因此我们立即想到了求幂或科学记数法,以在一个小空间内实现它们


指数 我们使用2个字符,只剩下3个数字:

// 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);

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

@PraveenKumarPurushothaman它之所以有效,是因为它处于Double所具有的整数精度的边缘。在面试中被问到这个问题会告诉我关于招聘公司的一切在面试中使用这种方法的唯一合法途径是看应聘者处理这个问题的方式,而不是看他们是否真的能得到正确的解决方案。了解这种情况会让你成为一名优秀的代码高尔夫球手,但这并不能说明你是否有能力成为一名优秀的开发人员。
1e16+2
将是一个6个字符的解决方案。@fgb那里i对于Linux下的Chrome,没有使用指数运算的解决方案。如果我们有5个字符,那么剩下3个数字需要测试n**m,这很容易测试,也找不到任何东西。也许“很简单”,但它不会导致解决方案,是吗?如果它不是答案,那么也许你应该在顶部添加一句话,明确说明这只是部分/不成功的解决方案尝试。@Andreytukin,如果有,它确实会导致解决方案。对于我的环境,没有任何解决方案;但其他人报告(在他们删除答案之前)至少有一个5字符的解决方案在某个地方有效。因为我们不能期望测试每个平台,所以我提供了一个答案,以不同的方式找到解决方案。
// 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);
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) {};