하이퍼 큐브 걷기


9

나는 최근 그래프 이론, 특히 하이퍼 큐브 에 대해 읽고 경로를 구성하는 흥미로운 방법에 대해 생각했습니다. 여기에 내가 생각해 낸 것이 있습니다.

당신이 알고있을 때, 당신은 구성된 모든 N-튜플을 복용하는 n 차원 하이퍼 큐브를 구성 할 수 10그들이 한 자리에서 차이가 IFF에, 그것들을 정점으로하고 연결합니다. 이 이진수를 정수로 해석하면 정점 수를 정교하게 그래프로 나타낼 수 있습니다. 예를 들면 다음과 n=3같습니다.

여기에 이미지 설명을 입력하십시오

이 하이퍼 큐브를 걷고 정점에서 시작하고 싶다고 가정 해 봅시다 0. 이제 다음에 방문 할 정점을 어떻게 결정합니까? 내가 생각해 낸 규칙은 a당신이있는 정점 의 수를 취하고 mod(a,n)s 비트를 뒤집고 (0 기반 색인화) 결과 정점으로 이동하는 것입니다. 공식적으로이 규칙은 다음과 같이 재귀 적으로 정의 될 수 있습니다.

a[m+1] = xor(a[m], 2^mod(a[m],n)).

이 규칙을 따르면 항상 큐브에 머물면서 가장자리를 따라 이동합니다. 결과 경로는 다음과 같습니다

여기에 이미지 설명을 입력하십시오

당신이 볼 수 있듯이, 당신은 원 안에 걸어 것입니다! 실제로, 모든 차원과 모든 시작점에서 경로는 루프로 끝납니다. 예를 들어 n=14a[0]=0는 다음과 같습니다

여기에 이미지 설명을 입력하십시오

열렬한 앰 블러에게는 계획된 경로의 길이가 매우 중요한 정보입니다. 따라서 작업은 하이퍼 큐브 차원을 n시작 정점 a[0]을 입력으로 사용하고 결과 루프의 정점 수를 출력 하는 함수 또는 프로그램을 작성하는 것 입니다.

테스트 사례

n   a[0]   Output
-----------------
3   0      6
14  0      50
5   6      8
17  3      346

규칙

  • 표준 허점은 금지되어 있습니다
  • 출력 / 입력은 적절한 형식 일 수 있습니다
  • a[0]유효한 정점 이라고 가정 할 수 있습니다

채점

바이트 단위의 최단 코드가 이깁니다.

이 주제에 대한 추가 정보가 있으면 기쁘겠습니다.


규칙이 주어지면 a[m+1] = xor(a[m], 2^mod(a[m],n))꼭짓점이 하이퍼 큐브에 속하는지 여부는 관련이 없습니다.
Luis Mendo

권리. a[m]하이퍼 큐브에 있었다면 a[m+1]너무 될 것입니다. a[0]유효한 정점 이라고 가정 할 수 있으므로 하이퍼 큐브에 신경 쓸 필요가 없으며 규칙을 따를 필요가 없습니다.
murphy

답변:


4

젤리, 9 바이트

%⁴2*^µÐḶL

두 개의 명령 줄 인수를 사용합니다.

%⁴2*^µÐḶL        A monadic link. Inputs: a_0. b also taken from command line.
%⁴2*^              Variadic link. Input: a
%⁴                   a modulo b. ⁴ is second input, b.
  2*                 Get 2 to that power
    ^                and bitwise xor with a.
     µ             Start a new, monadic link (input: a_0)
      ÐḶ             All elements of the cycle created when the preceding link
                     is applied repeatedly, starting with a_0.
        L            Length.

여기에서 시도 하십시오 .


2

하스켈, 124

import Data.Bits
(y:z:w)%(x:s)|x==y||x==z=[i|(i,r)<-zip[1..]s,r==x]!!0|0<1=w%s
g n=(tail>>=(%)).iterate(\a->xor a$2^mod a n)

이것은 두 포인터가 다른 속도로 돌아가는 속도 알고리즘으로 원을 찾고 Haskell의 목록 접근 방식을 많이 사용 / 구문합니다 (예 : 두 포인터는 실제로 목록입니다).

g답을 계산하는 함수입니다. 그 줄 n다음과 a[0]그리고 당신에 (주 수를 반환 n유형으로 정의해야 Int피하기 형 모호함을).


1

자바 스크립트 (ES6), 69 바이트

(n,a)=>{g=m=>m^1<<m%n;for(c=1,b=a;(b=g(g(b)))!=(a=g(a));)c++;return c}

(23, 10)에 대해 18812를 반환합니다.


1

MATL , 38 37 28 바이트

xi`vt0)2y1G\^Z~yywP=fn~]2M1$

이 언어의 현재 버전 (15.0.0) 에서 작동 합니다.

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

설명

x       % take first input: n. Delete (gets copied into clipboard G)
i       % take second input: initial value of a
`       % do...while loop
  v     %   concatenate all stack contents vertically
  t0)   %   duplicate. Get last element of that array: current a
  2     %   push 2
  y     %   duplicate second-top element in stack: current a
  1G    %   push first input (n)
  \     %   a modulo n
  ^     %   2 raised to that
  Z~    %   xor of that with current a
  yy    %   duplicate top two elements in stack: array of old a's and new a
  w     %   swap: move array of old a's to top
  P     %   reverse that array. So first entry is most recent a (before current)
  =f    %   indices of old values that equal current value. There may be 0 or 1
  n~    %   is it empty?
]       % if so, continue with a new iteration
2M      % push array of indices. It contains exactly 1 index
1$      % set 1 input for implicit display function, so it only displays the index

@lirtosiast True! 감사. 편집
Luis Mendo

1

Pyth, 22 17 바이트

Lx^2%bQbl.uyNuyGE

설명:

Lx^2%bQbl.uyNuyGE     Implicit: Q=first line n. E=second line a[0].
Lx^2%bQb              y = lambda b: do one iteration
                      Then
             uyGE     Apply y until a previous result is found.
                      This makes sure we're in the cycle.
         .uyN         Then apply y again until a previous result is found.
                      Keep all intermediate values but not the repeat.
        l             Get the length; i.e. the length of the cycle.

여기에서 시도 하십시오 .

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