Kết luận nhị phân


15

Một tích chập nhị phân được mô tả bởi một số Mvà được áp dụng cho một số N. Đối với mỗi bit trong biểu diễn nhị phân của M, nếu bit được đặt ( 1), bit tương ứng trong đầu ra được đưa ra bằng cách XOR hai bit liền kề với bit tương ứng trong N(bao quanh khi cần thiết). Nếu bit không được đặt ( 0), thì bit tương ứng trong đầu ra được cho bởi bit tương ứng trong N.

Một ví dụ hoạt động (với các giá trị 8 bit):

  1. Hãy N = 150, M = 59. Giải thích nhị phân của họ là (tương ứng) 1001011000111011.
  2. Dựa trên Mbiểu diễn nhị phân, các bit 0, 1, 3, 4 và 5 được tích hợp.
    1. Kết quả cho bit 0 được đưa ra bởi XORing bit 1 và 7 (vì chúng ta quấn quanh), mang lại kết quả 1.
    2. Kết quả cho bit 1 được cho bởi các bit XORing 0 và 2, cho năng suất 0.
    3. Kết quả cho bit 2 được cho bởi bit 2 ban đầu, cho năng suất 1.
    4. Kết quả cho bit 3 được đưa ra bởi XORing bit 2 và 4, cho năng suất 0.
    5. Kết quả cho bit 4 được đưa ra bởi XORing bit 3 và 5, cho năng suất 0.
    6. Kết quả cho bit 5 được cho bởi các bit XORing 4 và 6, cho năng suất 1.
    7. Các kết quả cho bit 6 và 7 được cho bởi các bit 6 và 7 ban đầu, cho năng suất 01.
  3. Do đó, đầu ra là 10100110( 166).

Các thách thức

Với NM, đầu ra là kết quả của việc thực hiện chập nhị phân mô tả bởi Mtheo N. Đầu vào và đầu ra có thể ở bất kỳ định dạng thuận tiện, nhất quán và rõ ràng. NMsẽ luôn ở trong phạm vi (đã bao gồm) [0, 255](số nguyên không dấu 8 bit) và các biểu diễn nhị phân của chúng phải được đệm thành 8 bit để thực hiện phép chập nhị phân.

Các trường hợp thử nghiệm

150 59 -> 166
242 209 -> 178
1 17 -> 0
189 139 -> 181
215 104 -> 215
79 214 -> 25
190 207 -> 50
61 139 -> 180
140 110 -> 206
252 115 -> 143
83 76 -> 31
244 25 -> 245
24 124 -> 60
180 41 -> 181
105 239 -> 102
215 125 -> 198
49 183 -> 178
183 158 -> 181
158 55 -> 186
215 117 -> 198
255 12 -> 243

Tôi nghĩ rằng tiêu đề là sai. nó phải là "Cuộc cách mạng nhị phân" :)
RudolfJelin

Câu trả lời:


4

JavaScript (ES6), 31 byte

(n,m)=>n^m&(n^(n*=257)>>1^n>>7)

9

Python 2, 35 byte

lambda m,n:n^m&(n^n*257/2^n*2^n>>7)

Có vẻ như không làm việc cho n=255?
Neil

@Neil Bắt tốt. Tôi không thấy một cách hay xung quanh đó với mod, thay vào đó là một byte bổ sung.
xnor

2

J, 34 byte

2#.[:({"_1],._1&|.~:1&|.)/(8#2)#:]

Phương pháp tiếp cận thẳng tiến áp dụng quy trình được xác định trong thử thách. Đưa đầu vào như một mảng [n, m].

Hình thức biểu tượng mặt cười bảy, [:, :(, :1, (8, 8#, #:, và :].

Sử dụng

   f =: 2#.[:({"_1],._1&|.~:1&|.)/(8#2)#:]
   f 150 59
171
   f 59 150
166
   f 209 242
178
   f 17 1
0
   f 139 189
181

Một cái gì đó phải sai nếu J điểm giống như Python: D
PurkkaKoodari

2

mã máy x64, 17 byte

88CD88C8D0C9D0C530E930C120D130C8C3

Đã tháo rời:

0:  88 cd                   mov    ch,cl
2:  88 c8                   mov    al,cl
4:  d0 c9                   ror    cl,1
6:  d0 c5                   rol    ch,1
8:  30 e9                   xor    cl,ch
a:  30 c1                   xor    cl,al
c:  20 d1                   and    cl,dl
e:  30 c8                   xor    al,cl
10: c3                      ret

Thích hợp cho quy ước gọi Win64 (đối số trong RCx, rdx).


1

Haskell, 66 byte

import Data.Bits
n%m=n.&.(255-m)+(rotate n 1`xor`rotate n(-1)).&.m

Hoạt động như dự định khi được gọi với Word8dữ liệu. Thay thế (255-m)bằng complement m(+5 byte) để làm cho hàm hoạt động với bất kỳ kiểu dữ liệu tích phân không dấu nào.

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.