"বিট-ধার" দুটি সংখ্যা


20

আপনি কি জানেন যে অল্প সংখ্যক একটি বড় সংখ্যা থেকে বিট ধার নিতে পারে ? এখানে একটি উদাহরণ। আসুন আমাদের দুটি সংখ্যা 5 এবং 14 বলুন First প্রথমে বাইনারি এগুলি লিখুন:

5       14
000101  001110

আমরা প্রথমে ক্ষুদ্রতম নিতে উপর বৃহত্তর নম্বর থেকে দূরে বিট, এবং আমরা ক্ষুদ্রতম তা দিতে বন্ধ অন্যান্য সংখ্যার উপর বিট। সুতরাং

This bit turns off
            |
            v
000101  001110
    ^
    |
This bit turns on

এখন আমাদের আছে

000111  001100

এবং আমাদের সংখ্যা 7 এবং 12। প্রথম সংখ্যাটি এখনও কম, তাই আমরা চালিয়ে যাচ্ছি।

000111  001100
001111  001000

এখন আমাদের 15 এবং 8 আছে, তাই আমরা থামাতে পারি। আমরা এই অপারেশনস সেটটিকে "বিট-ধার" দুটি নাম্বার বলব। এর আরেকটি উদাহরণ করা যাক। 20 এবং 61।

20        61
010100    111101
010101    111100
010111    111000
111111    100000
63        32

সুতরাং আমাদের শেষ ফলাফল 32, 63. আসুন আরও একটি করা যাক । 31, এবং 12 31 ইতিমধ্যে 12 এর চেয়ে বড়, সুতরাং কিছুই করার নেই! বিট-ধার 31 এবং 12 31 এবং 12 দেয়, কোনও পরিবর্তন নেই।

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা দুটি সংখ্যা নেয় এবং সেগুলি বিট-ধার করে। দুটি সংখ্যা সর্বদা ইতিবাচক পূর্ণসংখ্যার হবে। আপনার ইনপুট এবং আউটপুট যে কোনও যুক্তিসঙ্গত বিন্যাসে হতে পারে।

পরীক্ষার আইও:

Input: 2, 3
Output: 3, 2

Input: 3, 2
Output: 3, 2

Input: 8, 23
Output: 31, 0

Input: 42, 81
Output: 63, 0

Input: 38, 41
Output: 47, 32

Input: 16, 73
Output: 23, 0

Input: 17, 17
Output: 17, 17

স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ হয় এবং বাইট জেতে সংক্ষিপ্ত উত্তর!

উত্তর:


12

জেলি , 11 বাইট

~1¦&N$^µ</¿

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

পটভূমি

আমরা একটি পূর্ণসংখ্যা শেষ সেট বিট নিষ্কাশন করতে পারেন এন যেমন অনুসরণ করে।

এন +1 টগল সব চিহ্ন সেট বিট এন এবং সংলগ্ন সেট না বিট। উদাহরণস্বরূপ, 10011 2 + 1 = 10100 2

যেহেতু ~ n = - (n + 1) = -n - 1 , -n = ~ n + 1 , সুতরাং -n উপরের উপরেরটি n এর বিটওয়াইড নট (যা সমস্ত বিট টগল করে) এর উপর প্রয়োগ করে , সুতরাং শেষের আগে সমস্ত বিট টগল করে

উদাহরণস্বরূপ, -10100 2 = ~ 10100 2 + 1 = 01011 2 + 1 = 01100 2

গ্রহণ করে এন & -n , bitwise এবং এন এবং -n (ইন অসম থেকে গত সেট বিট আগে সব বিট বাতিল করা হয় এন এবং -n ), এইভাবে শেষ সেট বিট ফলনশীল এন

উদাহরণস্বরূপ, 10100 2 & -10100 2 = 10100 2 এবং 01100 2 = 00100 2

এভাবে XORing এন সঙ্গে এন & -n শেষ সেট বিট unsets এন

বিপরীতভাবে, n এর শেষ সেট বিটটি আনসেট করতে , উপরেরটি ~ n এ প্রয়োগ করা যথেষ্ট , যেখানে আমরা সূত্রটি n ^ (~ n & - ~ n) উপস্থাপন করি

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

~1¦&N$^µ</¿  Main link. Argument: A (list of pairs)

          ¿  While loop:
        </     Condition: Reduce p by less-than. True iff x < y.
       µ       Body chain:
~1¦              Apply bitwise NOT to the x, first item of the pair.
     $           Convert the two links to the left into a monadic chain.
    N              Negate; multiply [~x, y] by -1, yielding [-~x, -y].
   &               Logical AND. Yields [-~x & ~x, -y & y].
      ^            Vectorized XOR with p. Yields [(-~x & ~x) ^ x, (-y & y) ^ y].

6

জে, 31 26 বাইট

,`(($:~(OR>:))~(AND<:))@.<

পুনরাবৃত্তি এবং বিটওয়াইজ ট্রিকস ব্যবহার করে সোজা-ফরোয়ার্ড পদ্ধতি। অর্ডার (সেট বন্ধ করার জন্য 0 ) ডান-বেশিরভাগ ( 1 ) একটি মানের জন্য বিট এন , আপনি, bitwise-এবং মধ্যবর্তী সম্পাদন করতে পারবেন এন এবং N -1, এবং (সেটে চালু করতে 1 ) ডান-সবচেয়ে ( 0 ) বিটটি একটি মান এন এর জন্য , আপনি বিটওয়াইস-বা এন এবং এন +1 এর মধ্যে পারফর্ম করতে পারেন ।

ব্যবহার

ইনপুটটিতে দুটি পূর্ণসংখ্যা থাকে, একটি এলএইচএস এবং অন্যটি আরএইচএসে প্রয়োগ হয় এবং আউটপুটটি বিট-ধার করা মানগুলির একটি তালিকা।

   f =: ,`(($:~(OR>:))~(AND<:))@.<
   2 f 3
3 2
   3 f 2
3 2
   8 f 23
31 0
   42 f 81
63 0
   38 f 41
47 32
   16 f 73
23 0
   17 f 17
17 17

ব্যাখ্যা

,`(($:~(OR>:))~(AND<:))@.<  Input: x on LHS, y on RHS
                            If x < y,
,                             Form a 2-element array [x, y] and return
                            Else
                   <:         Decrement y
                AND           Perform bitwise-and on y and y-1, call it y'
          >:                  Increment x
        OR                    Perform bitwise-or on x and x+1, call it x'
    $:                        Call recursively on x' and y' and return

চমৎকার উত্তর! আপনি উত্তর পোস্ট করার পরে চ্যালেঞ্জটি পরিবর্তন করার জন্য দুঃখিত, তবে আমি চ্যালেঞ্জটি কিছুটা সহজ করেছি। (আপনাকে আর তালিকার উপরে পুনরাবৃত্তি করার দরকার নেই)। এটি আপনাকে আরও কিছুটা ছোট করতে দেয় let
ডিজেএমসিএমহেম

@ ডিগ্রিগ্রিনএগ্রসএন্ডআরনম্যান জে প্রকৃতপক্ষে কোনও সুস্পষ্ট র‌্যাঙ্কিং ছাড়াই দুটি অ্যারের মধ্যে উপাদান ভিত্তিক ফাংশন প্রয়োগ করছে, যা দুর্দান্ত। অন্য কৌশল না থাকলে এটি সম্ভবত একই রকম থাকবে।
মাইল

4

পাইথন, 42 বাইট

f=lambda x,y:x<y and f(x|x+1,y&y-1)or(x,y)

4 বাইট বন্ধ করে গল্ফ করার জন্য @ জিমি 23013 কে ধন্যবাদ! 2 বাইট বন্ধ করে গল্ফ করার জন্য @ লিক্যনুনকে ধন্যবাদ!

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


3

গণিত, 46 বাইট

If[#<#2,BitOr[#,#+1]~#0~BitAnd[#2,#2-1],{##}]&

জে আমার সমাধান হিসাবে একই পদ্ধতি ।

1 বাইট সংরক্ষণ এবং ইনফিক্স অ্যাপ্লিকেশনটির কথা মনে করিয়ে দেওয়ার জন্য @ মার্টিনকে ধন্যবাদ ~

ব্যবহার

ইনপুটটিতে দুটি পূর্ণসংখ্যার যুক্তি থাকে এবং আউটপুটটি বিট-ধার করা মান সহ একটি তালিকা।

উদাহরণ


ভেবেছিলাম আমি মজার কিছু চেষ্টা করব, তবে দুর্ভাগ্যক্রমে এটি দীর্ঘকাল বাইট: #//.{x_,y_}/;x<y:>{BitOr[x,x+1],BitAnd[y,y-1]}&(সম্ভবত এটি কীভাবে সংক্ষিপ্ত করা যায় সে সম্পর্কে আপনার ধারণা রয়েছে)
মার্টিন ইন্ডার

এটি একটি ঝরঝরে নিয়ম, তবে আমি গল্ফিংয়ের নিয়মের সাথে খুব বেশি পরিচিত নই। আমি সাধারণত কেবলমাত্র প্রতিস্থাপন /.এবং শর্ত ব্যবহার করি /;। আশা করি ম্যাথামেটিকা ​​আর্গুমেন্টের ধরণগুলি এবং এগুলি পরীক্ষা করে বুলেট এবং বিটওয়াইজের মধ্যে পরিবর্তন করতে পারে &&
মাইল

3

পাইথ, 29 27 25 22 21 21 19 19 18 16 বাইট

MxG ^ 2x: _ + + \ 0.BG`HCm.W <FHgVZU2dC 
MxG ^ 2x_ + + 0jG2HCm.W <FHgVZU2dC 
Cm.W <FH.bxN ^ 2x_ + + 0jN2YZ2dC 
m.W <FH.bxN ^ 2x_ + + 0jN2YZ2       <- পরিবর্তিত ইনপুট / আউটপুট বিন্যাস
 মেগাওয়াট <FH.exb ^ 2x_ + + 0jb2kZ 
m.W <FH.U ,. | bhb & ZtZZ। 
.W <FH.U ,. | bhb &          ZtZZ। <- পরিবর্তিত ইনপুট / আউটপুট বিন্যাস
 .W <FH.U ,. | bhb। & ZtZ
.W <FH.U ,. |। Bhb & ন

পরীক্ষা স্যুট.


আপনি উত্তর পোস্ট করার পরে চ্যালেঞ্জটি পরিবর্তন করার জন্য দুঃখিত, তবে আমি চ্যালেঞ্জটি কিছুটা সহজ করেছি। (আপনাকে আর তালিকার উপরে পুনরাবৃত্তি করার দরকার নেই)। যদিও ধন্যবাদ আপনাকে এটিকে ছোট করার অনুমতি দেবে।
ডিজেএমসিএমহেম

@ ডিগ্রিগ্রিনইগস্যান্ড আইরনম্যান এটি কেবল একটি বাইট সংরক্ষণ করেছে। Pyth হয় যে দক্ষ।
লিকি নুন


2

ল্যাবরেথ , 37 34 বাইট

?"
}
|=:{:
)   }
: :;-{
=&( {!;\!@

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

ব্যাখ্যা

দ্রুত ল্যাবরেথ প্রাইমার:

  • ল্যাবরেথ দুটি নির্বিচার-নির্ভুলতা পূর্ণসংখ্যার প্রধান স্টাফগুলি পরিচালনা করে, প্রধান এবং সহায়ক , যা প্রাথমিকভাবে একটি (অন্তর্নিহিত) অসীম পরিমাণ জিরো দিয়ে পূর্ণ হয়।
  • উত্স কোডটি একটি গোলকধাঁধার অনুরূপ, যেখানে নির্দেশিকা পয়েন্টার (আইপি) করিডোর অনুসরণ করে। সমস্ত আকর্ষণীয় নিয়ন্ত্রণ প্রবাহ জংশনে ঘটে: আইপিতে যখন একাধিক কক্ষ যেতে হয় তখন মূল স্ট্যাকের শীর্ষটি পরিদর্শন করা হয়। মানটি নেতিবাচক হলে, আইপি বাম দিকে ঘুরবে, যদি এটি ইতিবাচক হয় তবে আইপি ডানদিকে ঘুরবে, অন্যথায় এটি সরাসরি এগিয়ে যায়। যদি নির্বাচিত দিকটি কোনও প্রাচীর দ্বারা বন্ধ করা হয় (অর্থাত্ একটি স্থান), আইপি পরিবর্তে বিপরীত দিকে চলে যায়।

প্রোগ্রাম অন্যান্য উত্তর হিসাবে একই আলগোরিদিম ব্যবহার করে: আমরা প্রতিস্থাপন (a, b)সঙ্গে (a | a+1, b & b-1)দীর্ঘ হিসাবে হিসাবে a < b। আমি আরও কিছু গল্ফ করার চেষ্টা করার পরে আমি একটি সম্পূর্ণ ব্যাখ্যা যুক্ত করব।

আইপি ডানদিকে যাচ্ছে উপরের বাম কোণে শুরু হয়। ?একটি পূর্ণসংখ্যা পড়া a। তারপরে "একটি অনিঃপত্তি, তবে আইপিটি অবিলম্বে নীচে নামানো থেকে রোধ করা প্রয়োজন। এটিও একটি মৃত শেষ, তাই আইপি ঘুরিয়ে দেয় এবং ?আবার পড়ার জন্য কার্যকর করে b}তারপর প্যাচসমূহ bথেকে প্রধান করার AUX , তাই এখন আমরা পেয়েছিলাম করেছি:

Main [ ... 0 a | b 0 ...] Aux

|তারপর, কিছুই না, কারণ এটা bitwise বা এর লাগে aএবং 0। যেহেতু আমরা জানি aযে সর্বদা ইতিবাচক, তাই আইপি পূর্ব দিকে ঘুরছে (কারণ এটি পশ্চিম দিকে ঘুরতে পারে না)। এটি প্রোগ্রামটির মূল লুপটি শুরু করে। তুলনা করার জন্য আমরা একটি ছোট রৈখিক বিভাগ দিয়ে শুরু করি aএবং b:

=   Swap tops of stacks, i.e. swap a and b.
:   Duplicate b.
{   Pull a over to main.
:   Duplicate a.
}   Push one copy back to aux.
-   Compute b-a.

আইপি এখন অন্য সংযোগে। প্রথমে আসুন সেই ক্ষেত্রে বিবেচনা করা যাক ফলাফল ইতিবাচক। এর অর্থ b > aএবং আমাদের আরও একটি পুনরাবৃত্তি সম্পাদন করা দরকার। সেই পুনরাবৃত্তিটিও সম্পূর্ণ রৈখিক। নোট করুন যে স্ট্যাকগুলি বর্তমানে:

Main [ ... 0 b (b-a) | a 0 ...] Aux

;   Discard b-a.
:   Duplicate b.
(   Decrement.
&   Bitwise AND with b, clearing the least-significant 1.
=   Swap new b with old a.
:   Duplicate a.
)   Increment.
|   Bitwise OR with a, setting the least-significant 0.

এবং তারপরে আমরা লুপটির শুরুতে ফিরে এসেছি (যেহেতু aআবার ইতিবাচক, আইপি আবার পূর্ব দিকে ফিরে আসে)।

যদি কোনও সময়ে b-aইতিবাচক না হয় তবে আইপি অন্য দুটি পথের মধ্যে একটি গ্রহণ করবে। লক্ষ্য করুন উভয় ক্ষেত্রেই আমরা আনা aসঙ্গে {, তারপর কোণ যেখানে আইপি মোড় অনুসরণ আঘাত এবং তারপর প্রিন্ট aসঙ্গে !। এখন স্ট্যাকের শীর্ষটি আবার b-aযার অর্থ উভয় ক্ষেত্রেই আইপিটি পূর্বদিকে অগ্রসর হবে। যা কিছু বাকি আছে তা এখন একটি সংক্ষিপ্ত রৈখিক বিট:

;   Discard b-a.
\   Print a linefeed.
!   Print b.
@   Terminate the program.

1

জাভা 7, 73 বাইট

void d(int x,int y){while(x<y){x|=x+1;y&=y-1;}System.out.print(x+","+y);}

অবহেলিত ও পরীক্ষার কেস:

এখানে চেষ্টা করুন।

public class Main{
  static void d(int x, int y){
    while(x < y){
      x |= x + 1;
      y &= y - 1;
    }
    System.out.print(x + "," + y);
  }

  public static void main(String[] a){
    print(2, 3);
    print(3, 2);
    print(8, 23);
    print(42, 81);
    print(38, 41);
    print(16, 73);
    print(17, 17);
  }

  public static void print(int a, int b){
    d(a, b);
    System.out.println();
  }
}

আউটপুট:

3,2
3,2
31,0
63,0
47,32
23,0
17,17

পুরানো চ্যালেঞ্জ নিয়ম [ 126 125 123 বাইট]:

দ্রষ্টব্য: পুরানো চ্যালেঞ্জের নিয়ম দুটি আলগা পূর্ণসংখ্যার পরিবর্তে ইনপুট হিসাবে দুটি পূর্ণসংখ্যার অ্যারে ব্যবহার করে।

void d(int[]a,int[]b){int i=-1,x,y;while(++i<a.length){x=a[i];y=b[i];for(;x<y;x|=x+1,y&=y-1);System.out.println(x+","+y);}}

আপনি উত্তর পোস্ট করার পরে চ্যালেঞ্জটি পরিবর্তন করার জন্য দুঃখিত, তবে আমি চ্যালেঞ্জটি কিছুটা সহজ করেছি। (আপনাকে আর তালিকার উপরে পুনরাবৃত্তি করার দরকার নেই)। যদিও ধন্যবাদ আপনাকে এটিকে ছোট করার অনুমতি দেবে।
ডিজেএমসিএমহেম

@ ডিগ্রিগ্রিনইগস্যান্ড আইরনম্যান সম্পাদিত। বিটিডব্লু, লোকেরা উত্তর পোস্ট করার পরে নিয়মগুলি পরিবর্তন করা সাধারণত খারাপ অভ্যাস .. তবে আপনি যেমন বলেছিলেন, এটির বাইট-কাউন্টটি কমিয়ে দেওয়া উচিত, তাই আমি এটির সাথে ঠিক আছি। (পিএস: আপনি সবার জবাব উপরে উপরে মন্তব্য করেন নি।)
কেভিন ক্রুইজসেন

1
আপনি নিজের whileলুপটি আবার লিখতে পারেনfor(;x<y;x|=x+1,y&=y-1);
ক্লিফ্রুট

আমি এটা জানি. -_-আমি যদি প্রথম থেকে এটি আরও ভাল লিখতে চান। ধন্যবাদ, এটি একটি অযৌক্তিক বা কঠোর পরিবর্তন নয়। এছাড়াও, হ্যাঁ আমি প্রতিটি উত্তরের বিষয়ে মন্তব্য করি নি, তবে আমি প্রত্যেক ব্যবহারকারীকে জানিয়েছি। আমি একই ব্যবহারকারীকে একাধিকবার জানানোর মতো মনে হয় নি। আমি ডেনিসের পোস্টে কোনও মন্তব্য করি নি, তবে এটি কারণ তিনি এমন একজন ব্যবহারকারী ছিলেন যা আমাকে প্রাথমিকভাবে এটি পরিবর্তন করতে উত্সাহিত করেছিল।
ডিজেএমসিএমহেম

1

জাভাস্ক্রিপ্ট (ES6), 33 বাইট

f=(n,m)=>n<m?f(n|n+1,m&m-1):[n,m]

@ মাইল দ্বারা উত্তরগুলির সহজ বন্দর।


আপনি f=অ্যাথিকে শুরুটি ভুলে গেছেন : পি
মামা ফান রোল

1
আপনি "আবার" ;-) ভুলে গেছেন
নীল

1

জুলিয়া, 27 বাইট

x<|y=x<y?x|-~x<|y&~-y:[x,y]

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

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

আমরা <|আমাদের উদ্দেশ্যে বাইনারি অপারেটরকে সংজ্ঞায়িত করি । এটি জুলিয়ার সাম্প্রতিক সংস্করণগুলিতে অপরিবর্তিত, তবে এখনও পার্সার দ্বারা অপারেটর হিসাবে স্বীকৃত। যদিও \(পূর্ণসংখ্যার জন্য সুস্পষ্টভাবে সংজ্ঞায়িত করা হয়নি) একটি বাইট সংক্ষিপ্ত হলেও এর উচ্চতর অগ্রাধিকারটির x|-~x<|y&~-yসাথে প্রতিস্থাপনের প্রয়োজন হবে (x|-~x)\(y&~-y), এইভাবে বাইট গণনা বাড়ানো হবে।

<|এটির প্রথম যুক্তিটি দ্বিতীয়টির চেয়ে কঠোরভাবে কম কিনা তা পরীক্ষা করে। যদি তা হয় তবে এটি পুনরাবৃত্তির সাথে নিজেকে যুক্তিযুক্ত x | - ~ x = x | (x + 1) এবং y & ~ -y = y & (y - 1)

যেহেতু 1 থেকে x টোগল করে সমস্ত ট্রেলিং সেট বিট এবং সর্বনিম্ন আনসেট বিট, x | (x + 1) সর্বনিম্ন আনসেট বিট (এবং অন্য কোনও বিট নেই ) টগল করে। তেমনি, y থেকে 1 টি বিয়োগের পরে সমস্ত অনুসরণযোগ্য আনসেট বিট এবং সর্বনিম্ন সেট বিট টগল করে , y & (y + 1) সর্বনিম্ন সেট বিট টগল করে।

অবশেষে, যখন অসমতা x <y আর ধরে না, <|জুটিকে [x, y] প্রদান করে


0

ম্যাটল্যাব, 67 66 বাইট

লুপ:

function[]=f(x,y)
while x<y
x=bitor(x,x+1);y=bitand(y,y-1);end
x,y

পুনরাবৃত্ত (67 বাইট):

function[]=f(x,y)
if x<y
f(bitor(x,x+1),bitand(y,y-1))
else
x,y
end

বিট পরিবর্তন করার জন্য একই রকম দৃষ্টিভঙ্গি


0

Clojure, 63 বাইট

#(if(< % %2)(recur(bit-or %(inc %))(bit-and %2(dec %2)))[% %2])

জে আমার সমাধান হিসাবে একই পদ্ধতি ।

ব্যবহার

=> (def f #(if(< % %2)(recur(bit-or %(inc %))(bit-and %2(dec %2)))[% %2]))
=> (f 38 41)
[47 32]
=> (map (partial apply f) [[2 3] [3 2] [8 23] [42 81] [38 41] [16 73] [17 17]])
([3 2] [3 2] [31 0] [63 0] [47 32] [23 0] [17 17])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.