Advertisement
alexandrajay2002

Advent of Code 2024 day 17 part 1

Dec 17th, 2024
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.76 KB | Source Code | 0 0
  1. from sys import argv
  2.  
  3.  
  4. def parse_register(line):
  5.     index = line.find(':') + 2
  6.     end_index = index + 1
  7.     while end_index <= len(line) and line[index:end_index].isdigit():
  8.         end_index += 1
  9.  
  10.     return int(line[index:end_index])
  11.  
  12.  
  13. def parse_program(line):
  14.     index = line.find(':') + 2
  15.     return [int(x) for x in line[index:].split(',')]
  16.  
  17.  
  18. def parse(src):
  19.     registers, program = src.split('\n\n', 1)
  20.  
  21.     registers = (parse_register(line) for line in registers.split('\n')
  22.                  if line != '')
  23.  
  24.     program = parse_program(program)
  25.  
  26.     return registers, program, len(program)
  27.  
  28.  
  29. def get_register(a, b, c, opcode):
  30.     if opcode <= 3:  # assume the opcode is in bounds
  31.         return opcode
  32.     elif opcode == 4:
  33.         return a
  34.     elif opcode == 5:
  35.         return b
  36.     else:
  37.         return c
  38.  
  39.  
  40. def main(registers, program, end):
  41.     a, b, c = registers
  42.     pc = 0
  43.     output = list()
  44.     while pc < end:
  45.         instruction, opcode = program[pc:pc+2]
  46.         match instruction:
  47.             case 0:
  48.                 a = a >> get_register(a, b, c, opcode)
  49.  
  50.             case 1:
  51.                 b ^= opcode
  52.  
  53.             case 2:
  54.                 b = get_register(a, b, c, opcode) % 8
  55.  
  56.             case 3:
  57.                 if a != 0:
  58.                     pc = opcode
  59.                     continue
  60.  
  61.             case 4:
  62.                 b ^= c
  63.  
  64.             case 5:
  65.                 output.append(str(get_register(a, b, c, opcode) % 8))
  66.  
  67.             case 6:
  68.                 b = a >> get_register(a, b, c, opcode)
  69.  
  70.             case 7:
  71.                 c = a >> get_register(a, b, c, opcode)
  72.  
  73.         pc += 2
  74.  
  75.     return ','.join(output)
  76.  
  77.  
  78. if __name__ == '__main__':
  79.     print(main(*parse(open(argv[1]).read())))
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement