diff --git a/2022/day07.py b/2022/day07.py new file mode 100755 index 0000000..407eb83 --- /dev/null +++ b/2022/day07.py @@ -0,0 +1,100 @@ +#!/usr/bin/python3 +""" +Jour 07 du défi Advent Of Code pour l'année 2022 +""" + +def read_sample(): + """récupère les entrées depuis le fichier texte correspondant""" + with open('inputs/day07.txt', 'r') as f: + #with open('ex.txt', 'r') as f: + sample = f.read().split('\n') + sample = [ i for i in sample if i != '' ] + return sample + +def change_dir(current_dir, args): + if args[0] == "/": + return args + if args == "..": + return "/".join(current_dir.split("/")[:-1]) + return current_dir + "/" + args + +def create_dir(dir, filesystem): + liste = dir.split("/")[1:] + base = filesystem + for e in liste: + if e not in base.keys(): + base[e] = {} + base = base[e] + +def add_file(file, filesystem, current_dir): + if file[0:3] == "dir": + return + + liste = current_dir.split("/")[1:] + base = filesystem + for e in liste: + base = base[e] + + size, name = int(file.split(" ")[0]), file.split(" ")[1] + base[name] = size + +def create_filesystem(sample): + filesystem = {"":{}} + current_dir = "/" + for line in sample: + if line == "$ ls": + pass + elif line[0] == "$": # cd + current_dir = change_dir(current_dir, line[5:]) + create_dir(current_dir, filesystem) + else: + add_file(line, filesystem, current_dir) + + return filesystem + +def part1(sample): + """Partie 1 du défi""" + fs = create_filesystem(sample) + upper = [] + def compute_sizes(base): + if type(base) == type(1): + return base + if type(base) == type({}): + sum = 0 + for i in base.keys(): + sum += compute_sizes(base[i]) + + if sum <= 100000: + upper.append(sum) + return sum + + total = compute_sizes(fs) + return sum(upper) + +def part2(sample): + """Partie 2 du défi""" + fs = create_filesystem(sample) + upper = [] + def compute_sizes(base): + if type(base) == type(1): + return base + if type(base) == type({}): + sum = 0 + for i in base.keys(): + sum += compute_sizes(base[i]) + upper.append(sum) + return sum + + total = compute_sizes(fs) + upper.sort() + return [i for i in upper if i > total-40000000][0] + + +def main(): + """Fonction principale""" + sample = read_sample() + print(f"part1: {part1(sample)}") + print(f"part2: {part2(sample)}") + +if __name__ == "__main__": + main() \ No newline at end of file