16_fft.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env python3
  2. import sys
  3. def fft(seq):
  4. end = len(seq)
  5. windows = [(i, 1, i + 1, seq[i]) for i in range(0, end, 2)]
  6. for i in range(end):
  7. newval = 0
  8. multiplier = 1
  9. newwins = []
  10. for start, size, shift, winsum in windows:
  11. newval = newval + winsum * multiplier
  12. multiplier *= -1
  13. if start + shift < end:
  14. winsum -= sum_at(seq, start, shift)
  15. winsum += sum_at(seq, start + size, shift + 1)
  16. newwins.append((start + shift, size + 1, shift, winsum))
  17. seq[i] = abs(newval) % 10
  18. windows = newwins
  19. def join(seq):
  20. return ''.join(map(str, seq))
  21. def message(seq, offset):
  22. seq = list(seq)
  23. for i in range(100):
  24. fft(seq)
  25. return join(seq[offset:offset + 8])
  26. def sum_at(seq, start, size):
  27. return sum(seq[start:start + size])
  28. def fft_at(seq, start):
  29. assert start > len(seq) // 2
  30. size = start + 1
  31. winsum = sum_at(seq, start, size)
  32. for i in range(start, len(seq)):
  33. newdigit = abs(winsum) % 10
  34. winsum += sum_at(seq, start + size, 2) - seq[start]
  35. start += 1
  36. size += 1
  37. seq[i] = newdigit
  38. def message_at(seq, start):
  39. for i in range(100):
  40. fft_at(seq, start)
  41. return join(seq[start:start + 8])
  42. seq = list(map(int, sys.stdin.readline().rstrip()))
  43. print(message(seq, 0))
  44. print(message_at(seq * 10000, int(join(seq[:7]))))