File tree Expand file tree Collapse file tree 4 files changed +130
-0
lines changed
Expand file tree Collapse file tree 4 files changed +130
-0
lines changed Original file line number Diff line number Diff line change 1+ import re
2+ from itertools import count
3+
4+ with open ("input" ) as f :
5+ inp = f .read ().strip ()
6+
7+ discs = []
8+ for line in inp .split ("\n " ):
9+ nums = list (map (int , re .findall ("\d+" , line )))
10+ nums .pop (2 )
11+ discs .append (tuple (nums ))
12+
13+
14+ def solve (part2 = False ):
15+ if part2 :
16+ discs .append ((len (discs ) + 1 , 11 , 0 ))
17+ for t in count ():
18+ if all ((init_pos + t + disc ) % n == 0 for disc , n , init_pos in discs ):
19+ return t
20+
21+
22+ # Part 1
23+ print (solve ())
24+
25+ # Part 2
26+ print (solve (True ))
Original file line number Diff line number Diff line change 1+ def process (s ):
2+ res = ""
3+ for c in s [::- 1 ]:
4+ bit = "1" if c == "0" else "0"
5+ res += bit
6+ return s + "0" + res
7+
8+
9+ def checksum (s ):
10+ pairs = []
11+ res = ""
12+ for i in range (0 , len (s ), 2 ):
13+ pairs .append (s [i :(i + 2 )])
14+ x = "1" if s [i ] == s [i + 1 ] else "0"
15+ res += x
16+ if len (res ) % 2 == 1 :
17+ return res
18+ return checksum (res )
19+
20+
21+ def solve (length ):
22+ state = "10111100110001111"
23+ while len (state ) < length :
24+ state = process (state )
25+ return checksum (state [:length ])
26+
27+
28+ # Part 1
29+ print (solve (272 ))
30+
31+ # Part 2
32+ print (solve (35651584 ))
Original file line number Diff line number Diff line change 1+ import hashlib
2+ from collections import deque
3+
4+ passcode = "qzthpkfp"
5+
6+
7+ def get_dirs (path ):
8+ dirs = [- 1j , 1j , - 1 , 1 ]
9+ hash_ = hashlib .md5 ((passcode + path ).encode ()).hexdigest ()
10+ hash_ = hash_ [:4 ]
11+ return [dirs [i ] for i , c in enumerate (hash_ [:4 ]) if "b" <= c <= "f" ]
12+
13+
14+ dirs_letter = {1 : "R" , - 1 : "L" , 1j : "D" , - 1j : "U" }
15+ first = True
16+ longest_path = 0
17+ q = deque ([(0 , "" )])
18+ seen = set ()
19+ while q :
20+ p , path = q .popleft ()
21+ if (p , path ) in seen :
22+ continue
23+ if p == 3 + 3 * 1j :
24+ longest_path = max (longest_path , len (path ))
25+ if first :
26+ print (path )
27+ first = False
28+ continue
29+ seen .add ((p , path ))
30+ for dp in get_dirs (path ):
31+ new_p = p + dp
32+ if not (0 <= new_p .real <= 3 and 0 <= new_p .imag <= 3 ):
33+ continue
34+ q .append ((new_p , path + dirs_letter [dp ]))
35+
36+ print (longest_path )
Original file line number Diff line number Diff line change 1+ with open ("input" ) as f :
2+ inp = f .read ().strip ()
3+
4+
5+ def next_row (s ):
6+ res = ""
7+ for i in range (len (s )):
8+ if i == 0 :
9+ tiles = ("." , s [0 ], s [1 ])
10+ elif i == len (s ) - 1 :
11+ tiles = (s [len (s ) - 2 ], s [len (s ) - 1 ], "." )
12+ else :
13+ tiles = (s [i - 1 ], s [i ], s [i + 1 ])
14+ left , center , right = tiles
15+ if left == "^" and center == "^" and right == "." :
16+ res += "^"
17+ elif left == "." and center == "^" and right == "^" :
18+ res += "^"
19+ elif left == "^" and center == "." and right == "." :
20+ res += "^"
21+ elif left == "." and center == "." and right == "^" :
22+ res += "^"
23+ else :
24+ res += "."
25+ return res
26+
27+
28+ rows = [inp ]
29+ for i in range (400000 - 1 ):
30+ rows .append (next_row (rows [- 1 ]))
31+
32+ # Part 1
33+ print (sum (row .count ("." ) for row in rows [:40 ]))
34+
35+ # Part 2
36+ print (sum (row .count ("." ) for row in rows ))
You can’t perform that action at this time.
0 commit comments