用Python创建巧合

2021-02-27 23:05:55

我们一直在尝试将员工分成几组(大小为4),并在他们之间建立视频环聊。我们这样做是为了取代有时在咖啡机周围,午餐时段或等待打印机时发生的偶然会议。而且,我们只希望人们彼此了解。

这导致我写了一些代码。其核心是将n个元素分成至少大小为g的组,以最小化每个组的大小。因此,假设一个办公室有15名员工,那么它将分为大小5、5、5的三组;如果办公室有16名员工,则为4、4、4、4;如果它有17名员工,则为4,4,4,5,依此类推。

组= [g] *(n // g),范围为e(0,n%g):组[e len(组)] + = 1

第一行创建大小为g的n // g(//是整数除法)条目(例如,如果g == 4且n == 17,则组== [4,4,4,4])。 for循环处理剩余的'不会完全分为大小为g的组的部分。如果g == 4且n == 17,那么将剩下一个元素添加到现有的[4、4、4、4、4]组之一中,从而得到[5、4、4、4]。

之所以需要e%len(groups),是因为在分成相等大小的组之后,剩下的元素可能比组中的条目还多。例如,如果g == 4且n == 11,则组最初设置为[4,4],其中三个剩余元素必须仅分布到组中的两个条目中。

因此,该代码有效,这是n的各种大小(和g == 4)的输出:

4 [4] 5 [5] 6 [6] 7 [7] 8 [4,4] 9 [5,4] 10 [5,5] 11 [6,5] 12 [4,4,4] 13 [ 5,4,4] 14 [5,5,4] 15 [5,5,5] 16 [4,4,4,4] 17 [5,4,4,4]

但是代码使我很恼火,因为我觉得必须有一个简单的公式来计算每个组中应该包含多少个元素。在解决了这个问题之后,我决定做一些通常有帮助的事情……使问题变得简单而幼稚,或者至少使解决方案变得简单而幼稚,所以我编写了这段代码:

这是一个非常简单的实现。我不喜欢它,因为它可以循环n次,但可以帮助可视化某些东西。假设g == 4和n == 17。像这样的组中的每个条目(每个正方形都是组中的一个条目,正方形中的数字是该值通过循环递增的i的值)。

因此,组最终为[5、4、4、4]。这有助于看到组[i]增加的次数取决于for循环'循环'的次数。在第ith个元素上。这很容易计算而不会循环。

对我来说,这更令人满意。 n // g是组的大小,它使循环一次更新组中的每个条目。每个条目设置为1 + max(0,n-(i + 1))//(n // g)。您可以这样认为:1. 1是要放入组中每个条目的第一个元素。 2. max(0,n-(i + 1))是在组中每​​个元素中放置1到位置i时剩余的元素数。用n // g除以计算出共享元素的过程(请参阅上面的朴素循环)将循环多少次。

如果#2不清楚,请考虑上图,并假设我们正在计算groups [0](n == 17和g == 4)。我们将1分组[0],剩下16个元素可以共享。如果您天真地将它们共享出去,则需要循环四次,因此需要将16/4个元素添加到groups [0]中,使其成为5。移至groups [1]并在其中放置一个1。现在共有15个元素可供共享,即15/4(整数除法中为3),因此您将4个元素分组[1]。等等...

该解决方案使我最满意。简洁地创建一组。当然,我可能已经考虑过了……其他人可能认为其他解决方案更清晰或更可维护。

Python