puzzle13.py (1669B)
1 firewall = [] 2 idx = 0 3 4 with open('files/puzzle13.txt') as f: 5 for line in f.readlines(): 6 tokens = line.split(' ') 7 8 if idx is not int(tokens[0][:len(tokens[0]) - 1]): 9 while idx < int(tokens[0][:len(tokens[0]) - 1]): 10 firewall.append(0) 11 idx += 1 12 13 firewall.append(int(tokens[1])) 14 idx += 1 15 16 def generate_sequence(x, delay): 17 sequence = [] 18 reverse = False 19 20 for i in range(len(firewall) + delay): 21 sequence.append((x - 1) - (i % (x - 1)) if reverse else i % (x - 1)) 22 if (i + 1) % (x - 1) == 0: 23 reverse = not reverse 24 25 return sequence 26 27 scanner_sequences = {i : generate_sequence(i, 0) for i in range(2, 100)} 28 severity = 0 29 30 for picoseconds, wall in enumerate(firewall): 31 if wall != 0: 32 if scanner_sequences[wall][picoseconds] == 0: 33 severity += wall * picoseconds 34 35 print severity 36 37 def generate_scanner_position(wall, pos): 38 reverse = False 39 40 for i in range(pos): 41 if (i + 1) % (wall - 1) == 0: 42 reverse = not reverse 43 44 return (wall - 1) - (pos % (wall - 1)) if reverse else delay % (wall - 1) 45 46 delay = 0 47 caught = True 48 furthest = 0 49 while caught: 50 caught = False 51 delay += 1 52 for picoseconds, wall in enumerate(firewall): 53 if wall != 0: 54 print generate_scanner_position(wall, picoseconds + delay) 55 if generate_scanner_position(wall, picoseconds + delay) == 0: 56 if picoseconds > furthest: 57 furthest = picoseconds 58 print "current furthest: " + str(furthest) 59 caught = True 60 break 61 62 print delay