首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >约瑟夫斯问题(计数)

约瑟夫斯问题(计数)
EN

Code Golf用户
提问于 2012-05-20 07:19:19
回答 26查看 3.4K关注 0票数 30

挑战

编写一个函数,该函数以两个正整数nk作为参数,并在计算出每个k-th person后,返回在n之外的最后一个人的数目。

这是一个代码-高尔夫挑战,所以最短的代码获胜。

问题

n人员(从1n编号)站成一个圆圈,每个k-th都被计算出来,直到剩下一个人为止(参见相应的维基百科文章)。确定最后一个人的人数。

对于k=3,两人将被跳过,第三人将被计算在内。也就是说,对于n=7,数字将按顺序3 \, 6 \, 2 \, 7 \, 5 \, 1 (详细的\require{cancel}1 \, 2 \, \cancel{3} \, 4 \, 5 \, \cancel{6} \, 7 \, 1 \, \cancel{2} \, 4 \, 5 \, \cancel{7} \, 1 \, 4 \, \cancel{5} \, 1 \, 4 \, \cancel{1} \, 4)计算出来,因此答案是4

示例

代码语言:javascript
复制
J(7,1) = 7      // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7      // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4      // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
EN

回答 26

Code Golf用户

回答已采纳

发布于 2012-06-02 18:41:15

GolfScript,17字节

代码语言:javascript
复制
{{@+\)%}+\,*)}:f;

接受堆栈上的n k,并将结果留在堆栈上。

解剖

这使用递归g(n,k) = (g(n-1,k) + k) % ng(1, k) = 0 (如维基百科文章中所描述的),递归被折叠代替。

代码语言:javascript
复制
{          # Function declaration
           # Stack: n k
  {        # Stack: g(i-1,k) i-1 k
    @+\)%  # Stack: g(i,k)
  }+       # Add, giving stack: n {k block}
  \,*      # Fold {k block} over [0 1 ... n-1]
  )        # Increment to move from 0-based to 1-based indexing
}:f;
票数 5
EN

Code Golf用户

发布于 2012-05-20 21:46:32

明斯基寄存器机(25个非停止状态)

从技术上讲,它不是一个函数,但它是在一个没有功能的计算范例中.

这与我的第一个MRM解释挑战的主要测试用例略有不同:

在寄存器nk中输入;在寄存器r中输出;在输入时假定为r=i=t=0。前两个停止指令是错误情况。

票数 14
EN

Code Golf用户

发布于 2012-05-20 08:51:48

Python,36

我还使用了维基百科的公式:

代码语言:javascript
复制
J=lambda n,k:n<2or(J(n-1,k)+k-1)%n+1

示例:

代码语言:javascript
复制
>>> J(7,3)
4
>>> J(77,8)
1
>>> J(123,12)
21
票数 7
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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