我有一个表达方式,可以用以下两种之一来表达:
a += (A ? B ? x : C ? y : D : D);
a += (A && B ? x : A && C ? y : D);其中A,B,C分别是5-10字节的表达式,x和y是单个字符文本(3-4字节)。D是另一条三元链(不存在分支问题)。
我被困在试图消除D或A的复制上,如果我使用的是if,应该是这样的:
if (A)
if (B)
x
else if (C)
y
else D显然,我可以做((z=A) && B ? x : z && C ? y : D),...but,还有其他更有创意的建议吗?
实际代码看起来类似于:
if (r%4<2&&r>3&&c<22&&c>1)
if ((i-r)%8==6)
'\\'
else if ((i+r)%8==1)
'/'
elseD类似于:
(i+r) % 8 == 3 ? '/' :
(c-r+16) % 8 == 4 ? '\\' : 发布于 2017-06-12 15:10:28
如果您知道x和y不能包含虚假价值,如代码示例所示,可以执行以下操作以消除对A或D的重复计算:
a += A && (B && x || C && y) || D;以下代码片段中的演示代码和测试用例:
// return x
test(1,1,0); // A and B
test(1,1,1); // A and B (and C)
// return y
test(1,0,1); // A and C
// return D
test(0,0,0); //
test(0,0,1); // C
test(0,1,0); // B
test(0,1,1); // B and C
test(1,0,0); // A
function test(A, B, C) {
var x = 'x', y = 'y', D = 'D';
a = A && (B && x || C && y) || D;
expected = (A && B ? x : A && C ? y : D);
var ws = ' ';
console.log(
[
A && 'A' || ws,
B && 'B' || ws,
C && 'C' || ws
].join(ws),
' ==> a = ' + a,
a === expected ?
'Passed' :
'Failed, expected ' + expected
);
}否则,如果可能出现错误的值,您可以这样做:
a += [D, x, y][A && (B && 1 || C && 2) || 0];以下代码片段中的演示代码和测试用例:
// return x
test(1,1,0); // A and B
test(1,1,1); // A and B (and C)
// return y
test(1,0,1); // A and C
// return D
test(0,0,0); //
test(0,0,1); // C
test(0,1,0); // B
test(0,1,1); // B and C
test(1,0,0); // A
function test(A, B, C) {
var x = false, y = 0, D = '';
A = !!A; B = !!B; C = !!C;
a = [D, x, y][A && (B && 1 || C && 2) || 0];
expected = (A && B ? x : A && C ? y : D);
var ws = ' ';
console.log(
[
A && 'A' || ws,
B && 'B' || ws,
C && 'C' || ws
].join(ws),
' ==> a = ' + xyD(a, x, y, D),
a === expected ?
'Passed' :
'Failed, expected ' + xyD(expected, x, y, D)
);
}
function xyD(result, x, y, D) {
return result === x ? 'x' :
result === y ? 'y' :
result === D ? 'D' : '<error>' ;
}发布于 2017-05-18 04:22:38
由于这里不需要短路,您也可以这样做:
d=D;a+=A?B?x:C?y:d:d;如果需要短路,因为您的B和C是真实值,您可以这样做:
a+=(A?B?x:C?y:0:0)||D;如果需要短路,并且您的B和C不是真实值:
d=_=>D;a+=A?B?x:C?y:d():d();https://codegolf.stackexchange.com/questions/121306
复制相似问题