我的一个朋友在面试时遇到了这个问题。
查找使此函数返回为true的x值。
function f(x) {
return (x++ !== x) && (x++ === x);
}采访者补充道:X应该是5 字符 max
我找到了7个字符的多个答案:
[["2**53-1"],["2*3**33"],["2-5**23"],["5**23-2"],["3**33*2"]]但我找不到一个有五个字的。(甚至不包括6)。我怀疑是否有一个有5个字符的解决方案。但经过研究,我发现了一个网站:https://alf.nu/ReturnTrue,它提供了同样的挑战,并且发现有一个(或多个)有5个字符的解决方案:

有人能帮忙知道这是什么吗?
发布于 2018-10-12 15:01:23
使用不同的操作对解决方案进行彻底搜索是很简单的。
由于使f成为现实的唯一解决方案是值>=而不是Number.MAX_SAFE_INTEGER,因此我们立即想到在一个小空间内实现它们的指数化或科学表示法。
指数法
我们使用两个字符,只有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);由于只剩下3位数字,所以我们不能在这里使用加法/减法来偏移(它至少需要2个字符)。
科学符号
我们使用一个字符,因此留下了4个潜在的数字:
// 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));但是,在这种情况下,我们可以进行加/减:
// 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的可能性,它只需要几百万测试(在现代计算机中应该只需要一分钟左右):
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这样的字符串,这将使您进入一个无限循环!
https://stackoverflow.com/questions/52778747
复制相似问题