首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AoCG2021日10:内存重新分配例程

AoCG2021日10:内存重新分配例程
EN

Code Golf用户
提问于 2021-12-10 00:00:28
回答 13查看 1K关注 0票数 12

Code 2021的出现事件的一部分。有关详细信息,请参阅链接的元帖子。

天2017第6天有关。

这里有一个调试器程序有一个问题:它试图修复一个内存重新分配例程,但是它一直被困在一个无限循环中。

在这方面,有n内存库;每个内存库可以容纳任意数量的块。重新分配例程的目标是平衡内存组之间的块。

重新分配例程在循环中运行。在每一个周期中,它都会找到拥有最多块的内存库(由编号最低的内存库赢得的领带),并将这些块重新分配到银行中。为此,它从选定的银行中移除所有块,然后移动到下一个(按索引)内存库,并插入其中一个块。它继续这样做,直到块用完为止;如果它到达最后一个内存库,它将被包装到第一个内存库。

例如,如果最初有四个具有[0, 2, 7, 0]内存块的银行:

  • 第三个银行被释放,从下一个(第四个)银行开始,这7个块被周期性地分布在内存库上。经过一个周期后,结果看起来像[2, 4, 1, 2]:0 2 0 0 +1 +1 +1 +1 +1
  • 在下一个周期中,第二个银行被释放并重新分发,从而产生[3, 1, 2, 3]
  • 在下一个周期中,第一家银行被释放(当有联系时,第一家银行被选中),给出[0, 2, 3, 4]
  • 下一个循环给出[1, 3, 4, 1],然后是[2, 4, 1, 2],其中序列形成一个循环。

您的工作是模拟内存重新分配的一个周期。

适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。

测试用例

代码语言:javascript
复制
[0, 2, 7, 0] -> [2, 4, 1, 2] -> [3, 1, 2, 3] -> [0, 2, 3, 4]
-> [1, 3, 4, 1] -> [2, 4, 1, 2]
[3, 1, 4, 1, 5, 9, 2] -> [5, 2, 5, 2, 6, 1, 4]
-> [6, 3, 6, 3, 0, 2, 5] -> [0, 4, 7, 4, 1, 3, 6]
-> [1, 5, 1, 5, 2, 4, 7] -> [2, 6, 2, 6, 3, 5, 1]
-> [3, 0, 3, 7, 4, 6, 2] -> [4, 1, 4, 1, 5, 7, 3]
-> [5, 2, 5, 2, 6, 1, 4]
EN

回答 13

Code Golf用户

发布于 2021-12-10 08:50:21

BQN,33 字节数

代码语言:javascript
复制
{+˝↑‿(≠)⥊∾(⥊⟜0∾(-∾⥊⟜1)∘⊑⟜)⊑⍒}

在网上试试!

代码语言:javascript
复制
{+˝↑‿(≠)⥊∾(⥊⟜0∾(-∾⥊⟜1)∘⊑⟜)⊑⍒} # Example input:  = 0 2 7 0
                                ⊑⍒  # The first index of the maximum value  2
                           ⊑⟜      # The value at that index               7
                    -∾⥊⟜1           # negative value, value many 1's
                                     # ¯7 1 1 1 1 1 1 1
             ⥊⟜0∾                   # Prepend index many 0's
                                     # 0 0 ¯7 1 1 1 1 1 1 1
          ∾                         # 0 2 7 0 0 0 ¯7 1 1 1 1 1 1 1
   ↑‿(≠)⥊                           # Reshape into a matrix with length() columns, padding the last row with 0's
 +˝                                  # sum the columns
票数 6
EN

Code Golf用户

发布于 2021-12-10 04:12:17

J,37字节

代码语言:javascript
复制
(0:`]`[}+/@,-@#@[]\0,0 1#~],{~)]i.>./

在网上试试!

考虑输入0 2 7 0

  • (...)]i.>./整动词是一个钩子,它将原来的输入作为左arg,最大值的索引i.>/.作为右。其计算值为:0 2 7 0(.)2 NB。2是7的指数。
  • (0 1#~],{~)将最大索引追加到最大],{~,并多次复制0 1元素:0 0 1 1 1
  • 0,准备另一个0: 0 0 1 1 1
  • -@#@[]\将其折叠为原始输入大小的块,用0: 0 0 0 1 1 1 0 0填充最后一行的空槽。
  • 对原始列表进行0:`]`[}...,准备,最大值为零:0 2 0 0 0 1 1 1 0 0
  • +/@和行之和:2 4 1 2
票数 5
EN

Code Golf用户

发布于 2021-12-10 07:12:15

R,84字节

代码语言:javascript
复制
function(a){v=a[i<-which.max(a)]+1;a[i]=0;while(v<-v-1)a[i]=a[i<-i%%sum(a|1)+1]+1;a}

在网上试试!

注意,在a[i]=a[i<-i%%sum(a|1)+1]+1中,首先在RHS上更新i,然后在LHS和RHS上使用相同的索引执行替换。

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/238301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档