Berjalan di Hypercube

9

Baru-baru ini saya membaca tentang teori grafik, terutama hypercubes dan memikirkan cara-cara menarik untuk membangun jalur padanya. Inilah yang saya pikirkan.

Seperti yang mungkin Anda ketahui, Anda dapat membuat hypercube n-dimensional dengan mengambil semua n-tuple yang terdiri dari 1dan 0sebagai simpul dan menghubungkannya, jika mereka berbeda dalam satu digit. Jika Anda menginterpretasikan digit biner ini sebagai angka integer, Anda berakhir dengan grafik dengan simpul numerik yang baik. Misalnya untuk n=3:

masukkan deskripsi gambar di sini

Katakanlah Anda ingin berjalan-jalan di hypercube ini dan mulai dari titik awal 0. Sekarang, bagaimana Anda menentukan titik mana yang ingin Anda kunjungi selanjutnya? Aturan yang saya buat adalah mengambil jumlah avertex tempat Anda berada, balikkan mod(a,n)bitnya (pengindeksan berbasis nol) dan buka vertex yang dihasilkan. Secara formal aturan ini dapat didefinisikan secara rekursif sebagai

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

Dengan mengikuti aturan ini, Anda akan selalu tetap di kubus dan melakukan perjalanan di sepanjang tepi. Jalur yang dihasilkan terlihat seperti ini

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, Anda akan berjalan dalam lingkaran! Bahkan, di semua dimensi dan untuk semua titik awal, jalur Anda akan berakhir dalam satu lingkaran. Misalnya untuk n=14dan a[0]=0terlihat seperti ini

masukkan deskripsi gambar di sini

Bagi seorang ambler yang rajin, panjang rute yang direncanakannya adalah informasi yang sangat penting. Jadi, tugas Anda adalah menulis fungsi atau program yang mengambil dimensi hypercube sebagai ntitik awal a[0]sebagai input dan menampilkan jumlah simpul dalam loop yang dihasilkan.

Uji kasus

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

Aturan

  • Celah standar dilarang
  • Output / Input dapat dalam format yang sesuai
  • Anda mungkin menganggap a[0]sebagai simpul yang valid

Mencetak gol

Kode terpendek dalam byte menang.

Jika Anda memiliki informasi tambahan tentang topik ini, saya akan senang mendengarnya!

murphy
sumber
Diberi aturan a[m+1] = xor(a[m], 2^mod(a[m],n)), itu tidak relevan jika simpul milik hypercube, kan?
Luis Mendo
Baik. Jika a[m]berada di hypercube, a[m+1]akan terlalu. Dan karena Anda dapat menganggap a[0]sebagai simpul yang valid, Anda tidak perlu peduli tentang hal-hal hypercube dan cukup ikuti aturannya.
murphy
1
Di mana hiper semut?
Bassdrop Cumberwubwubwub

Jawaban:

4

Jelly, 9 byte

%⁴2*^µÐḶL

Membawa dua argumen baris perintah.

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

Coba di sini .

lirtosiast
sumber
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)

Ini menemukan lingkaran oleh algoritma dua-pointer-going-around-in-berbeda-kecepatan, dan sangat menggunakan / menyalahgunakan pendekatan Haskell untuk daftar (misalnya, kedua pointer sebenarnya daftar).

gadalah fungsi yang menghitung jawabannya. berikan ndan kemudian a[0]dan itu akan mengembalikan nomor kepada Anda (catatan yang nharus didefinisikan sebagai tipe Intuntuk menghindari tipe ambiguitas).

haskeller bangga
sumber
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}

Pengembalian 18812 untuk (23, 10).

Neil
sumber
1

MATL , 38 37 28 byte

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

Ini berfungsi dalam versi bahasa saat ini (15.0.0) .

Cobalah online !

Penjelasan

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
Luis Mendo
sumber
@ lirtosiast Benar! Terima kasih. Diedit
Luis Mendo
1

Pyth, 22 17 byte

Lx^2%bQbl.uyNuyGE

Penjelasan:

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.

Coba di sini .

lirtosiast
sumber