Двоичная свертка


15

Бинарная свертка описывается числом Mи применяется к числу N. Для каждого бита в двоичном представлении M, если бит установлен ( 1), соответствующий бит в выводе дается посредством XORing двух битов, смежных с соответствующим битом в N(при необходимости оборачивая). Если бит не установлен ( 0), то соответствующий бит на выходе задается соответствующим битом в N.

Работающий пример (с 8-битными значениями):

  1. Пусть N = 150, M = 59. Их двоичные представления представлены (соответственно) 10010110и 00111011.
  2. Основываясь на Mдвоичном представлении, биты 0, 1, 3, 4 и 5 свернуты.
    1. Результат для бита 0 дается XORing битами 1 и 7 (так как мы оборачиваемся), приводя к результату 1.
    2. Результат для бита 1 задается битами XOR 0 и 2, что приводит к результату 0.
    3. Результат для бита 2 задается исходным битом 2, уступая 1.
    4. Результат для бита 3 задается битами XORing 2 и 4, что дает результат 0.
    5. Результат для бита 4 задается битами XOR 3 и 5, что приводит к результату 0.
    6. Результат для бита 5 задается битами XOR 4 и 6, что приводит к результату 1.
    7. Результаты для битов 6 и 7 задаются исходными битами 6 и 7, уступая 0и 1.
  3. Таким образом, вывод 10100110( 166).

Соревнование

Учитывая Nи M, выведите результат выполнения двоичной свертки, описанной Mпри N. Ввод и вывод могут быть в любом удобном, согласованном и однозначном формате. Nи Mвсегда будет в (включающем) диапазоне [0, 255](8-разрядные целые числа без знака), и их двоичные представления должны быть дополнены до 8 битов для выполнения двоичной свертки.

Тестовые случаи

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

Я думаю, что название неверно. это должна быть «Бинарная революция» :)
RudolfJelin

Ответы:



9

Python 2, 35 байт

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

Кажется, не работает для n=255?
Нил

@Neil Хороший улов. Я не вижу хорошего способа обойти это с модом, вместо этого меняя дополнительный байт.
xnor

2

J, 34 байта

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

Прямой подход, который применяет процесс, определенный в задаче. Принимает ввод в виде массива [n, m].

Формы семь смайликов, [:, :(, :1, (8, 8#, #:, и :].

использование

   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

Что-то должно быть не так, если J забивает так же, как Python: D
PurkkaKoodari

2

машинный код x64, 17 байт

88CD88C8D0C9D0C530E930C120D130C8C3

Разобрал:

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

Подходит для соглашения о вызовах Win64 (аргументы в rcx, rdx).


1

Haskell, 66 байт

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

Работает как задумано, когда вызывается с Word8данными. Замените (255-m)на complement m(+5 байт), чтобы функция работала с любым беззнаковым целочисленным типом данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.