Konwolucja binarna

15

Splot binarny jest opisany liczbą Mi jest stosowany do liczby N. Dla każdego bitu w reprezentacji binarnej M, jeśli bit jest ustawiony ( 1), odpowiedni bit na wyjściu jest podawany przez XORing dwóch bitów sąsiadujących z odpowiednim bitem w N(owijanie w razie potrzeby). Jeśli bit nie jest ustawiony ( 0), odpowiedni bit na wyjściu jest podawany przez odpowiedni bit w N.

Sprawdzony przykład (z wartościami 8-bitowymi):

  1. Pozwól N = 150, M = 59. Ich reprezentacje binarne to (odpowiednio) 10010110i 00111011.
  2. W oparciu o Mreprezentację binarną, bity 0, 1, 3, 4 i 5 są splecione.
    1. Wynik dla bitu 0 jest podawany przez XORing bity 1 i 7 (ponieważ się owijamy), dając 1.
    2. Wynik dla bitu 1 podawany jest przez bity XORing 0 i 2, dając 0.
    3. Wynik dla bitu 2 jest podawany przez oryginalny bit 2, dając 1.
    4. Wynik dla bitu 3 podawany jest przez bity XORing 2 i 4, dając 0.
    5. Wynik dla bitu 4 jest podawany przez bity 3 i 5 XORing, dając 0.
    6. Wynik dla bitu 5 jest podawany przez bity 4 i 6 XORing, dając 1.
    7. Wyniki dla bitów 6 i 7 podano w oryginalnych bitach 6 i 7, uzyskując 0i 1.
  3. Dane wyjściowe to zatem 10100110( 166).

Wyzwanie

Biorąc pod uwagę, Na Mwyjście wynikiem wykonywania binarny splot opisaną przez Mpo N. Dane wejściowe i wyjściowe mogą mieć dowolny dogodny, spójny i jednoznaczny format. Ni Mzawsze będzie w zakresie (włącznie)[0, 255] (8-bitowe liczby całkowite bez znaku), a ich reprezentacje binarne powinny zostać uzupełnione do 8 bitów w celu wykonania splotu binarnego.

Przypadki testowe

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
Mego
źródło
Myślę, że tytuł jest zły. powinna to być „rewolucja binarna” :)
RudolfJelin

Odpowiedzi:

4

JavaScript (ES6), 31 bajtów

(n,m)=>n^m&(n^(n*=257)>>1^n>>7)
Neil
źródło
9

Python 2, 35 bajtów

lambda m,n:n^m&(n^n*257/2^n*2^n>>7)
xnor
źródło
Wydaje się, że nie działa n=255?
Neil,
@Neil Good catch. Nie widzę dobrego sposobu na obejście tego z modem, zamiast tego przesunięcie o dodatkowy bajt.
xnor
2

J, 34 bajty

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

Proste podejście, które stosuje proces zdefiniowany w wyzwaniu. Pobiera dane wejściowe jako tablicę [n, m].

Formy siedem emotikony, [:, :(, :1, (8, 8#, #:, i :].

Stosowanie

   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
mile
źródło
Coś musi być nie tak, jeśli J osiąga taki sam wynik jak Python: D
PurkkaKoodari
2

kod maszynowy x64, 17 bajtów

88CD88C8D0C9D0C530E930C120D130C8C3

Zdemontowano:

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

Nadaje się do konwencji wywoływania Win64 (argumenty w rcx, rdx).

Harold
źródło
1

Haskell, 66 bajtów

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

Działa zgodnie z przeznaczeniem, gdy jest wywoływany z Word8danymi. Wymienić (255-m)z complement m(+ 5 bajtów) do pracy z każdej funkcji unsigned integralną typu danych.

Angs
źródło