这里有一个来自编程实践的挑战:
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
函数不能泄漏全局范围,必须返回一个列表或一个数组。
如果您的语言无法返回数组,则只允许它打印列表。
最短答案(以字节为单位)获胜。
发布于 2014-08-02 18:38:30
多亏了bitpwner,我们有了这样的解决方案:
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个字节的成本。
这是我的第一个想法,但我认为这是一个很好但并不完美的解决方案:
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())追加到执行列表中。
发布于 2014-08-03 15:17:42
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;endhttps://codegolf.stackexchange.com/questions/35629
复制相似问题