스위칭 시퀀스


11

소개

스위칭 순서는 다음과 같이 정의됩니다.

n원 안에 서있는 사람들로 시작하십시오 ( 6이 예에서는).

 1  2
6    3
 5  4

person 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스위칭 순서 일 수하는) 주어진 n바이트의 최소 금액을 사용하여,.

입력 및 출력 예 :

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

양의 정수를 얻을 수 있습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

참고 : 검색 문제를 해결하기 위해 OEIS 시퀀스 (무엇입니까?)가 없습니다.


7
사람들에게 검색을 저장하기 위해 oeis에 대한 조회수가 없습니다.
xnor

분명히 2남아 있지 7않습니까?
Jonathan Allan

1
@JonathanAllan 방금 처음 1000 개의 용어를 확인했으며 결과는 현재 "아니오"입니다. 잘 모르겠습니다. 사람들이 증명할 수있는 "사이드 챌린지"라고해야합니까? 그것은 브라우니 포인트를위한 것이므로 도전에서 벗어나지 않습니다.
clismique

누군가 귀하의 지시를 따르지 않고 다른 방법을 생각해 내면 분명해질 것입니다 ...
Jonathan Allan

3
OEIS없이이 문제를 해결하는 사람들을 어떻게 기대하십니까? 누군가 OEIS를 밀어주십시오.
Outgolfer Erik

답변:


4

파이썬 2, 183 94 바이트

Artyer 덕분에 -4 바이트 ( input()print대신 사용 defreturn)
FlipTack 덕분에 -1 바이트 ( 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"포인터"색인이 이미 목록의 오른쪽 (또는 원래 용어의 왼쪽)으로 1 단계가되게하는 목록에서 다음으로 선택된 개인이 발견되는 단계의 논리를 변경합니다 .

언 골프 드 :

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

왜 그래?
Jonathan Allan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.