বিট-রিভার্সাল পারমুটেশন


28

আপনার লক্ষ্য হ'ল একটি পূর্ণসংখ্যা n প্রদত্ত পূর্ণসংখ্যার ব্যাপ্তিতে বিটগুলি বিপরীত করার জন্য একটি ক্রিয়াকলাপ বা একটি প্রোগ্রাম তৈরি করা । অন্য কথায়, আপনি খুঁজে পেতে চান বিট-উলটাপালটা বিন্যাস 2 একটি ব্যাপ্তির এন আইটেম, শূন্য-ইন্ডেক্স। এটি ওইআইএস সিকোয়েন্স এ 030109 । এই প্রক্রিয়াটি প্রায়শই এফএফটির জন্য স্থান-স্থান কুলি-টুকি অ্যালগোরিদমের মতো দ্রুত ফুউরিয়ার ট্রান্সফর্মগুলি কম্পিউটিংয়ে ব্যবহৃত হয়। দৈর্ঘ্য 2 হ'ল সিকোয়েন্সগুলির জন্য এফএফটি গণনা করার জন্যও একটি চ্যালেঞ্জ রয়েছে

এই প্রক্রিয়াটির জন্য আপনাকে [0, 2 এন -1] এর পরিসীমাটি পুনরাবৃত্তি করতে হবে এবং প্রতিটি মানকে বাইনারি রূপান্তর করতে হবে এবং সেই মানটিতে বিটগুলি বিপরীত করতে হবে। আপনি বেস 2-তে প্রতিটি মানকে একটি এন- ডিজিট সংখ্যা হিসাবে বিবেচনা করবেন যার অর্থ বিপরীতটি কেবল সর্বশেষ এন বিটগুলির মধ্যেই ঘটবে ।

উদাহরণস্বরূপ, যদি এন = 3 হয় তবে পূর্ণসংখ্যার পরিসীমা [0, 1, 2, 3, 4, 5, 6, 7]। এইগুলো

i  Regular  Bit-Reversed  j
0    000        000       0
1    001        100       4
2    010        010       2
3    011        110       6
4    100        001       1
5    101        101       5
6    110        011       3
7    111        111       7

যেখানে প্রতিটি সূচি i বিট-রিভার্সাল ব্যবহার করে সূচক জে রূপান্তরিত হয় । এর অর্থ আউটপুট [0, 4, 2, 6, 1, 5, 3, 7]

0 থেকে 4 এর মধ্যে n এর আউটপুট

n    Bit-Reversed Permutation
0    [0]
1    [0, 1]
2    [0, 2, 1, 3]
3    [0, 4, 2, 6, 1, 5, 3, 7]

আপনি একটি প্যাটার্ন গঠনের বিষয়টি লক্ষ্য করেছেন। এন দেওয়া হয়েছে , আপনি n -1 এর জন্য পূর্বের ক্রমটি নিতে পারেন এবং এটি দ্বিগুণ করতে পারেন। তারপরে সেই দ্বিগুণ তালিকে একই ডাবল তালিকায় সংযুক্ত করে তবে একের সাথে বাড়িয়ে দেওয়া। দেখানো,

[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]

যেখানে উপসংহারের প্রতিনিধিত্ব করে।

আপনার সমাধান গঠনের জন্য আপনি উপরের দুটি পদ্ধতির মধ্যে দুটি ব্যবহার করতে পারেন। আপনি যদি আরও ভাল উপায় জানেন তবে আপনিও এটি ব্যবহার করতে মুক্ত। যেকোন পদ্ধতি ততক্ষণ ঠিক থাকে যতক্ষণ না এটি সঠিক ফলাফল দেয়।

বিধি

  • এটি তাই সংক্ষিপ্ততম সমাধানটি জয়লাভ করে।
  • বিল্টিনগুলি যা পুরো এই চ্যালেঞ্জকে সমাধান করে এবং বিল্টিনগুলি যা কোনও মানের বিট-রিভার্সাল গণনা করে তা অনুমোদিত নয়। এটিতে বিল্টিনগুলি অন্তর্ভুক্ত নয় যা বাইনারি রূপান্তর বা অন্যান্য বিটওয়াইজ অপারেশন করে perform
  • আপনার সমাধানটি অবশ্যই কমপক্ষে 0 থেকে 31 এর n এর জন্য বৈধ হতে হবে ।

3
"বিল্টিনগুলি যা পুরো এই চ্যালেঞ্জকে সমাধান করে এবং বিল্টিনগুলি যা কোনও মানের বিট-রিভার্সাল গণনা করে তা অনুমোদিত নয়" " আওউ,, IntegerReverse[Range[2^#]-1,2,#]&। (আমি জানি না কেন ম্যাথামেটিকাকে সেই অন্তর্নির্মিত প্রয়োজন তবে আমি অনুমান করি যে এটি এর চেয়ে খুব বেশি অযৌক্তিক নয় Sunset...)
মার্টিন ইন্ডার

নিবন্ধন করুন কোনও দিন, এটি হতে পারে যে ম্যাথমেটিকার সমস্ত কিছুর জন্য র্যান্ডম কোড-গল্ফ চ্যালেঞ্জ উত্পন্ন করে তোলার জন্য একটি বিল্টিন থাকবে।
মাইল

আমরা 0পরিবর্তে মুদ্রণ করতে পারি [0]বা এটি একটি তালিকা হতে হবে?
ডেনিস

@ ডেনিস ভাল পয়েন্ট। আমি এটির অনুমতি দেব, যেহেতু আউটপুট বিন্যাস নির্বিশেষে একটি বৈধ অনুমানের প্রতিনিধিত্ব করে important
মাইল

0 এর পরিবর্তে মিথ্যা ফিরিয়ে দেওয়া কি গ্রহণযোগ্য হবে?
ডেনিস

উত্তর:


2

জেলি , 7 6 বাইট

Ḥ;‘$$¡

1 বাইট বন্ধ গল্ফ করার জন্য @ এরিকথ আউটগলফারকে ধন্যবাদ!

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

Ḥ;‘$$¡  Main link. No arguments.
        Implicit argument / initial return value: 0

     ¡  Read an integer n from STDIN and call the link to the left n times.
    $   Combine the two links to the left into a monadic chain, to be called
        with argument A (initially 0, later an array).
Ḥ         Unhalve; yield 2A.
   $      Combine the two links to the left into a monadic chain, to be called
          with argument 2A.
  ‘         Increment; yield 2A + 1
 ;          Concatenate 2A and 2A + 1.

4

05 এ বি 1 ই , 8 বাইট

কোড:

¾)IF·D>«

ব্যাখ্যা:

¾         # Constant for 0.
 )        # Wrap it up into an array.
  IF      # Do the following input times.
    ·     # Double every element.
     D    # Duplicate it.
      >   # Increment by 1.
       «  # Concatenate the first array.

সিপি -1222 এনকোডিং ব্যবহার করে । এটি অনলাইন চেষ্টা করুন!


সুন্দর! আমার কাছে
থাকাটিকেই

@ এমিগনা ধন্যবাদ! তখন আপনার সংস্করণটি কী ছিল?
আদনান

0)ïsF·D>«যদিও কাছাকাছি ছিল। '0' নিয়ে কিছু সমস্যা ছিল।
Emigna

1
এর দুর্দান্ত ব্যবহার ¾। এই কৌশলটি মনে রাখতে হবে।
Emigna

1
@ কেভিন ক্রুজসেন ইনপুট 0-এর জন্য 0 টির প্রতিনিধিত্বমূলক নয় এবং স্ট্রিং প্রতিনিধিত্ব নয়: তা ছাড়া ভিন্নতা নেই।
আদনান

4

এমএটিএল, 13 12 10 9 8 বাইট

0i:"EtQh

এটি অনলাইনে চেষ্টা করুন

ব্যাখ্যা

0       % Push number literal 0 to the stack
i:"     % Loop n times
    E   % Multiply by two
    t   % Duplicate
    Q   % Add one
    h   % Horizontally concatenate the result
        % Implicit end of loop, and implicitly display the result

সম্পূর্ণতার জন্য, নন-রিকার্সিভ অ্যাপ্রোচ (9 বাইট) ব্যবহার করে এখানে আমার পুরানো উত্তর ছিল।

W:qB2&PXB

এটি অনলাইনে চেষ্টা করুন

ব্যাখ্যা

W       % Compute 2 to the power% ofImplicitly thegrab input (n) and compute 2^n
:       % Create an array from [1...2^n]
q       % Subtract 1 to get [0...(2^n - 1)]
B       % Convert to binary where each row is the binary representation of a number
2&P     % Flip this 2D array of binary numbers along the second dimension
XB      % Convert binary back to decimal
        % Implicitly display the result

4

জে, 15 11 বাইট

2&(*,1+*)0:

15 বাইটের জন্য একটি বিকল্প রয়েছে যা সোজা-ফরোয়ার্ড বাইনারি রূপান্তর এবং বিপরীত ব্যবহার করে।

2|."1&.#:@i.@^]

ব্যবহার

   f =: 2&(*,1+*)0:
   f 0
0
   f 1
0 1
   f 2
0 2 1 3
   f 3
0 4 2 6 1 5 3 7
   f 4
0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15

ব্যাখ্যা

2&(*,1+*)0:  Input: n
         0:  The constant 0
2&(     )    Repeat n times starting with x = [0]
2      *       Multiply each in x by 2
     1+        Add 1 to each
    ,          Append that to
2  *           The list formed by multiplying each in x by 2
               Return that as the next value of x
             Return the final value of x



3

অক্টাভা, 37 বাইট

@(n)bin2dec(fliplr(dec2bin(0:2^n-1)))

নামে একটি বেনামি ফাংশন তৈরি করে ansযার সাথে সহজেই ডাকা যেতে পারে ans(n)

অনলাইন ডেমো


3

পাইথন 2, 56 55 54 বাইট

f=lambda n:[0][n:]or[i+j*2for i in 0,1for j in f(n-1)]

আইডিয়নে এটি পরীক্ষা করুন ।

@ এক্সনরকে 1 বাইট বন্ধ করে গল্ফ করার জন্য ধন্যবাদ!


আপনি করতে পারেন [0][n:]or
xnor

3

জাভা, 422 419 বাইট:

import java.util.*;class A{static int[]P(int n){int[]U=new int[(int)Math.pow(2,n)];for(int i=0;i<U.length;i++){String Q=new String(Integer.toBinaryString(i));if(Q.length()<n){Q=new String(new char[n-Q.length()]).replace("\0","0")+Q;}U[i]=Integer.parseInt(new StringBuilder(Q).reverse().toString(),2);}return U;}public static void main(String[]a){System.out.print(Arrays.toString(P(new Scanner(System.in).nextInt())));}}

ঠিক আছে, আমি শেষ পর্যন্ত আমার দ্বিতীয় প্রোগ্রামিং ভাষার জন্য জাভা শিখেছি, তাই আমি একটি নতুন চ্যালেঞ্জটি সম্পূর্ণ করার জন্য আমার নতুন দক্ষতা ব্যবহার করতে চেয়েছিলাম, যদিও এটি খুব দীর্ঘ হয়ে গেছে, আমি হতাশ হই না। আমি জাভাতে একটি সাধারণ চ্যালেঞ্জ সম্পূর্ণ করতে পেরে আমি খুব খুশি।

এটি অনলাইন চেষ্টা করুন! (Ideone)


আপনি স্ট্যান্ডিন থেকে পড়ার চেয়ে আরোগুলি থেকে কোনও ইন্টারকে পার্সিং করে কিছু বাইট সংরক্ষণ করতে পারেন
পাভেল

3

গণিত, 56 33 বাইট

বাইট গণনাটি একটি আইএসও 8859-1 এনকোডেড উত্স ধরেছে।

±0={0};±x_:=Join[y=±(x-1)2,y+1]

এটি একটি আনারি অপারেটর সংজ্ঞায়িত করতে পুনরাবৃত্ত সংজ্ঞাটি ব্যবহার করে ±


3

পার্ল, 46 45 বাইট

এর জন্য +1 অন্তর্ভুক্ত -p

এসটিডিনে ইনপুট নম্বর দিন

#!/usr/bin/perl -p
map$F[@F]=($_*=2)+1,@F for(@F=0)..$_;$_="@F"


2

জাভাস্ক্রিপ্ট ES6, 65 53 51 বাইট

f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]

পুনরাবৃত্তির ডাবল-ইনক্রিমেন্ট-কনক্যাট অ্যালগরিদম ব্যবহার করে।

উদাহরণ রান:

f(0) => [0]
f(1) => [0, 1]
f(2) => [0, 2, 1, 3]
f(4) => [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]

কীভাবে f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]?
মাইল

@ মাইলস উফস, বুঝতে পারিনি যে, এর জন্য আমার কোনও বেস কেস লাগবে না n==1, ধন্যবাদ।
ডেনড্রোবিয়াম

2
আমার মনে হয় আমি দু'গুণ বৃদ্ধি করে 2 বাইট শেভ করতে পেরেছি:f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
নীল

2

পাইথন 3, 67 59 বাইট

-8 বাইটের জন্য @ ডেনিসকে ধন্যবাদ

lambda n:[int(bin(i+2**n)[:1:-1],2)//2for i in range(2**n)]

পাইথনে আমরা পাশাপাশি (সংশোধিত) সোজা বাস্তবায়ন করতে পারি, যদিও এটি বেশ দীর্ঘ is

একটি বেনাম ফাংশন যা আর্গুমেন্টের মাধ্যমে ইনপুট নেয় এবং বিট-বিপরীত ক্রমান্বয়কে তালিকা হিসাবে ফিরিয়ে দেয়।

কিভাবে এটা কাজ করে

lambda n                 Anonymous function with input n
...for i in range(2**n)  Range from 0 to 2**n-1
bin(i+2**n)[:1:-1]       Convert i+2**n to binary string, giving 1 more digit than needed,
                         remove '0b' from start, and reverse
int(...,2)               Convert back to decimal
...//2                   The binary representation of the decimal value has one trailing
                         bit that is not required. This is removed by integer division by 2
:[...]                   Return as list

আইডিয়নে চেষ্টা করে দেখুন


2
এইআমার এই পদ্ধতির সাথে সম্পর্ক, তবে গৌরবময়তা পাইথন 3-র বন্দরে বেঁচে থাকবে না
ডেনিস

2

ডায়ালগ এপিএল , 12 বাইট

প্রয়োজন ⎕IO←0অনেক সিস্টেমে পূর্বনির্ধারিত।

2⊥⊖2⊥⍣¯12*⎕

2⊥ থেকে-বেস -2

উল্টানো

2⊥⍣¯1 এর-বেস -2 এর বিপরীত

প্রথম এন পূর্ণসংখ্যা, যেখানে এন হয়

2* ক্ষমতা 2

সংখ্যা ইনপুট

অনলাইনে চেষ্টা করুন!


তুলনার জন্য, এখানে অন্য পদ্ধতি:

(2∘×,1+2∘×)⍣⎕⊢0

( ফাংশন ট্রেন ...

2∘× দুইবার (যুক্তি)

, সংক্ষিপ্ত

1+ এক প্লাস

2∘× দুইবার (যুক্তি)

)⍣ দ্বারা নির্দিষ্ট হিসাবে অনেক বার প্রয়োগ

সংখ্যা ইনপুট

উপর

0 শূন্য


(⍋,⍨)⍣⎕⊢0( ⎕io←0)
এনজিএন

@ngn এর আমার অ্যালগরিদমের সাথে কোনও সম্পর্ক নেই।
অ্যাডাম

আমি ভেবেছিলাম এটি আপনার "অন্যান্য পদ্ধতির সাথে" অনুরূপ তবে ঠিক আছে, আমি একটি পৃথক উত্তর লিখব
এনজিএন

2

কে (এনএনজি / কে) , 11 8 বাইট

2/|!2|&:

এটি অনলাইন চেষ্টা করুন!

 x:3  / just for testing
 &x   / that many zeroes
0 0 0
 2|&x / max with 2
2 2 2
 !x#2 / binary words of length x, as a transposed matrix
(0 0 0 0 1 1 1 1
 0 0 1 1 0 0 1 1
 0 1 0 1 0 1 0 1)
 |!x#2 / reverse
(0 1 0 1 0 1 0 1
 0 0 1 1 0 0 1 1
 0 0 0 0 1 1 1 1)
 2/|!x#2 / base-2 decode the columns
0 4 2 6 1 5 3 7

&কম্পোজিশনের সর্বশেষ ক্রিয়াটি তাই আমাদের :এটি জঘন্য হতে বাধ্য করার প্রয়োজন to




1

Clojure, 78 বাইট

শুধু অনুমান অনুসরণ করা ...

(defn f[n](if(= n 0)[0](let[F(map #(* 2 %)(f(dec n)))](concat F(map inc F)))))


1

পিএইচপি, 57 বাইট

while($i<1<<$argv[1])echo bindec(strrev(decbin($i++))),_;

কমান্ড লাইন প্যারামিটার থেকে ইনপুট নেয়, আন্ডারস্কোর-সীমাবদ্ধ মানগুলি মুদ্রণ করে। সাথে চালাও-nr

পুনরাবৃত্তির সমাধান, 72 বাইট

function p($n){$r=[$n];if($n)foreach($r=p($n-1)as$q)$r[]=$q+1;return$r;}

ফাংশন পূর্ণসংখ্যার লাগে, অ্যারে প্রদান করে



1

পার্ল 6 , 42 বাইট

{0,{$^p+^($_-$_/2+>lsb ++$)}...$_}o 1+<*-1

এটি অনলাইন চেষ্টা করুন!

একটি পূর্ণসংখ্যা বৃদ্ধিশীল কেবল থেকে উদাহরণস্বরূপ, চেয়ে কম গুরুত্বপূর্ণ বিট একটা ক্রম ফ্লিপ xxxx0111করতে xxxx1000। সুতরাং পরবর্তী বিট-বিপরীত সূচকটি সর্বাধিক-উল্লেখযোগ্য বিটের ক্রমকে উল্টিয়ে পূর্বের একের কাছ থেকে পাওয়া যাবে। এক্সওআর মাস্কের m - (m >> (ctz(i) + 1))জন্য m = 2**nবা এর সাথে গণনা করা যেতে পারে m = 2**n-1

পার্ল 6 , 30 বাইট

my&f={$_&&(^2 X+(f($_-1)X*2))}

এটি অনলাইন চেষ্টা করুন!

পুনরাবৃত্তি পদ্ধতির।


1

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 48 বাইট

f=n=>n?[for(x of[0,1])for(y of f(n-1))x+y+y]:[0]

@ ডেনিসের পাইথন 2 সমাধানের পোর্ট।


রেফারেন্সএরর: f সংজ্ঞায়িত করা হয়নি
l4m2

1

জাপট , 14 13 বাইট

2pU Ǥw ú0U Í

এটি অনলাইন চেষ্টা করুন!

আনপ্যাকড এবং কীভাবে এটি কাজ করে

2pU o_s2 w ú0U n2

2pU    2**n
o_     range(2**n).map(...)
s2       convert to binary string
w        reverse
ú0U      right-pad to length n, filling with '0'
n2       convert binary string to number

সোজা বাস্তবায়ন।


এর জন্য প্রকৃতপক্ষে একটি অননুমোদিত শর্টকাট রয়েছে n2:Í
অলিভার

1

এপিএল (ডায়ালগ ক্লাসিক) , 9 বাইট

(⍋,⍨)⍣⎕⊢0

এটি অনলাইন চেষ্টা করুন!

মূল্যায়ন ইনপুট

( )⍣⎕⊢0এই জিনিসটি ( )বহুবার প্রয়োগ করে শুরু করুন0

,⍨ বর্তমান ফলাফল নিজেই সঙ্গে যুক্ত

একটি সাজানোর-আরোহী ক্রমানুসারে সূচক


0

x86, 31 বাইট

পর্যাপ্ত পরিমাণে বড় int[] bufferহয় eaxএবং এন ইন করে ecxএবং বাফারকে ফিরে দেয় eax

চ্যালেঞ্জ বিবৃতিতে প্রদত্ত কনকেনেটেটিং অ্যালগরিদমকে কার্যকর করে। সরাসরি অ্যারে অ্যাক্সেসগুলি ব্যবহার না করে পয়েন্টারগুলিকে 4 দ্বারা বাড়িয়ে বাইটগুলি সংরক্ষণ করা সম্ভব হতে পারে, তবে lea/ movইতিমধ্যে খুব ছোট (3 বাইট 3 রেগ এবং একটি গুণক) এর জন্য।

.section .text
.globl main
main:
        mov     $buf, %eax          # buf addr
        mov     $3, %ecx            # n 

start:
        xor     %ebx, %ebx
        mov     %ebx, (%eax)        # init buf[0] = 0 
        inc     %ebx                # x = 1

l1:
        mov     %ebx, %edi          
        dec     %edi                # i = x-1
        lea     (%eax,%ebx,4), %edx # buf+x 

l2:
        mov     (%eax,%edi,4), %esi # z = buf[i]
        sal     %esi                # z *= 2
        mov     %esi, (%eax,%edi,4) # buf[i] = z
        inc     %esi                # z += 1
        mov     %esi, (%edx,%edi,4) # buf[x+i] = z

        dec     %edi                # --i 
        jns     l2                  # do while (i >= 0)

        sal     %ebx                # x *= 2
        loop    l1                  # do while (--n)

        ret

.data
buf:    .space 256, -1

Hexdump:

00000507  31 db 89 18 43 89 df 4f  8d 14 98 8b 34 b8 d1 e6  |1...C..O....4...|
00000517  89 34 b8 46 89 34 ba 4f  79 f1 d1 e3 e2 e7 c3     |.4.F.4.Oy......|
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.