adventofcode

https://adventofcode.com/
Log | Files | Refs

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