Đi bộ trên Hypercube


9

Gần đây tôi đã đọc về lý thuyết đồ thị, đặc biệt là hypercubes và nghĩ về những cách thú vị để xây dựng đường dẫn trên chúng. Đây là những gì tôi nghĩ ra.

Như bạn có thể biết, bạn có thể xây dựng một hypercube n chiều bằng cách lấy tất cả các n-tup bao gồm 10làm các đỉnh và kết nối chúng, nếu chúng khác nhau trong một chữ số. Nếu bạn diễn giải các chữ số nhị phân này dưới dạng một số nguyên, bạn sẽ kết thúc bằng một biểu đồ với các đỉnh được đánh số độc đáo. Ví dụ cho n=3:

nhập mô tả hình ảnh ở đây

Giả sử bạn muốn đi bộ trên hypercube này và bắt đầu từ đỉnh 0. Bây giờ, làm thế nào để bạn xác định đỉnh nào bạn muốn ghé thăm tiếp theo? Quy tắc tôi đã đưa ra là lấy số ađỉnh bạn đang bật, lật mod(a,n)bit của nó (lập chỉ mục dựa trên số không) và đi đến đỉnh kết quả. Chính thức quy tắc này có thể được định nghĩa đệ quy là

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

Theo quy tắc này, bạn sẽ luôn ở trên khối lập phương và đi dọc theo các cạnh. Đường dẫn kết quả trông như thế này

nhập mô tả hình ảnh ở đây

Như bạn thấy, bạn sẽ đi theo vòng tròn! Trong thực tế, trong tất cả các chiều và cho tất cả các điểm bắt đầu, đường dẫn của bạn sẽ kết thúc trong một vòng lặp. Ví dụ cho n=14a[0]=0nó trông như thế này

nhập mô tả hình ảnh ở đây

Đối với những người đam mê cuồng nhiệt, chiều dài của tuyến đường theo kế hoạch của anh ta là một thông tin khá quan trọng. Vì vậy, công việc của bạn là viết một hàm hoặc một chương trình lấy kích thước hypercube nmột đỉnh bắt đầu a[0]làm đầu vào và xuất số lượng đỉnh trong vòng lặp kết quả.

Các trường hợp thử nghiệm

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

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm
  • Đầu ra / Đầu vào có thể ở bất kỳ định dạng phù hợp
  • Bạn có thể giả sử a[0]là một đỉnh hợp lệ

Chấm điểm

Mã ngắn nhất trong byte thắng.

Nếu bạn có bất kỳ thông tin bổ sung nào về chủ đề này, tôi rất vui được nghe!


Theo quy tắc a[m+1] = xor(a[m], 2^mod(a[m],n)), sẽ không liên quan nếu các đỉnh thuộc về một hypercube, phải không?
Luis Mendo

Đúng. Nếu a[m]là trên hypercube, a[m+1]cũng sẽ như vậy. Và vì bạn có thể giả sử a[0]là một đỉnh hợp lệ, bạn không cần phải quan tâm đến bất kỳ công cụ hypercube nào và chỉ cần tuân theo quy tắc.
murumb

Câu trả lời:


4

Thạch, 9 byte

%⁴2*^µÐḶL

Có hai đối số dòng lệnh.

%⁴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.

Hãy thử nó ở đây .


2

Haskell, 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)

Điều này tìm thấy vòng tròn bằng thuật toán hai con trỏ có tốc độ khác nhau và sử dụng / lạm dụng rất nhiều cách tiếp cận của Haskell đối với các danh sách (ví dụ: hai con trỏ thực sự là danh sách).

glà hàm tính toán câu trả lời. đưa nó nvà sau đó a[0]và nó sẽ trả về số cho bạn (lưu ý rằng nnên được xác định là loại Intđể tránh sự mơ hồ kiểu).


1

JavaScript (ES6), 69 byte

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

Trả về 18812 cho (23, 10).


1

MATL , 38 37 28 byte

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

Điều này hoạt động trong phiên bản hiện tại (15.0.0) của ngôn ngữ.

Hãy thử trực tuyến !

Giải trình

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 Đúng! Cảm ơn. Đã chỉnh sửa
Luis Mendo

1

Bình thường, 22 17 byte

Lx^2%bQbl.uyNuyGE

Giải trình:

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.

Hãy thử nó ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.