15_asciihash.py 973 B

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/env python3
  2. import sys
  3. def asciihash(s):
  4. h = 0
  5. for char in s:
  6. h = (h + ord(char)) * 17 % 256
  7. return h
  8. def focus(steps):
  9. boxes = [({}, []) for _ in range(256)]
  10. for step in steps:
  11. if step.endswith('-'):
  12. label = step[:-1]
  13. index, powers = boxes[asciihash(label)]
  14. if label in index:
  15. powers[index.pop(label)] = None
  16. else:
  17. label, power = step.split('=')
  18. index, powers = boxes[asciihash(label)]
  19. if label in index:
  20. powers[index[label]] = int(power)
  21. else:
  22. index[label] = len(powers)
  23. powers.append(int(power))
  24. return sum(sum((b + 1) * (i + 1) * power
  25. for i, power in enumerate(filter(None, powers)))
  26. for b, (_, powers) in enumerate(boxes))
  27. steps = next(sys.stdin).rstrip().split(',')
  28. print(sum(map(asciihash, steps)))
  29. print(focus(steps))