Skip to content
Snippets Groups Projects
Select Git revision
  • 86ce477649464d8579ed92ea5829d3ffe8b25cc1
  • master default
  • multipleinheritance
3 results

P1ParameterType.html

Blame
  • day_9_olle.py NaN GiB
    from typing import List
    def read_file(filename: str) -> str:
        with open(filename) as f:
            return f.readline().strip()
    
    def get_id_representation(file: str) -> List[str]:
        i = 0
        id_rep = []
        while i < len(file):
            if i % 2 == 0:
                id_rep += [str(i//2)]*int(file[i])
            else:
                id_rep += ['.']*int(file[i])
            i += 1
        return id_rep
    
    
    
    def rearrange(id_rep: str) -> List[str]:
        i = 0
        j = len(id_rep) - 1
        rearranged_rep = []
        while i < j:
            while id_rep[i].isnumeric() and i < j:
                rearranged_rep += [id_rep[i]]
                i += 1
            while (id_rep[j] == '.') and i < j:
                j -= 1
            if i == j:
                break
            else:
                rearranged_rep += [id_rep[j]]
                i += 1
                j -= 1
        rearranged_rep += [id_rep[j]]
        print(len(id_rep))
        print(len(rearranged_rep))
        return rearranged_rep + ['.'] * (len(id_rep) - len(rearranged_rep))
    
    def rearrange_whole(file: str) -> List[str]:
        file = list(file)
        ids = []
        i = 0
        for i in range(len(file)):
            if i % 2 == 0:
                ids += [str(i // 2)]
            else:
                ids += [str('.')]
        j = 1
        while j <= (len(file) - 1):
            if ids[-j] == '.':
                j += 1
                continue
            i = 0
            while (i < (len(file) - j) and
                   (ids[i].isnumeric() or int(file[i]) < int(file[-j]))):
                i += 1
            if i == (len(file) - j):
                j += 1
                continue
            elif int(file[i]) == int(file[-j]):
                ids[i], ids[-j] = ids[-j], ids[i]
                file[i], file[-j] = file[-j], file[i]
                j += 1
            else:
                numel_to_keep = int(file[i]) - int(file[-j])
                file[i] = file[-j]
                file = file[:i+1] + [str(numel_to_keep)] + file[i+1:]
                ids[i], ids[-j] = ids[-j], ids[i]
                ids = ids[:i+1] + ['.'] + ids[i+1:]
                j += 2
    
        rearranged_file = []
        for i in range(len(file)):
            rearranged_file += [ids[i]]*int(file[i])
        return rearranged_file
    
                
    
    def compute_checksum(arranged_file: List[str]) -> int:
        checksum = 0
        i = 0
        while arranged_file[i].isnumeric():
            checksum += int(arranged_file[i]) * i
            i += 1
        return checksum
    
    def compute_checksum_whole(arranged_file: List[str]) -> int:
        checksum = 0
        i = 0
        for i in range(len(arranged_file)):
            if arranged_file[i].isnumeric():
                checksum += int(arranged_file[i]) * i
        return checksum
    
    
    if __name__ == "__main__":
        file = read_file('input')
        id_rep = get_id_representation(file)
        print(compute_checksum(rearrange(id_rep)))
        print(compute_checksum_whole(rearrange_whole(file)))