【问题标题】:Listing permutations of two dice with one loop用一个循环列出两个骰子的排列
【发布时间】:2021-12-14 02:40:18
【问题描述】:

作为我自己的编码挑战的一部分,我一直在尝试用一行代码来解决简单问题。目前,我正在尝试打印出两个骰子的所有可能排列。到目前为止,我有一个使用两个 for 循环的简单算法:

for(int i = 1; i <= 6; i++)
    for(int j = i; j <= 6; j++)
        printf("%d %d", i, j);

这很容易变成一行:

for(int i = 1; i <= 6; i++) for(int j = i; j <= 6; j++) printf("%d %d", i, j);

两个程序都以所需的顺序输出排列:

1 1
1 2
1 3
1 4
1 5
1 6
2 2
2 3
2 4
2 5
2 6
3 3
3 4
3 5
3 6
4 4
4 5
4 6
5 5
5 6
6 6

为了使这一挑战变得更加困难,我试图以与上述输出相同的顺序打印出排列,只使用一个循环。我确定我需要使用除法和模数来实现这一点,但我被卡住了,不确定如何实现这一点。

【问题讨论】:

  • 注意:您似乎选择的路径是黑暗面。人们应该努力编写易于阅读、理解和维护的代码,而不是局促和神秘的代码。仅在必须满足性能要求时才使代码复杂化。
  • 仅供参考,空格是给人类的。编译器不需要空格(一些符号分隔规则除外)。必读:International Obfuscated C Code Contest。消除空白没有任何好处,速度或空间。就编译器而言,它仍然是相同的代码。
  • 这个怎么样:for(int i = 0; i &lt; 36; i++) printf("%d %d\n", (i/6)+1, (i%6)+1 ); 它使用除法和模数,就像你期望的那样。

标签: c++ algorithm


【解决方案1】:

2 循环版本是最易读的。但既然你问了,这里有一些 1 循环版本:

int main()
{
    int n = 6;
    for (int i = 1, j = 1; i < n; ++j) 
    {
        if (j > n)
        {
            ++i;
            j = i;
        }
        std::cout << i << " " << j << '\n';
    }

    std::cout << std::flush;
}
int main()
{
    int n = 6;
    int i = 1;
    int j = 1;
    while (true)
    {
        if (j > n)
        {
            ++i;
            j = i;
        }
        if (i > n)
        {
            break;
        }
        std::cout << i << " " << j << '\n';
        ++j;
    }
    std::cout << std::flush;
}

附注:

for(int i = 1; i <= 6; i++) for(int j = i; j <= 6; j++) printf("%d %d", i, j);

这太可怕了。永远不要写这样的代码。在一行中编写代码的人为目标是完全毫无意义的。您可以毫不费力地将任何代码放在这样的一行上,因此它绝对没有任何好处,教学或其他方面。

存在编写单行代码的概念,但这不仅仅是用空格替换源代码中的新行。这是关于例如用函数调用或链调用替换循环。

不要忘记,首先要编写正确、干净和可读的代码。

【讨论】:

  • 这列出了两个骰子的组合,我正在尝试列出排列。
  • @PolarisEmperor 对,已编辑。
  • 感谢您的解决方案和提示,我在编写代码时一定会优先考虑可读性!
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多