Konvolusi Biner

15

Konvolusi biner dijelaskan oleh angka M, dan diterapkan pada angka N. Untuk setiap bit dalam representasi biner M, jika bit diatur ( 1), bit yang sesuai dalam output diberikan oleh XORing dua bit yang berdekatan dengan bit yang sesuai N(membungkus jika perlu). Jika bit tidak disetel ( 0), bit yang sesuai dalam output diberikan oleh bit yang sesuai di N.

Contoh yang dikerjakan (dengan nilai 8-bit):

  1. Mari N = 150, M = 59. Representasi biner mereka adalah (masing-masing) 10010110dan 00111011.
  2. Berdasarkan Mrepresentasi biner, bit 0, 1, 3, 4, dan 5 berbelit-belit.
    1. Hasil untuk bit 0 diberikan oleh XORing bit 1 dan 7 (karena kami membungkusnya), menghasilkan 1.
    2. Hasil untuk bit 1 diberikan oleh XORing bit 0 dan 2, menghasilkan 0.
    3. Hasil untuk bit 2 diberikan oleh bit asli 2, menghasilkan 1.
    4. Hasil untuk bit 3 diberikan oleh XORing bit 2 dan 4, menghasilkan 0.
    5. Hasil untuk bit 4 diberikan oleh XORing bit 3 dan 5, menghasilkan 0.
    6. Hasil untuk bit 5 diberikan oleh XORing bit 4 dan 6, menghasilkan 1.
    7. Hasil untuk bit 6 dan 7 diberikan oleh bit asli 6 dan 7, menghasilkan 0dan 1.
  3. Outputnya demikian 10100110( 166).

Tantangan

Diberikan Ndan M, hasilkan output dari melakukan konvolusi biner yang dijelaskan oleh Mpada N. Input dan output mungkin dalam format yang nyaman, konsisten, dan tidak ambigu. Ndan Makan selalu berada dalam kisaran (inklusif) [0, 255](bilangan bulat 8-bit tidak ditandatangani), dan representasi binernya harus diisi hingga 8 bit untuk melakukan konvolusi biner.

Uji Kasus

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
sumber
Saya pikir judulnya salah. seharusnya "Revolusi Biner" :)
RudolfJelin

Jawaban:

4

JavaScript (ES6), 31 byte

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

Python 2, 35 byte

lambda m,n:n^m&(n^n*257/2^n*2^n>>7)
Tidak
sumber
Sepertinya tidak berhasil n=255?
Neil
@Neil Tangkapan yang bagus. Saya tidak melihat cara yang bagus untuk itu dengan mod, alih-alih menggeser byte tambahan.
xnor
2

J, 34 byte

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

Pendekatan langsung yang menerapkan proses yang didefinisikan dalam tantangan. Mengambil input sebagai array [n, m].

Bentuk tujuh smiley, [:, :(, :1, (8, 8#, #:, dan :].

Pemakaian

   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
mil
sumber
Sesuatu pasti salah jika skor J sama dengan Python: D
PurkkaKoodari
2

kode mesin x64, 17 byte

88CD88C8D0C9D0C530E930C120D130C8C3

Dibongkar:

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

Cocok untuk konvensi pemanggilan Win64 (argumen dalam rcx, rdx).

Harold
sumber
1

Haskell, 66 byte

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

Bekerja sebagaimana dimaksud saat dipanggil dengan Word8data. Ganti (255-m)dengan complement m(+5 byte) untuk membuat fungsi berfungsi dengan tipe data integral yang tidak ditandatangani.

Angs
sumber