Diffy 게임 찾기


27

지루하면 재미있는 게임이 Diffy Game 입니다. 그것은 매우 간단하고 많은 시간을 소비 할 수있는 하나의 플레이어 게임입니다.

Diffy 게임은 다음과 같이 작동합니다 : 음이 아닌 정수 목록으로 시작합니다.이 예에서는

3 4 5 8

그런 다음 인접한 숫자 사이의 절대 차이를 취합니다.

 (8)  3   4   5   8
    5   1   1   3

그런 다음 반복하십시오. 루프가 시작될 때까지 반복합니다. 그리고 일반적으로 게임은 처음부터 다시 시작됩니다.

3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0

종종 게임에는 목표가 없습니다. 머릿속에서 산술을함으로써 시간을 입찰하는 것입니다. 그러나이 게임을하는 것을 즐거워 할 때 나의 목표는 항상 마침표를 고르고 특정 마침표가 반복되는 게임을 구성하는 것입니다.

모든 게임이주기적인 것은 아니며, 위의 예제는 예를 들어 모든 0이있는 게임에 도달하여 게임을 시작 위치로 되돌릴 수 없기 때문에 주기적이 아닙니다. 실제로 대다수의 게임은 희귀 한 보석 인 몇 가지 게임을 주기적으로 제작하지 않는 것 같습니다.


특정 기간 동안 반복되는 게임이 주어지면 시퀀스를 두 배로 늘림으로써 동일한 기간으로 반복되는 다른 게임을 만드는 것은 사소한 일입니다. 예를 들어 게임 :

1 0 1

게임과 정확히 동일하게 재생됩니다.

1 0 1 1 0 1

실제로, 우리는 둘 다 실제로 무한 반복되는 게임이라고 생각할 수 있습니다.

... 1 0 1 ...

우리는이 도전을 위해 하나의 게임을 고려할 것입니다.

비슷한 방식으로 전체 시퀀스에 상수를 곱하면 기간도 사소하게 유지되므로 상수 요인에 따라 다른 두 게임을 같은 게임으로 계산합니다.


무한한 문자열 ... 1 0 1 ...이며 ... 0 1 1 ...분명히 한 문자만큼 이동 된 동일한 문자열입니다. 우리는 이것들을 다른 게임으로 계산하지는 않지만, 한 게임이 다른 게임에 도달하면 게임 기간을 결정할 때 사이클의 끝으로 간주되지 않습니다. 예를 들면 다음과 같습니다.

두 게임

... 0 0 0 1 0 1 ...  = A
... 0 0 1 1 1 1 ...  = B
... 0 1 0 0 0 1 ...  = A << 4
... 1 1 0 0 1 1 ...  = B << 4
... 0 1 0 1 0 0 ...  = A << 2
... 1 1 1 1 0 0 ...  = B << 2

... 0 0 1 0 1 0 ...  = A << 1
... 0 1 1 1 1 0 ...  = B << 1
... 1 0 0 0 1 0 ...  = A << 5
... 1 0 0 1 1 1 ...  = B << 5
... 1 0 1 0 0 0 ...  = A << 3
... 1 1 1 0 0 1 ...  = B << 3

기간 (6)와 두 게임 그들은 그들의 루프의 모든 지점에서 서로 어떤 용어를 공유하지 (달리 있습니다 ... 1 1 0 ...... 1 0 1 ...있는 서로에 도달)하지만 그들은 서로의 버전을 이동하기 때문에 그들이 때 계산 같은 게임으로 간주됩니다.


무한 문자열을 반영 (또는 반전)하면 본질적으로 동일한 동작을 제공하지만 반드시 같은 기간을 제공하지는 않습니다. 예를 들어,

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...

그리고 그 반사

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...

캐릭터 사이의 중간 지점에서 차세대가 생산되는 것으로 간주하는 경우 :

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
 ... 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 ...

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
 ... 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 ...

둘 다 3.5 요소만큼 위치가 이동했을 것입니다. 그러나 우리는 차세대가 절반 요소 오프셋으로 생산되는 것을 고려하지 않으므로 하나는 4 요소 시프트로 반올림하고 다른 하나는 3 요소 시프트로 반올림하여주기를 제공합니다. 5 개 중

이러한 이유로 우리는 사이클이 어떤 의미에서 동형 일지라도 비대칭 스트링과 그것의 반사는 뚜렷한 것으로 간주한다. 물론, 동일한 사이클의 일부를 구성하면 하나의 사이클로 만 계산됩니다.


이러한 제한 사항을 통해 약간의 수학을 통해 주어진 유한 기간에 한정된 수의 Diffy주기가 있음을 알 수 있습니다. 또한 유한 기간을 갖는 모든 무한 문자열은 유한 문자열의 무한 반복입니다.

문자열은 마침표보다 크거나 짧을 수 있습니다. 예를 들어, 기간 15의 길이 5의 문자열과 기간 5의 길이 15의 문자열이 있습니다. 기간 19의 모든 문자열 길이는 9709입니다.

태스크

n표준 입력 방법을 통해 n이 1보다 큰 숫자가 주어지면 정확히주기가 다른 고유 한 Diffy주기의 수를 결정합니다 n.

(문헌에서 0종종 주기적 Diffy 게임으로 간주되지 않는 것 같습니다 . 이것은 회색 영역이므로 해결을 요청하지 않을 것입니다 n = 1)

이것은 이므로 소스 코드의 바이트 수를 최소화하는 것이 목표입니다.

테스트 사례

2  ->   0
3  ->   1
4  ->   0
5  ->   1
6  ->   1
7  ->   3
8  ->   0
9  ->   4
10 ->   4
11 ->   3
12 ->   5
13 ->   5
14 ->  24
15 ->  77
16 ->   0
17 -> 259
18 -> 259
19 ->  27
20 -> 272
21 -> 811
22 -> 768
23 ->  91
24 -> 340
25 -> 656

힌트

모든 정기 diffy 게임에는 0과 단일 상수 만 포함됩니다. 즉, 모든 정기 게임은 0과 1로만 구성된 일부 diffy 게임과 동형이됩니다.


좋아, 나는 대화방을 만들었습니다 : chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

인가 010001->111001->000101->100111->010100->011110->010001110110->101101->011011->110110별개?
Mirac7

@ Mirac7 너무 오래되어서 죄송합니다. 그 게임들이 독특하다고 확신합니다
Wheat Wizard

답변:


6

파이썬 2 , 181 바이트

n=input()
m=2**n
a=[m]*m
r=lambda i:[i*-~m>>k&m-1 for k in range(n)]
def s(i):
 if a[i]&m:a[i]=i;a[i]=s(min(r(i^i*2)))
 return a[i]
print sum(min(r(i)[1:])>i==s(i)for i in range(m))

온라인으로 사용해보십시오!

작동 원리

이진 diffy 게임의 각 행을 다음 행으로 변환하는 규칙은 각 열을 다음 열로 변환하는 규칙과 동일합니다. 따라서 모든 정식 길이 n 열의 그래프 내에서 모든 별개의주기를 찾을 수 있습니다. 여기서 열이 모든 회전보다 사전 순으로 작은 경우 열이 "정식"입니다 (이는 n 보다 작은주기를 갖는 열을 자동으로 제외합니다 ).

이진수 0 ≤ i <2 n 으로 표시되는 열의 경우 규칙은 ii XOR 의 가장 작은 회전 ( i ⋅2)으로 보냅니다. (경우 내가 정식, 그 높은 비트는 0이고 우리는 여기에 랩 어라운드에 대해 걱정할 필요가 없습니다.)

따라서 가능한 모든 열 i 를 반복하고 캐논 성을 확인한 다음 이전에 방문한 열을 찾을 때까지 규칙을 반복적으로 적용하여 처음으로 다시 방문한 열을 기억합니다. 각 사이클에서 정확히 하나의 열은 자체적으로 처음 재검토 된 열입니다.


1
이것은 어떻게 작동합니까?
밀 마법사

@WheatWizard 설명을 추가했습니다.
Anders Kaseorg

좋은 작업! 현상금을 얻었습니다. @AndersKaseorg
FantaC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.