Advertisement
JoelSjogren

chess-info

Aug 30th, 2014
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.37 KB | None | 0 0
  1. #!/usr/bin/python3
  2. class Coder:
  3.     def __init__(self, log2_squarec):
  4.         self.log2_squarec = log2_squarec
  5.         self.squarec = 2**log2_squarec
  6.         self.masks = self._make_masks()
  7.     def _make_masks(self):
  8.         result = []
  9.         for i in reversed(range(self.log2_squarec)):
  10.             result.append(2**2**i * (2**self.squarec-1) // (2**2**i+1))
  11.         return result
  12.     def encode(self, board, value):
  13.         assert 0 <= value < self.squarec
  14.         yuck = self.decode(board)
  15.         spice = yuck ^ value
  16.         return board ^ (2 ** spice)
  17.     def decode(self, board):
  18.         cooked = 0
  19.         for i in self.masks:
  20.             cooked *= 2
  21.             cooked += pop(board & i) % 2
  22.         return cooked
  23. def pop(x):
  24.     count = 0
  25.     while x:
  26.         if x % 2 == 1:
  27.             count += 1
  28.         x //= 2
  29.     return count
  30. def assert_working(coder):
  31.     from random import choice, randrange
  32.     original = randrange(coder.squarec)
  33.     board = int(''.join(choice(['0', '1']) for _ in range(coder.squarec)), 2)
  34.     encoded = coder.encode(board, original)
  35.     decoded = coder.decode(encoded)
  36.     assert pop(encoded ^ board) == 1
  37.     assert original == decoded
  38. def test(coder, timec=1000):    
  39.     for i in range(timec):
  40.         assert_working(coder)
  41.     print(timec, "random tests completed successfully!")
  42. coder = Coder(log2_squarec=6)
  43. test(coder)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement