diff --git a/2016-python2/output/day_19.py b/2016-python2/output/day_19.py new file mode 100644 index 0000000..2abd264 --- /dev/null +++ b/2016-python2/output/day_19.py @@ -0,0 +1,52 @@ +from collections import deque + + +def solve(data): + elfes = int(data) + p1 = left_adjacent_rule(elfes) + p1b = mathematical_superiority(elfes) + p2 = opposite_side_rule(elfes) + assert p1 == p1b + return p1, p2 + + +def mathematical_superiority(num_elfes): + # Josephus' problem, quick method: + # https://www.youtube.com/watch?v=uCsD3ZGzMgE + b = format(num_elfes, "b") + return int(b[1:] + b[0], 2) + + +def left_adjacent_rule(num_elfes): + # https://en.wikipedia.org/wiki/Josephus_problem + q = deque(list(range(1, num_elfes + 1))) + while len(q) > 1: + q.rotate(-1) + q.popleft() + return q.pop() + + +def opposite_side_rule(num_elfes): + elfes = list(range(1, num_elfes + 1)) + separator = num_elfes // 2 + L, R = deque(elfes[:separator]), deque(elfes[separator:]) + + while L and R: + R.popleft() + l2r = L.popleft() + R.append(l2r) + if len(R) - len(L) != 1: + r2l = R.popleft() + L.append(r2l) + + return R.pop() + + +if __name__ == "__main__": + with open("./input/19.txt", "r") as f: + inp = f.read().strip() + + p1, p2 = solve(inp) + + print(p1) + print(p2)