from os.path import join, dirname
from typing import List, Optional, Set, Tuple
from itertools import combinations, count
from math import floor, prod


def parse(s: str) -> List[int]:
    numbers: List[int] = sorted(map(int, s.strip().split('\n')))
    numbers.insert(0, 0)  # The wall
    numbers.append(numbers[-1] + 3)  # Phone itself
    return numbers


def diff(l: List[int]) -> List[int]:
    return [
        l[x] - l[x-1]
        for x in range(1, len(l))
    ]


def calc(d: List[int]) -> int:
    one = d.count(1)
    three = d.count(3)
    return one * three


def find_valid_permutations(d: List[int]) -> int:
    i = 0
    l = len(d)
    slices: List[int] = []
    while i < l:
        if d[i] != 3:
            try:
                n = d.index(3, i + 1)  # Find the next three
                diff = n - i
                if diff > 1:
                    slices.append(diff)
                    i = n
                    continue
            except:
                pass
        i += 1
    return prod([
        2**(s-1) - floor(s/4)
        for s in slices
    ])


data = join(dirname(__file__), '../data.txt')
with open(data) as f:
    numbers: List[int] = parse(f.read())
    d = diff(numbers)
    print(calc(d))
    print(find_valid_permutations(d))