Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- class Coder:
- def __init__(self, log2_squarec):
- self.log2_squarec = log2_squarec
- self.squarec = 2**log2_squarec
- self.masks = self._make_masks()
- def _make_masks(self):
- result = []
- for i in reversed(range(self.log2_squarec)):
- result.append(2**2**i * (2**self.squarec-1) // (2**2**i+1))
- return result
- def encode(self, board, value):
- assert 0 <= value < self.squarec
- yuck = self.decode(board)
- spice = yuck ^ value
- return board ^ (2 ** spice)
- def decode(self, board):
- cooked = 0
- for i in self.masks:
- cooked *= 2
- cooked += pop(board & i) % 2
- return cooked
- def pop(x):
- count = 0
- while x:
- if x % 2 == 1:
- count += 1
- x //= 2
- return count
- def assert_working(coder):
- from random import choice, randrange
- original = randrange(coder.squarec)
- board = int(''.join(choice(['0', '1']) for _ in range(coder.squarec)), 2)
- encoded = coder.encode(board, original)
- decoded = coder.decode(encoded)
- assert pop(encoded ^ board) == 1
- assert original == decoded
- def test(coder, timec=1000):
- for i in range(timec):
- assert_working(coder)
- print(timec, "random tests completed successfully!")
- coder = Coder(log2_squarec=6)
- test(coder)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement