Advent of code 2015 solutions https://adventofcode.com/2015/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.py 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/python
  2. import re
  3. wires = {}
  4. functions = {
  5. 'AND': lambda left, right: lambda: left() & right(),
  6. 'OR': lambda left, right: lambda: left() | right(),
  7. 'LSHIFT': lambda left, right: lambda: left() << right(),
  8. 'RSHIFT': lambda left, right: lambda: left() >> right(),
  9. 'NOT': lambda value: lambda: ~ value()
  10. }
  11. def get_wire(name):
  12. if (name.isdigit()):
  13. return int(name)
  14. if hasattr(wires[name], '__call__'):
  15. wires[name] = wires[name]()
  16. return wires[name]
  17. def handle_input(text):
  18. binary_match = re.match('^(.*?) (AND|OR|LSHIFT|RSHIFT) (.*?)$', text)
  19. if binary_match:
  20. (left, operator, right) = binary_match.group(1, 2, 3)
  21. return functions[operator](lambda: get_wire(left), lambda: get_wire(right))
  22. unary_match = re.match('^(NOT) (.*?)$', text)
  23. if unary_match:
  24. (operator, value) = unary_match.group(1, 2)
  25. return functions[operator](lambda: get_wire(value))
  26. return lambda: get_wire(text)
  27. def initialise():
  28. with open('7.txt', 'r') as file:
  29. input = file.read()
  30. for line in input.splitlines():
  31. (input, output) = line.split(' -> ')
  32. wires[output] = handle_input(input)
  33. initialise()
  34. part_1 = wires['a']()
  35. print('Part 1: %s' % part_1)
  36. initialise()
  37. wires['b'] = part_1
  38. print('Part 2: %s' % wires['a']())