বিভিন্ন সংখ্যা, একই ওজন


22

পটভূমি

Hamming ওজন একটি পূর্ণসংখ্যা তার বাইনারি প্রতিনিধিত্ব বেশী সংখ্যা। এই চ্যালেঞ্জের জন্য, পূর্ণসংখ্যা 32 টি বিটের সাথে উপস্থাপিত হয় এবং তারা স্বাক্ষরবিহীন থাকে।

চ্যালেঞ্জ

0 এবং 2 ^ 32-1 (অ-অন্তর্ভুক্ত) এর মধ্যে একটি পূর্ণসংখ্যা দেওয়া, আউটপুটটি আলাদা মধ্যে পূর্ণসংখ্যা দেওয়া, একই পরিসরের মধ্যে এবং একই হ্যামিং ওজনের সাথে পূর্ণসংখ্যা ।

উদাহরণ

Input (Decimal) | Input (Binary) | Hamming weight | Possible output (Decimal)
       46       |   0b0010 1110  |       4        |      15
       12       |   0b0000 1100  |       2        |      3
        1       |   0b0000 0001  |       1        |      2
        3       |   0b0000 0011  |       2        |      6
      2^31      |   0b1000....0  |       1        |      1
      2^31+2    |   0b1000...10  |       2        |      3
      2^32-5    |   0b1111..011  |       31       |      2^31-1
      2^32-2    |   0b1111....0  |       31       |      2^31-1
        0       |   0b0000 0000  |       0        | None (This case need not be handled)
      2^32-1    |   0b1111....1  |       32       | None (This case need not be handled)

স্কোরিং

এটি , তাই প্রতিটি ভাষার কয়েকটি বাইটে সমাধান জিততে পারে।


2
আমি 2 ^ 31 + 1 এবং 2 ^ 32-3 এর মধ্যে একটি বিজোড় সংখ্যা যুক্ত করার পরামর্শ দেব, কারণ কিছু উত্তর এতে ব্যর্থ হচ্ছে।
janrjan জোহানসেন


যেহেতু আপনি সবে যুক্ত করেছেন 2^31+2, আমি পুনরাবৃত্তি করব যে আমি একটি বিজোড় সংখ্যা বলেছি । প্রশ্ন উত্তর শুধুমাত্র ব্যর্থ যখন উভয় সর্বোচ্চ এবং সর্বনিম্ন বিট 1
janrjan জোহানসেন

আমি একটা বোকা. ধন্যবাদ. এটি স্থির করবে
সঙ্গীতজ্ঞ 523

1
@ musicman523 আমি সবেমাত্র সক্রিয় প্রশ্নগুলি ব্রাউজ করছি এবং এটি দেখেছি। এবং লক্ষ্য করেছেন যে আপনি এখনও অনুরোধ করা পরীক্ষার কেসগুলি যোগ করেন নি।
ড্রাকো

উত্তর:


29

x86-64 বিধানসভা, 5 4 বাইট

   0:   97                      xchg   %eax,%edi
   1:   d1 c0                   rol    %eax
   3:   c3                      retq   

সি কলিং কনভেনশন ব্যবহার করে এমন একটি ফাংশন যা তার আর্গুমেন্টটিকে 1 টি বিট দিয়ে আবর্তিত করে।


দাম্মিত - আমি ঠিক এটি পোস্ট করতে চলেছি - ভাল কাজ করেছেন :)
ডিজিটাল ট্রমা

12
সমাবেশ জেলিকে মারধর করেছে: ও
উরিল

এটি কি 2 দ্বারা গুণ হয় না? যদি তা হয় তবে আমার 2 বাইট পাইথ উত্তরটি সম্ভবত জিতবে
নোনিআইহির

@NoOneIsHere না, এই 2. গুণ 2 দ্বারা পাঠায় প্রয়োজনীয় সীমার বাইরে ইনপুট অর্ধেক, এবং যদি আপনি বাম ওভারফ্লো বিট উপেক্ষা, আপনি Hamming ওজন 1. কমে গেছে থাকেন গুণ নয় এই হল , bitwise ঘূর্ণন , যা ডান থেকে ওভারফ্লোটি কিছুটা ফিরে এনে দেয়।
অ্যান্ডারস ক্যাসরগ

1
@DigitalTrauma জিসিসি 4.9.0 এবং পরে যথেষ্ট স্মার্ট কম্পাইল করতে চলেছেন n << 1 | n >> 31মধ্যে rolপরিবর্তে ror(ক বাইট সঞ্চয় নয়)।
অ্যান্ডারস ক্যাসরগ



6

জেলি , 10 8 বাইট

‘&~^^N&$

সর্বনিম্ন উল্লেখযোগ্য সেট এবং আনসেট বিটটি অদলবদল করে।

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

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

‘&~^^N&$  Main link. Argument: n

‘         Increment; yield n+1, toggling all trailing set bits and the rightmost
          unset bit.
  ~       Bitwise NOT; yield ~n, toggling ALL bits of n.
 &        Bitwise AND; yield (n+1)&~n, keeping the only bit that differs in n+1 and
          ~n, i.e., the rightmost unset bit.
   ^      Perform bitwise XOR with n, toggling the rightmost unset bit.
       $  Combine the two links to the left into a monadic chain.
     N        Negate; yield -n. Since ~n = -(n+1) in 2's complement, -n = ~n+1.
      &       Take the bitwise AND of n and -n. Since -n = ~n + 1 and n = ~~n, the
              same reasoning that applied for (n+1)&~n applies to -n&n; it yields
              the rightmost unset bit of ~n, i.e., the rightmost set bit of n.
    ^      XOR the result to the left with the result to the right, toggling the
           rightmost set bit of the left one.

5

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

প্রথম বিট স্থানান্তর (0 → 1 বা 1 → 0) অনুসন্ধান করে এটিকে উল্টে দেয়।

f=(n,k=3)=>(n&k)%k?n^k:f(n,k*2)

ডেমো

বিট ঘূর্ণন, 14 বাইট

অনেক খাটো তবে মজা কম।

n=>n>>>31|n<<1

ডেমো


জাভাস্ক্রিপ্ট বিটওয়াইজ অপারেটররা স্বাক্ষরবিহীন পরিবর্তে 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা দেয়। উদাহরণস্বরূপ, f(2147483647)হয় -1073741825এবং (n=>n>>>31|n<<1)(2147483647)হয় -2
অ্যান্ডারস কাসরগ

2
32 বিট এর বেশি আর না থাকলে এটি ঠিক আছে fine
musicman523

আপনি কি প্রথমটির জন্য একটি ব্যাখ্যা যুক্ত করতে পারেন? আমি জাভাস্ক্রিপ্ট শিখতে চাইছি, এবং ক্ষতির মধ্যে পড়ে আছি যে আপনি কীভাবে কে কে অপরিজ্ঞাত করে কল করছেন এবং এখনও যুক্তিসঙ্গত উত্তর পাচ্ছেন!
musicman523

2
@ musicman523 এখানে সম্পর্কিত টিপ রয়েছে। মূলত, kশুরুতে সেট করা হয় undefinedএবং আমরা ~undefinedসমান যে সত্যটি সুবিধা গ্রহণ করি -1
আর্নৌল্ড

@ মিউজিকম্যান ৫৩৩ (আপডেট সংস্করণে আমি এই টিপটি ব্যবহার করছি না But তবে আসল উত্তর সম্পর্কে আপনার কাছে অন্য প্রশ্ন রয়েছে কিনা তা জিজ্ঞাসা করতে দ্বিধা করবেন না))
আর্নাউল্ড

4

ব্রেন-ফ্লাক , 78 বাইট

(([()()])[[]()]){((){}<({({})({}())}{})>)}{}([(({}(({}){})())<>)]){({}())<>}{}

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

N <2 ^ 31, এবং 2n + 1-2 ^ 32 অন্যথায় 2n প্রদান করে। দুর্ভাগ্যক্রমে, যেহেতু ব্রেন-ফ্ল্যাকের কোনও সংখ্যার সাইন নির্ধারণের কোনও দ্রুত উপায় নেই, তাই টিআইও-তে প্রোগ্রামের সময় শেষ হয়ে যায় যদি ইনপুটটি প্রায় 500000 এর বেশি হয়ে 2 ^ 31 থেকে আলাদা হয়।

ব্যাখ্যা

প্রথমে, স্ট্যাকের উপর -2 ^ 32 টিপুন:

(([()()])[[]()])                               push (initial value) -2 and (iterator) -5
                {((){}<                >)}     do 5 times:
                       ({({})({}())}{})        replace the current (negative) value with the negation of its square
                                            {}   pop the (now zero) iterator

তারপরে, পছন্দসই আউটপুট গণনা করুন:

      (({}){})                        replace n by 2n on left stack
   ({}        ())                     push 2n+1-2^32 on left stack
  (              <>)                  push again on right stack
([                  ])                push its negation on right stack
                      {({}())<>}      add 1 to the top value of each stack until one of them reaches zero
                                {}    pop this zero, and implicitly print the number below it on the stack

3

ডিসি, 10

?2~z31^*+p

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

এটি 32 বিট রাইট-রোটেটের একটি গাণিতিক বাস্তবায়ন:

?           # input
 2~         # divmod by 2 - quotient pushed first, then the remainder
   z        # z pushes the size of the stack which will be 2 (quotient and remainder) ...
    31^     #  ... and take that 2 to the 31st power
       *    # multiply the remainder by 2^31
        +   # add
         p  # output

3

জাভা 8, 117 17 29 বাইট

n->n*2%~-(long)Math.pow(2,32)

+12 বাইট এ পরিবর্তন intকরে long, কারণ intএর সর্বোচ্চ আকার2³¹-1

@ আন্ডারক্যাসার্গের আশ্চর্যজনক পাইথন উত্তরের একটি বন্দর তৈরি করে 100 89 বাইট সংরক্ষণ করা হয়েছে

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

আউটপুট:

46 (101110):                                     92 (1011100)
12 (1100):                                       24 (11000)
1 (1):                                           2 (10)
3 (11):                                          6 (110)
10000 (10011100010000):                          20000 (100111000100000)
987654 (11110001001000000110):                   1975308 (111100010010000001100)
2147483648 (10000000000000000000000000000000):   1 (1)
4294967294 (11111111111111111111111111111110):   4294967293 (11111111111111111111111111111101)

পুরানো উত্তর ( 117 118 বাইট):

n->{long r=0;for(;!n.toBinaryString(++r).replace("0","").equals(n.toBinaryString(n).replace("0",""))|r==n;);return r;}

পরিবর্তন করে + 1 বাইট intথেকে long, কারণ intএর সর্বোচ্চ আকার2³¹-1

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

আউটপুট:

46 (101110):                                     15 (1111)
12 (1100):                                       3 (11)
1 (1):                                           2 (10)
3 (11):                                          5 (101)
10000 (10011100010000):                          31 (11111)
987654 (11110001001000000110):                   255 (11111111)
2147483648 (10000000000000000000000000000000):   1 (1)

2

গণিত, 29 বাইট

Mod@##+Quotient@##&[2#,2^32]&

ওল্ফ্রাম স্যান্ডবক্সে এটি ব্যবহার করে দেখুন

বুনিয়াদিভাবে বাম দিকে ঘোরান: প্রথমে 2 দিয়ে গুণ করুন, যা সম্ভবত সংখ্যাটি সীমা ছাড়িয়ে দেয়, তারপরে সীমার বাইরে থাকা অঙ্কটি কেটে দেয় এবং এর সাথে Mod[...,2^32]ডানদিকে ফিরে যুক্ত করে +Quotient[...,2^32]

(ম্যাথামেটিকায় এমন একক বিল্টিন রয়েছে যা মডিউলাসকে এবং একই সাথে ভাগফলকে দেয়, তবে এটি QuotientRemainder, যা কিছুটা গল্ফিং প্রতিবন্ধকতা ...)


মোড 2 ^ 32-1? (আরও 4 জন যেতে হবে)
ব্যবহারকারী 202729

2

এপিএল, 12 বাইট

(2⊥32⍴1)|2×⊢

কিভাবে?

           ⊢  ⍝ monadic argument
         2×   ⍝ shift left (×2)
(2⊥32⍴1)|     ⍝ modulo 2^32 - 1


1

আর, 42 63 বাইট

function(x){s=x;while(s==x){sample(binaryLogic::as.binary(x))}}

বিটগুলি প্রায় এলোমেলোভাবে বদল করে, তবে এটি সুযোগটি একই সংখ্যায় ফিরে আসেনি তা নিশ্চিত করে পরীক্ষা করে।


1

হোয়াইটস্পেস , 81 80 বাইট

(1 বাইট সংরক্ষিত @ অর্জানকে ধন্যবাদ জোহানসেন আমাকে স্মরণ করিয়ে দিচ্ছে যে ডুপ ধাক্কা 0 এর চেয়ে কম)

   
 
 	
					 
    	 
	 		
	 
   	        
 
 	  
 
 	  
	   
  
   	 
	 	 	
 	

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

মূলত পূর্ণসংখ্যার গাণিতিক ব্যবহার করে একটি চক্রাকার ডান বিটশিফ্ট প্রয়োগ করে। হোয়াইটস্পেসে একটি বড় ধ্রুবককে ধাক্কা দেওয়া ব্যয়বহুল তাই আমরা 2 ^ 8 চাপ দিয়ে এবং এটি দু'বার স্কোয়ার করে কিছু বাইট সংরক্ষণ করি। (1 বাইট ওভার সঞ্চয় (2 ^ 16) ^ 2 এবং 10 বাইট সরাসরি 2 ^ 32 ধাক্কা দেওয়ার পরে))

ব্যাখ্যা

sssn  ; push 0
sns   ; dup
tntt  ; getnum from stdio
ttt   ; retrieve n from heap and put it on the stack
sns   ; dup
ssstsn ; push 2
tstt  ; mod - check if divisible by 2 (i.e. even)
ntsn  ; jez "even"
ssstssssssssn ; push 2^8
sns   ; dup
tssn  ; mul - square it to get 2^16
sns   ; dup
tssn  ; mul - square it to get 2^32
tsss  ; add 2^32 so MSB ends up set after the divide
nssn  ; even:
ssstsn ; push 2
tsts  ; divide by 2, aka shift right
tnst  ; putnum - display result

1
আমি মনে করি আপনি আগে একটি আদেশ push 0দিয়ে দ্বিতীয়টি প্রতিস্থাপন করতে পারেন dup
janrjan জোহানসেন

আপনি ঠিক বলেছেন, আমি আমার ট্রান্সপ্লায়ারে শর্টকাট বাক্য গঠনটি শেষ করেছি তাই আমি এটি খুব বেশি ব্যবহার করছি ...
এফফ্যাথ

0

পাইথন 2.7, 89 বাইট

সম্পূর্ণ প্রোগ্রাম:

from random import*;a=list(bin(input())[2:].zfill(32));shuffle(a);print int(''.join(a),2)

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

পরামর্শ স্বাগত! :)


এটি বৈধ নয় কারণ এটি সুযোগে আবার একই সংখ্যাটি ফেরত দিতে পারে।
janrjan জোহানসেন





আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.