হাইপারকিউবে হাঁটছি


9

আমি সম্প্রতি গ্রাফ তত্ত্বটি, বিশেষত হাইপারকিউবগুলি পড়েছি এবং সেগুলির উপরে রাস্তা তৈরির আকর্ষণীয় উপায়গুলি নিয়ে চিন্তা করেছি। আমি যা নিয়ে এসেছি তা এখানে।

আপনি যেমন জানেন যে, আপনি একটি এন-ডাইমেনশনাল হাইপারকিউব তৈরি করতে পারেন সমস্ত এন-টিপলসকে 1এবং 0উল্লম্ব হিসাবে নিয়ে এবং সেগুলি সংযুক্ত করতে পারেন, যদি তারা এক অঙ্কে পৃথক হয়। আপনি যদি এই বাইনারি অঙ্কগুলিকে একটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করেন তবে আপনি সুন্দরভাবে অঙ্কিত শীর্ষগুলি সহ একটি গ্রাফটি শেষ করবেন। উদাহরণস্বরূপ n=3:

এখানে চিত্র বর্ণনা লিখুন

ধরা যাক আপনি এই হাইপারকিউবে হাঁটতে চান এবং প্রান্তটি শুরু করতে চান 0। এখন, আপনি কীভাবে নির্ধারণ করবেন যে আপনি পরেরটিটি দেখতে চান? আমি যে নিয়মটি নিয়ে এসেছি তা হ'ল আপনি aযে ভারেটেক্সটির সংখ্যাটি নিয়েছেন তা mod(a,n)এর বিট (শূন্য-ভিত্তিক সূচক) ফ্লিপ করুন এবং ফলস্বরূপ শীর্ষবিন্দুতে যান। সাধারণত এই নিয়মটি পুনরাবৃত্তভাবে হিসাবে সংজ্ঞায়িত করা যেতে পারে

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

এই নিয়মটি অনুসরণ করে আপনি সর্বদা কিউবে থাকবেন এবং প্রান্তগুলি দিয়ে ভ্রমণ করবেন। ফলস্বরূপ পথটি দেখতে এ জাতীয় দেখাচ্ছে

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, আপনি একটি বৃত্তে হাঁটবেন! প্রকৃতপক্ষে, সমস্ত মাত্রায় এবং সমস্ত সূচনার পয়েন্টগুলির জন্য আপনার পথটি একটি লুপে শেষ হবে। উদাহরণস্বরূপ n=14এবং a[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)), এটি অপ্রাসঙ্গিক হয় যদি শীর্ষগুলি কোনও হাইপারকিউবের অন্তর্ভুক্ত, তাই না?
লুইস মেন্ডো

ঠিক। তাহলে a[m]hypercube ছিল, a[m+1]বলে প্রমাণিত হবে। আপনি যেহেতু a[0]একটি বৈধ প্রান্তি হিসাবে ধরে নিতে পারেন , আপনার কোনও হাইপারকিউব স্টাফ সম্পর্কে যত্ন নেওয়া এবং কেবল নিয়মটি অনুসরণ করার দরকার নেই।
মার্ফ

উত্তর:


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)

এটি দুটি-পয়েন্টারগুলি-প্রায়-ভিন্ন-গতির অ্যালগরিদম দ্বারা চেনাশোনাটি আবিষ্কার করে এবং হাস্কেলের তালিকাগুলিতে প্রচলিতভাবে / আপত্তিজনক ব্যবহার করে (উদাহরণস্বরূপ, দুটি পয়েন্টার আসলে তালিকাগুলি)।

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}

18812 (23, 10) এর জন্য ফিরে আসে।


1

এমএটিএল , 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

@ লিরিটোসিস্ট সত্য! ধন্যবাদ। সম্পাদিত
লুইস মেন্ডো

1

পাইথ, 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.