Số khác nhau, cùng trọng lượng


22

Lý lịch

Các Hamming trọng lượng của một số nguyên là số của những người thân trong biểu diễn nhị phân của nó. Đối với thử thách này, số nguyên được biểu diễn với 32 bit và chúng không được ký.

Thử thách

Cho một số nguyên trong khoảng từ 0 đến 2 ^ 32-1 (không bao gồm), xuất ra một số nguyên khác nhau trong cùng phạm vi và cũng có cùng trọng số Hamming.

Ví dụ

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)

Chấm điểm

Đây là , vì vậy giải pháp trong số ít byte nhất trong mỗi ngôn ngữ sẽ thắng.


2
Tôi khuyên bạn nên thêm một số lẻ trong khoảng từ 2 ^ 31 + 1 và 2 ^ 32-3, vì một số câu trả lời không thành công.
Ørjan Johansen


Vì bạn vừa thêm 2^31+2, tôi sẽ nhắc lại rằng tôi đã nói một số lẻ . Các câu trả lời trong câu hỏi chỉ thất bại khi cả bit cao nhất và thấp nhất là 1.
Ørjan Johansen

Tôi là một kẻ ngốc. Cảm ơn bạn. Sẽ khắc phục điều đó
Musicman523

1
@ musicman523 Tôi tình cờ duyệt các câu hỏi đang hoạt động và thấy câu hỏi này. Và nhận thấy rằng bạn vẫn chưa thêm các trường hợp thử nghiệm được yêu cầu.
Draco18

Câu trả lời:


29

lắp ráp x86-64, 5 4 byte

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

Một hàm sử dụng quy ước gọi C mà bit bit xoay đối số của nó còn lại 1 bit.


Chết tiệt - Tôi chuẩn bị đăng chính xác điều này - hoàn thành tốt :)
Chấn thương kỹ thuật số

12
lắp ráp nhịp đập Jelly: o
Uriel

Đây không phải là nhân với 2 sao? Nếu vậy, câu trả lời Pyth 2 byte của tôi có thể thắng
NoOneIsHere

@NoOneIsHere Không, đây không phải nhân cho 2. Phép nhân với 2 gửi một nửa số đầu vào bên ngoài phạm vi được yêu cầu, và nếu bạn bỏ qua các bit tràn trên bên trái, bạn đã giảm trọng lượng Hamming bằng 1. là Đây là một Bitwise xoay , mang bit tràn trở lại từ bên phải.
Anders Kaseorg

1
@DigitalTrauma GCC 4.9.0 và sau đó là đủ thông minh để biên dịch n << 1 | n >> 31thành rolthay vì ror(tiết kiệm một byte).
Anders Kaseorg



6

Thạch , 10 8 byte

‘&~^^N&$

Hoán đổi tập hợp ít quan trọng nhất và bit unset.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

‘&~^^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

JavaScript (ES6), 35 31 byte

Tìm kiếm quá trình chuyển đổi bit đầu tiên (0 → 1 hoặc 1 → 0) và đảo ngược nó.

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

Bản giới thiệu

Xoay bit, 14 byte

Ngắn hơn nhiều nhưng ít vui

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

Bản giới thiệu


Các toán tử bitwise JavaScript cung cấp các số nguyên có chữ ký 32 bit thay vì không dấu. Ví dụ, f(2147483647)-1073741825(n=>n>>>31|n<<1)(2147483647)-2.
Anders Kaseorg

2
Nó tốt miễn là không có quá 32 bit.
sĩ523

Bạn có thể thêm một lời giải thích cho cái đầu tiên? Tôi đang cố gắng học Javascript, và tôi cảm thấy hụt hẫng vì cách bạn gọi f với k không xác định và vẫn nhận được câu trả lời hợp lý!
sĩ523

2
@ musicman523 Đây là mẹo tương ứng. Về cơ bản, kban đầu được đặt thành undefinedvà chúng tôi tận dụng thực tế là ~undefinedbằng nhau -1.
Arnauld

@ musicman523 (Tôi không sử dụng mẹo này nữa trong phiên bản cập nhật. Nhưng đừng ngần ngại hỏi bạn có câu hỏi nào khác về câu trả lời ban đầu không.)
Arnauld

4

Brain-Flak , 78 byte

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

Hãy thử trực tuyến!

Trả về 2n nếu n <2 ^ 31 và 2n + 1-2 ^ 32 nếu không. Thật không may, vì Brain-Flak không có cách nhanh chóng nào để xác định dấu hiệu của một số, chương trình sẽ hết thời gian trên TIO nếu đầu vào khác với 2 ^ 31 hơn khoảng 500000.

Giải trình

Đầu tiên, đẩy -2 ^ 32 lên ngăn xếp:

(([()()])[[]()])                               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

Sau đó, tính toán đầu ra mong muốn:

      (({}){})                        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

đc, 10

?2~z31^*+p

Hãy thử trực tuyến .

Đây là một triển khai số học của xoay phải 32 bit:

?           # 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

Java 8, 117 17 29 byte

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

+12 byte bằng cách thay đổi intthành long, vì intkích thước tối đa là2³¹-1

100 89 byte được lưu bằng cách tạo một cổng câu trả lời Python tuyệt vời của @AndersKaseorg .

Hãy thử nó ở đây.

Đầu ra:

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)

Câu trả lời cũ ( 117 118 byte):

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

+1 byte bằng cách thay đổi intthành long, bởi vì intkích thước tối đa là2³¹-1

Hãy thử nó ở đây.

Đầu ra:

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

Toán học, 29 byte

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

Hãy thử nó tại hộp cát Wolfram

Xoay trái một cách hợp lý: đầu tiên nhân với 2, có thể dịch chuyển số ra khỏi phạm vi, sau đó cắt chữ số ngoài phạm vi với Mod[...,2^32]và thêm nó trở lại bên phải với +Quotient[...,2^32].

(Mathematica có một nội trang duy nhất cung cấp mô-đun và thương số trong một lần, nhưng QuotientRemainderđó là một chút của một điểm chấp golf đánh gôn)


Mod 2 ^ 32-1? (Thêm 4 để đi)
dùng202729

2

APL, 12 byte

(2⊥32⍴1)|2×⊢

Làm sao?

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


1

R, 42 63 byte

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

Xáo trộn các bit xung quanh một cách ngẫu nhiên, nhưng kiểm tra để chắc chắn rằng nó không trả về cùng một số một cách tình cờ.


1

Khoảng trắng , 81 80 byte

(Lưu 1 byte nhờ @ janrjan Johansen nhắc nhở tôi dup là ngắn hơn đẩy 0)

   
 
 	
					 
    	 
	 		
	 
   	        
 
 	  
 
 	  
	   
  
   	 
	 	 	
 	

Hãy thử trực tuyến!

Về cơ bản thực hiện một bithift phải tuần hoàn bằng số học số nguyên. Đẩy một hằng số lớn rất tốn kém trong Khoảng trắng, vì vậy chúng tôi tiết kiệm một số byte bằng cách đẩy 2 ^ 8 và bình phương hai lần. (Lưu 1 byte trên (2 ^ 16) ^ 2 và 10 byte khi đẩy trực tiếp 2 ^ 32.)

Giải trình

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
Tôi nghĩ rằng bạn có thể thay thế thứ hai push 0bằng một duplệnh trước đó.
Ørjan Johansen

Bạn nói đúng, tôi vừa hoàn thành việc thêm cú pháp phím tắt vào bộ chuyển mã của mình vì vậy tôi đã sử dụng nó quá nhiều ...
Ephphatha

0

Python 2.7, 89 byte

Chương trình đầy đủ:

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

Hãy thử trực tuyến!

Đề nghị chào mừng! :)


Điều đó là không hợp lệ bởi vì nó có thể tình cờ trả lại cùng một số.
Ørjan Johansen





Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.