首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程Praxis -像Flavius Josephus一样生存

编程Praxis -像Flavius Josephus一样生存
EN

Code Golf用户
提问于 2014-08-02 17:18:03
回答 2查看 1.2K关注 0票数 5

这里有一个来自编程实践的挑战:

http://programmingpraxis.com/2009/02/19/flavius-josephus/

编写一个函数josephus(n,m),返回n个人的列表,编号从0到n-1,按执行顺序排列,每个mth人依次返回,列表中的最后一个人是唯一的幸存者。

示例输出:

约瑟夫斯(41,3)2 5 8 11 14 17 20 26 29 32 38 0 4 9 13 18 22 27 36 36 6 12 25 33 39 7 16 28 37 10 24 21 3 34 15 30

函数不能泄漏全局范围,必须返回一个列表或一个数组。

如果您的语言无法返回数组,则只允许它打印列表。

最短答案(以字节为单位)获胜。

EN

回答 2

Code Golf用户

发布于 2014-08-02 18:38:30

Python2 (85字节):

多亏了bitpwner,我们有了这样的解决方案:

代码语言:javascript
复制
def j(m,n):
    a,b,c=range(m),0,[]
    while a:b=(b+n-1)%len(a);c+=[a.pop(b)]
    return c

要在Python3中使用它,您必须将a转换为一个列表,这需要另外6个字节的成本。

Python 3(114个字节):

这是我的第一个想法,但我认为这是一个很好但并不完美的解决方案:

代码语言:javascript
复制
def j(m,n):
    a,b=__import__("collections").deque(range(m)),[]
    while a:a.rotate(-n);b.append(a.pop())
    return b

我对使用这种方法并不满意,但我想不出任何其他的解决办法。至少我可以用__import__保存5个字节。

此函数的工作方式如下所述,a是人员,b是执行顺序。只要还剩下人员(while a:),它就通过n旋转deque/ people,并将当前man (a.pop())追加到执行列表中。

票数 3
EN

Code Golf用户

发布于 2014-08-03 15:17:42

Matlab (90)

代码语言:javascript
复制
function l=j(n,m)
a=0:n-1;l=[];j=m;for i=a;l=[l,a(j)];a(j)=[];j=mod(j+m-2,length(a))+1;end
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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