Binary Convolution


15

บิดไบนารีอธิบายโดยตัวเลขและถูกนำไปใช้เป็นจำนวนมากM Nสำหรับแต่ละบิตในการแทนค่าไบนารี่ของMถ้าบิตถูกตั้งค่า ( 1) บิตที่สอดคล้องกันในเอาต์พุตจะถูกกำหนดโดย XOR โดยสองบิตที่อยู่ติดกับบิตที่สอดคล้องกันในN(ล้อมรอบเมื่อจำเป็น) หากบิตไม่ได้ตั้งค่า ( 0) Nแล้วบิตที่สอดคล้องกันในการส่งออกจะได้รับจากบิตที่สอดคล้องกันใน

ตัวอย่างการทำงาน (ที่มีค่า 8 บิต):

  1. อนุญาตN = 150, M = 59. respresentations ไบนารีของพวกเขา (ตามลำดับ) และ1001011000111011
  2. ขึ้นอยู่กับการMเป็นตัวแทนไบนารีของบิต 0, 1, 3, 4 และ 5 มีการ convolved
    1. ผลการบิต 0 จะได้รับโดย XORing บิต 1 และ 7 (เนื่องจากเราห่อรอบ) 1ยอม
    2. ผลสำหรับบิต 1 จะได้รับโดย XORing บิต 0 และ 2 0ให้ผลผลิต
    3. ผลสำหรับบิตที่ 2 จะได้รับจากบิตเดิม 2 1ยอม
    4. ผลสำหรับบิต 3 จะได้รับโดย XORing บิต 2 และ 4 0ยอม
    5. ผลสำหรับบิต 4 จะได้รับโดย XORing บิต 3 และ 5 0ยอม
    6. ผลสำหรับบิต 5 จะได้รับโดย XORing บิต 4 และ 6 1ยอม
    7. ผลบิตที่ 6 และ 7 จะได้รับจากบิตเดิมที่ 6 และ 7 ผลผลิตและ01
  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

ฉันคิดว่าชื่อผิด มันควรจะเป็น "Binary Revolution" :)
RudolfJelin

คำตอบ:



9

Python 2, 35 ไบต์

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

ดูเหมือนจะใช้งานn=255ไม่ได้ใช่ไหม
Neil

@ นีลจับดี ฉันไม่เห็นวิธีที่ดีรอบ ๆ ตัวด้วย mod ขยับแทนไบต์พิเศษ
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 ไบต์) เพื่อให้ฟังก์ชันทำงานกับประเภทข้อมูลอินทิกรัลที่ไม่ได้ลงนามใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.