16_dragoncurve.py 758 B

12345678910111213141516171819202122232425
  1. #!/usr/bin/env python3
  2. def fill(seed, target):
  3. curve = [False] * target
  4. for i, bit in enumerate(seed):
  5. curve[i] = bit == '1'
  6. length = len(seed)
  7. while length < target:
  8. for i in range(max(0, length * 2 + 1 - target), length):
  9. curve[length * 2 - i] = not curve[i]
  10. length = length * 2 + 1
  11. return curve
  12. def checksum(curve):
  13. length = len(curve)
  14. while length % 2 == 0:
  15. for i in range(length // 2):
  16. curve[i] = curve[i * 2] == curve[i * 2 + 1]
  17. length >>= 1
  18. return curve[:length]
  19. def joinbits(curve):
  20. return ''.join('01'[bit] for bit in curve)
  21. print(joinbits(checksum(fill('01110110101001000', 272))))
  22. print(joinbits(checksum(fill('01110110101001000', 35651584))))