如何简化检查一对数字是(1,2)还是(2,1)?

Posted

技术标签:

【中文标题】如何简化检查一对数字是(1,2)还是(2,1)?【英文标题】:How to simplify checking if a pair of numbers is (1,2) or (2,1)? 【发布时间】:2021-03-18 09:50:49 【问题描述】:

我需要确保一对数字是 (1, 2) 或 (2, 1)。 x 和 y 始终为正。我现在使用的代码:

if ((x == 2 && y == 1) ||
    (x == 1 && y == 2)) 
    return 1;

看起来有点笨重,感觉可以简化一下。然而,我尝试的一切都导致了误报。

【问题讨论】:

您可以将它们相乘,结果是 2 还是不是 2。这会以牺牲其他一切为代价将源代码大小减少几个字符。只需使用易于理解、易于调试的即可。 @MartinJames 公平地说,我认为 OP 要求的是更简单的代码,而不是代码打高尔夫球的解决方案。此外,-1-2 的解决方案将失败。 @cigien umm...'x 和 y 都是正数' @MartinJames 哦,好点,我错过了:p 你可以写一个解决方案,虽然它可能不那么容易阅读。 @cigien '你可以写一个解决方案' 不,谢谢 - 如果你愿意,请随时发布:) 我更看重清晰,易于调试,而不是“聪明”的技巧:) 【参考方案1】:

这是进行这种比较的最直接的方法。

它也比您想出的任何替代方案都更具可读性,因此无需更改。

【讨论】:

我对这个答案投了反对票,因为它在没有任何证据的情况下提出了强有力的主张。无法想象一个更简单或更易读的解决方案并不是真正的答案。【参考方案2】:

这是我认为更具可读性的一种编写方式:

if (std::setx,y == std::set1,2)

    return 1;

请注意,这不如您问题中的版本有效。例如,不要在您将作为库发布的代码中编写此代码。但是,当性能不是问题时,在您自己的程序中编写是完全合理的。

这是demo。

【讨论】:

这是一段非常昂贵的代码。这个答案真的应该被贴上“开玩笑”的标签。 @PeteBecker 这很昂贵,但 OP 并未表示性能是他们关心的问题。而且我根本不是在开玩笑,我确实认为这是可读的代码,它更清楚地表达了“检查两件事是否是 1 和 2”的意图。我已经编辑了答案以澄清。 @cigien — 说话像一个真正的 Python 程序员【参考方案3】:

我能看到你简化它的唯一方法是有一个结构来代表你 xy,如果这是某种坐标,你可以使用类似 vector2dstd::pair<int, int> 的东西

那么你可以这样做:

    std::pair<int, int> valuePair = std::make_pair(x, y);
    if (valuePair == std::make_pair(1, 2) || valuePair == std::make_pair(2, 1))
    
        return 1;
    

【讨论】:

可能在 Python ((x, y) in (1, 2), (2, 1)) 等语言中有所改进,但在 C++ 中,这太冗长了,没有什么好处。 我认为这取决于,作为一名游戏程序员,我更喜欢将vector 作为一个整体结构进行比较,而不是对每个组件进行比较。当然,在这种情况下,我不会使用std::pair,而是使用vector2d 作为另一个游戏程序员,我更喜欢它所写的,因为我们没有得到其他上下文。如果它已经是向量或其他类型,那么比较这种方式就可以了,但如果不是,我认为没有必要将它强制转换为它不是的东西。您的示例也不完整,因为它实际上并未将值放入 valuePair 我会注意到我没有投反对票。我只是就你为什么会这样发表意见。但是,如果你已经有预定义的对,直接比较它们比“解构”它们并比较它们更干净。不过,我不确定如果你从碎片开始会更干净。 @Carcigenicate 是的,同意,这取决于上下文。 :) 这就是我放的原因,If this is some kind of coordinate【参考方案4】:

值可以为 0 吗?有人说 0 不是正数或负数。

如果 X 和 Y 都 > 0,那么如何:

if( 3 == (x + y) )  return 1; 

【讨论】:

【参考方案5】:

你可以(ab)使用std::minmax

if (std::minmax(x, y) == std::pair<const int&, const int&>1, 2)

    return 1;

if (std::minmax(x, y) == std::minmax(1, 2))

    return 1;

或 (C++17)

if (auto [a, b] = std::minmax(x, y); a == 1 && b == 2)

    return 1;

【讨论】:

这在各个方面都不太可读。我看不出任何优势。 @CodyGray:我期待std::minmax(x, y) == 1, 2,但类型不匹配。

以上是关于如何简化检查一对数字是(1,2)还是(2,1)?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是文本还是科学数字?

数字电路与系统-逻辑运算与简化(常用三个公式)

如何检查字符是字母还是数字?

如何检查字母是字母还是数字?

如何简化这个 python 迭代?

如何检查数字是 3 的倍数还是包含数字 5?