From e12d28d9a49564e4c6598fd157d46a1b951cfb31 Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Wed, 16 Dec 2020 20:29:43 +0100 Subject: [PATCH] renamed python files day* -> Day* to have all files sorted by day in gitlab overview --- Day1.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Day2.py | 32 ++++++++++++++++++ Day3.py | 44 +++++++++++++++++++++++++ Day4.py | 70 +++++++++++++++++++++++++++++++++++++++ Day5.py | 26 +++++++++++++++ Day_1.py | 31 ++++++++++++++++++ 6 files changed, 302 insertions(+) create mode 100644 Day1.py create mode 100644 Day2.py create mode 100644 Day3.py create mode 100644 Day4.py create mode 100644 Day5.py create mode 100644 Day_1.py diff --git a/Day1.py b/Day1.py new file mode 100644 index 0000000..6f4c796 --- /dev/null +++ b/Day1.py @@ -0,0 +1,99 @@ +expense_report = [] + +with open('day1/input') as reader: + expense_report.extend([int(l) for l in reader.readlines()]) + +expense_report.sort() + +def calc_two(sub_set, absolute): + first_i = 0 + second_i = len(sub_set) - 1 + first = sub_set[first_i] + second = sub_set[second_i] + + while first_i < second_i and first + second + absolute != 2020: + if first + second + absolute > 2020: + second_i -= 1 + second = sub_set[second_i] + else: + first_i += 1 + first = sub_set[first_i] + if first_i < second_i: + return (first_i, second_i, first, second) + return None + +# part one +# first_i = 0 +# second_i = len(expense_report) - 1 +# first = expense_report[first_i] +# second = expense_report[second_i] +# +# while first + second != 2020: +# if first + second > 2020: +# second_i -= 1 +# second = expense_report[second_i] +# else: +# first_i += 1 +# first = expense_report[first_i] + +first_i, second_i, first, second = calc_two(expense_report, 0) + +print(first, second) +print(first * second) + +# second part + +for i in range(len(expense_report) - 1): + res = calc_two(expense_report[i+1:], expense_report[i]) + if res is not None: + print(res[2], res[3], expense_report[i]) + print(res[2] * res[3] * expense_report[i]) + break + +# second part better? +# does not work! and probably never will! + +# first_i = 0 +# second_i = 1 +# third_i = len(expense_report) - 1 +# first = expense_report[first_i] +# second = expense_report[second_i] +# third = expense_report[third_i] +# +# up_with_second = first + second + third < 2020 +# +# while first + second + third != 2020: +# if first + second + third > 2020: +# if up_with_second: +# if second_i+1 == third_i: +# second_i -= 1 +# second = expense_report[second_i] +# third_i -= 1 +# third = expense_report[third_i] +# else: +# if second_i-1 != first_i: +# second_i -= 1 +# second = expense_report[second_i] +# else: +# third_i -= 1 +# third = expense_report[third_i] +# up_with_second = True +# else: +# if up_with_second: +# if second_i+1 != third_i: +# second_i += 1 +# second = expense_report[second_i] +# else: +# first_i += 1 +# first = expense_report[first_i] +# up_with_second = False +# else: +# if second_i-1 == first_i: +# second_i += 1 +# second = expense_report[second_i] +# first_i += 1 +# first = expense_report[first_i] +# +# +# print(first, second, third) +# print(first * second * third) diff --git a/Day2.py b/Day2.py new file mode 100644 index 0000000..2765790 --- /dev/null +++ b/Day2.py @@ -0,0 +1,32 @@ +pw_db = [] + +with open('day2/input') as reader: + for l in reader.readlines(): + s = l.split() + split_restriction = s[0].index("-") + restriction_min = int(s[0][:split_restriction]) + restriction_max = int(s[0][split_restriction+1:]) + c = s[1][:-1] + p = s[2] + + pw_db.append(((restriction_min, restriction_max), c, p)) + +valids = 0 +for pw in pw_db: + count = pw[2].count(pw[1]) + if pw[0][0] <= count <= pw[0][1]: + valids += 1 + +print(valids) + +valids2 = 0 +for pw in pw_db: + first = pw[0][0] + second = pw[0][1] + c = pw[1] + p = pw[2] + l = len(p) + if (first <= l and p[first-1] == c) is not (second <= l and p[second-1] == c): + valids2 += 1 + +print(valids2) diff --git a/Day3.py b/Day3.py new file mode 100644 index 0000000..7490274 --- /dev/null +++ b/Day3.py @@ -0,0 +1,44 @@ +import functools + +slope_map = [] + +with open('day3/input') as reader: + slope_map.extend(reader.read().splitlines()) + + +def check_slope(right, down): + global slope_map + pos = 0 + y = 1 + trees = 0 + for l in slope_map[1:]: + if y % down == 0: + pos = (pos + right) % len(l) + if l[pos] == '#': + trees += 1 + y += 1 + + return trees + + +def check_slope_short(right, down): + global slope_map + trees = 0 + for (i, l) in enumerate(slope_map): + if i % down == 0: + pos = (i // down * right) % len(l) + if l[pos] == '#': + trees += 1 + + return trees + + +def check_slope_even_short(right, down): + global slope_map + return len(list(filter(lambda b: b, map(lambda en: en[1][(en[0] // down * right) % len(en[1])] == '#', filter(lambda en: en[0] % down == 0, enumerate(slope_map)))))) + +slopes = [(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)] + +total_trees = functools.reduce(lambda prev, slope: prev * check_slope_even_short(*slope), slopes, 1) + +print(total_trees) diff --git a/Day4.py b/Day4.py new file mode 100644 index 0000000..691ea5b --- /dev/null +++ b/Day4.py @@ -0,0 +1,70 @@ +import re +passports = [] + +with open('day4/input') as reader: + cur = '' + for line in reader.read().splitlines(): + if line != '': + if cur == '': + cur += line + else: + cur += ' ' + line + else: + passports.append(cur) + cur = '' + + if cur != '': + passports.append(cur) + +def byr(s): + return re.match('^\d{4}$', s) is not None and (1920 <= int(s) <= 2002) + +def iyr(s): + return re.match('^\d{4}$', s) is not None and (2010 <= int(s) <= 2020) + +def eyr(s): + return re.match('^\d{4}$', s) is not None and (2020 <= int(s) <= 2030) + +def hgt(s): + return (re.match('^\d+cm$', s) is not None and (150 <= int(s[:-2]) <= 193)) \ + or (re.match('^\d+in$', s) is not None and (59 <= int(s[:-2]) <= 76)) + +def hcl(s): + return re.match('^#[0-9a-f]{6}$', s) is not None + +def ecl(s): + return s in {'amb', 'blu', 'brn', 'gry', 'grn', 'hzl', 'oth'} + +def pid(s): + return re.match('^[0-9]{9}$', s) is not None + +verify = {'byr': byr, + 'iyr': iyr, + 'eyr': eyr, + 'hgt': hgt, + 'hcl': hcl, + 'ecl': ecl, + 'pid': pid, + 'cid': lambda s: True + } + +valid = set(verify.keys()) + +count_valids = 0 +for p in passports: + props = set() + failed = False + for prop in p.split(' '): + key, value = prop.split(':') + props.add(key) + if not verify[key](value): + failed = True + break + + if failed: + continue + missing = valid.difference(props) + if missing == set() or missing == {'cid'}: + count_valids += 1 + +print(count_valids) diff --git a/Day5.py b/Day5.py new file mode 100644 index 0000000..fd644d2 --- /dev/null +++ b/Day5.py @@ -0,0 +1,26 @@ +boarding_passes = [] + +with open('day5/input') as reader: + boarding_passes.extend(reader.read().splitlines()) + + +def seat_id(boarding): + binary = boarding \ + .replace('F', '0') \ + .replace('B', '1') \ + .replace('L', '0') \ + .replace('R', '1') + + return int(binary, 2) + + +res = max(map(seat_id, boarding_passes)) + +print(res) + +# second part +all_seats = sorted(map(seat_id, boarding_passes)) +for i in range(len(all_seats)): + if all_seats[i] + 2 == all_seats[i + 1]: + print(all_seats[i] + 1) + break diff --git a/Day_1.py b/Day_1.py new file mode 100644 index 0000000..556f67e --- /dev/null +++ b/Day_1.py @@ -0,0 +1,31 @@ +expense_report = [] + +with open('day1/input') as reader: + expense_report.extend([int(l) for l in reader.readlines()]) + +expense_report.sort() + +def calc_two(sub_set, absolute): + first_i = 0 + second_i = len(sub_set) - 1 + first = sub_set[first_i] + second = sub_set[second_i] + + while first_i < second_i and first + second + absolute != 2020: + if first + second + absolute > 2020: + second_i -= 1 + second = sub_set[second_i] + else: + first_i += 1 + first = sub_set[first_i] + if first_i < second_i: + return (first, second) + return None + + +for i in range(len(expense_report) - 1): + res = calc_two(expense_report[i+1:], expense_report[i]) + if res is not None: + print(res[0], res[1], expense_report[i]) + print(res[0] * res[1] * expense_report[i]) + break \ No newline at end of file