切换顺序


11

介绍

切换顺序的定义如下:

首先,n人们围成一圈站着(6在本例中)。

 1  2
6    3
 5  4

从人员开始1,将删除“选定”人员左侧的人员。

 1
6    3
 5  4

被删除的人可以“切换”删除方法:

  • 如果被删除的人是偶数(在这种情况下就是这种情况),那么下一个被删除的人将在下一个“被选中”人的右边。
  • 如果被删除的人是奇数,则下一个被删除的人将在下一个“已选择”人的左侧。

下一个选择的人也取决于先前删除的人。

  • 如果被删除的人是偶数,则下一个选择的人将在前一个选择的人的右边。
  • 如果被撤消的人是奇数,请参见上文,但将“正确”替换为“左侧”。

因此,下一个选择的人是6

现在我们删除的人的权利6,这就是5

 1
6    3
    4

因为5是奇数,所以被移走的人现在在左边。新选择的人是1

现在,我们删除3

 1
6
    4

我们继续此过程,直到剩下1个数字-在此示例中,最终数字为1。因此S(6) = 1

前几个数字是:

 n | S(n)
---------
 1 | 1
 2 | 1
 3 | 3
 4 | 1
 5 | 5
 6 | 1
 7 | 3
 8 | 6
 9 | 5
10 | 6
11 | 9

任务

您的任务是制作一个程序(或函数),该程序在给定的情况下使用最少的字节数返回S(n)n切换序列中的th个数字)n

输入和输出示例:

1  -> 1
10 -> 6
13 -> 13

您一定会得到一个正整数。

这是,因此以字节为单位的最短代码胜出!

注意:没有OEIS序列(什么?),以免您查找麻烦。


7
没有oeis上的命中,以节省人们的搜索。
xnor

显然2永远不会消失,但是7呢?
乔纳森·艾伦

1
@JonathanAllan我刚刚检查了前1000个字词,结果目前为“否”。不过,我不确定-我应该将其视为人们可以尝试证明的“附带挑战”之类的东西吗?这是布朗尼积分,因此不会减损挑战。
clismique

也许一旦有人想出了一种其他方法,而不是按照您的指示进行操作,这将很明显……
Jonathan Allan

3
您如何期望人们在没有OEIS的情况下解决此问题?有人推OEIS,好吗?
暴民埃里克(Erik the Outgolfer)

Answers:


4

Python 2,183 94字节

-4字节由于Artyer(使用input()print,而不是defreturn
-1字节由于FlipTack(使用print-~p[0]而非print p[0]+1

p=range(input())
d=i=1
while p[1:]:m=p.pop(i)%2;i-=m+m-(d<0);d=-m|1;i+=d;i%=len(p)
print-~p[0]

代表

这只是按照给出的说明进行,我注意到了一些模式,也许可以利用它?

唯一的变化是:

  • 使用0基于索引的索引(因此即使偶数都是奇数,反之亦然)-这在高尔夫球逻辑中节省了5个字节,最后用+1
  • 在使用1左和-1作为权(使用范围-就像每个人都朝外代替)
  • 更改步骤的逻辑,在该步骤中找到下一个选定的个人以pop从列表中进行会计处理,从而使“指针”索引已在列表中右移(或在原始术语中移至左)。

取消高尔夫:

def circle(n):
    people = range(n) # p
    direction = 1 # d
    removeIndex = 1 # i
    while n > 1:
        removingMod2 = people.pop(removeIndex) % 2 # m
        removeIndex -= removingMod2 + removingMod2 - (direction == -1)
        direction = -removingMod2 or 1
        removeIndex += direction
        n -= 1
        removeIndex %= n
    return people[0] + 1

最后一行可以print-~p[0]吗?
FlipTack

为什么可以呢!
乔纳森·艾伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.