Advent of Code 2016 solutions https://adventofcode.com/2016/
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

25.py 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/python3
  2. """Solution for day 25 of Advent of Code 2016.
  3. This is a copy of Day 23's solution, with an 'out' instruction added.
  4. Manual testing showed the output repeats regularly, so we just run the program until there are 20 bits output.
  5. TODO: Add a common class for handling the assembly code, as it's now repeated in 3 places.
  6. """
  7. import itertools
  8. def value(registers, x):
  9. try:
  10. return int(x)
  11. except ValueError:
  12. return registers[x]
  13. def cpy(registers, src, dst):
  14. registers[dst] = value(registers, src)
  15. def inc(registers, reg):
  16. registers[reg] += 1
  17. def dec(registers, reg):
  18. registers[reg] -= 1
  19. def jnz(registers, val, tar):
  20. registers['pc'] += 0 if value(registers, val) == 0 else value(registers, tar) - 1
  21. def tgl(registers, ins):
  22. mappings = {inc: dec, dec: inc, tgl: inc, jnz: cpy, cpy: jnz}
  23. target = registers['pc'] + value(registers, ins)
  24. registers['in'][target] = (mappings[registers['in'][target][0]], registers['in'][target][1])
  25. def out(registers, val):
  26. registers['out'].append(value(registers, val))
  27. def try_multiply(registers):
  28. try:
  29. pc = registers['pc']
  30. chunk = registers['in'][pc:pc+6]
  31. instr, args = map(list, zip(*chunk))
  32. if instr == [cpy, inc, dec, jnz, dec, jnz] \
  33. and args[0][1] == args[2][0] == args[3][0] \
  34. and args[4][0] == args[5][0] \
  35. and args[1][0] != args[0][1] != args[4][0] != args[0][0] \
  36. and args[3][1] == '-2' and args[5][1] == '-5':
  37. registers[args[1][0]] += value(registers, args[0][0]) * value(registers, args[4][0])
  38. registers[args[2][0]] = 0
  39. registers[args[4][0]] = 0
  40. registers['pc'] += 5
  41. return True
  42. except:
  43. pass
  44. return False
  45. def step(registers):
  46. if not try_multiply(registers):
  47. try:
  48. registers['in'][registers['pc']][0](registers, *registers['in'][registers['pc']][1])
  49. except:
  50. pass
  51. def run(values):
  52. registers = values
  53. registers['pc'] = 0
  54. registers['out'] = []
  55. registers['in'] = instr.copy()
  56. while registers['pc'] < len(instr) and len(registers['out']) < 20:
  57. step(registers)
  58. registers['pc'] += 1
  59. return registers['out']
  60. with open('data/25.txt', 'r') as file:
  61. instr = map(str.split, map(str.strip, file.readlines()))
  62. instr = [(globals()[i[0]], i[1:]) for i in instr]
  63. for a in itertools.count():
  64. if run({'a': a, 'b': 0, 'c': 0, 'd': 0}) == [0, 1] * 10:
  65. print('Part one: %s' % a)
  66. break