Hiperküp üzerinde yürümek


9

Son zamanlarda grafik teorisini, özellikle hiperküpleri okudum ve üzerlerine yollar inşa etmenin ilginç yollarını düşündüm. İşte ortaya koyduğum şey.

Bildiğiniz gibi, köşelerden oluşan 1ve 0köşeler olarak oluşan tüm n-tupl'leri alarak ve tek bir basamakta farklılık gösterirlerse, n-boyutlu bir hiperküp inşa edebilirsiniz . Bu ikili basamakları bir tamsayı olarak yorumluyorsanız, güzel şekilde numaralandırılmış köşeleri olan bir grafik elde edersiniz. Örneğin n=3:

resim açıklamasını buraya girin

Diyelim ki bu hiperküpte bir yürüyüş yapmak ve tepe noktasından başlamak istiyorsunuz 0. Şimdi, bir sonraki ziyaret etmek istediğiniz tepe noktasını nasıl belirliyorsunuz? Geldiğim kural a, bulunduğunuz tepe noktasının sayısını almak, mod(a,n)s bitini (sıfır tabanlı indeksleme) çevirmek ve ortaya çıkan tepe noktasına gitmek. Resmi olarak bu kural özyineli olarak şu şekilde tanımlanabilir:

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

Bu kurala uyarak, daima küp üzerinde kalacak ve kenarlar boyunca seyahat edeceksiniz. Ortaya çıkan yol şöyle görünür

resim açıklamasını buraya girin

Gördüğünüz gibi, bir daire içinde yürüyeceksiniz! Aslında, tüm boyutlarda ve tüm başlangıç ​​noktalarında yolunuz bir döngüye dönüşür. Örneğin için n=14ve a[0]=0böyle görünüyor

resim açıklamasını buraya girin

Hevesli ambler için, planlanan rotasının uzunluğu oldukça önemli bir bilgidir. Bu nedenle, işiniz hiper küp boyutunu nbir başlangıç ​​tepe noktası a[0]olarak girdi olarak alan ve sonuçtaki döngüdeki köşe sayısını çıkaran bir işlev veya program yazmaktır .

Test senaryoları

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

kurallar

  • Standart boşluklar yasaktır
  • Çıkış / Giriş herhangi bir uygun biçimde olabilir
  • a[0]Geçerli bir tepe noktası olduğunu varsayabilirsiniz .

puanlama

Bayt cinsinden en kısa kod kazanır.

Bu konuyla ilgili başka bilgileriniz varsa, memnuniyetle dinleyebilirim!


Kural göz önüne alındığında, a[m+1] = xor(a[m], 2^mod(a[m],n))köşelerin bir hiper küpüne ait olması önemli değildir, değil mi?
Luis Mendo

Sağ. a[m]Hiperküpte olsaydı da a[m+1]olacak. Ve a[0]geçerli bir tepe noktası olduğunu varsaydığınız gibi , herhangi bir hiper küpü önemsemenize gerek yoktur ve sadece kuralı takip edersiniz.
murphy

Yanıtlar:


4

Jöle, 9 bayt

%⁴2*^µÐḶL

İki komut satırı argümanı alır.

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

Burada deneyin .


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)

Bu, çemberi farklı hızlarda iki yönlü gidiş algoritması ile bulur ve Haskell'in listelere yaklaşımını büyük ölçüde kullanır / kötüye kullanır (örneğin, iki işaretçi aslında listelerdir).

gcevabı hesaplayan fonksiyondur. verin nve sonra a[0]numarayı size döndürecektir ( tür belirsizliğini önlemek için türün ntanımlanması gerektiğini unutmayın Int).


1

JavaScript (ES6), 69 bayt

(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) için 18812 değerini döndürür.


1

MATL , 38 37 28 bayt

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

Bu , dilin geçerli sürümünde (15.0.0) çalışır .

Çevrimiçi deneyin !

açıklama

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 Doğru! Teşekkürler. Düzenlendi
Luis Mendo

1

Pyth, 22 17 bayt

Lx^2%bQbl.uyNuyGE

Açıklama:

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.

Burada deneyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.