diff options
Diffstat (limited to 'users/Profpatsch/advent-of-code/2020')
-rw-r--r-- | users/Profpatsch/advent-of-code/2020/01/main.py | 22 | ||||
-rw-r--r-- | users/Profpatsch/advent-of-code/2020/02/main.py | 77 | ||||
-rw-r--r-- | users/Profpatsch/advent-of-code/2020/03/main.py | 66 | ||||
-rw-r--r-- | users/Profpatsch/advent-of-code/2020/04/main.py | 104 |
4 files changed, 0 insertions, 269 deletions
diff --git a/users/Profpatsch/advent-of-code/2020/01/main.py b/users/Profpatsch/advent-of-code/2020/01/main.py deleted file mode 100644 index e636017a54d5..000000000000 --- a/users/Profpatsch/advent-of-code/2020/01/main.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys - -l = [] -with open('./input', 'r') as f: - for line in f: - l.append(int(line)) - -s = set(l) - -res=None -for el in s: - for el2 in s: - if (2020-(el+el2)) in s: - res=(el, el2, 2020-(el+el2)) - break - -if res == None: - sys.exit("could not find a number that adds to 2020") - -print(res) - -print(res[0] * res[1] * res[2]) diff --git a/users/Profpatsch/advent-of-code/2020/02/main.py b/users/Profpatsch/advent-of-code/2020/02/main.py deleted file mode 100644 index e3b27c382a21..000000000000 --- a/users/Profpatsch/advent-of-code/2020/02/main.py +++ /dev/null @@ -1,77 +0,0 @@ -import sys - -def parse(line): - a = line.split(sep=" ", maxsplit=1) - assert len(a) == 2 - fromto = a[0].split(sep="-") - assert len(fromto) == 2 - (from_, to) = (int(fromto[0]), int(fromto[1])) - charpass = a[1].split(sep=": ") - assert len(charpass) == 2 - char = charpass[0] - assert len(char) == 1 - pass_ = charpass[1] - assert pass_.endswith("\n") - pass_ = pass_[:-1] - return { - "from": from_, - "to": to, - "char": char, - "pass": pass_ - } - -def char_in_pass(char, pass_): - return pass_.count(char) - -def validate_01(entry): - no = char_in_pass(entry["char"], entry["pass"]) - if no < entry["from"]: - return { "too-small": entry } - elif no > entry["to"]: - return { "too-big": entry } - else: - return { "ok": entry } - -def char_at_pos(char, pos, pass_): - assert pos <= len(pass_) - return pass_[pos-1] == char - -def validate_02(entry): - one = char_at_pos(entry["char"], entry["from"], entry["pass"]) - two = char_at_pos(entry["char"], entry["to"], entry["pass"]) - if one and two: - return { "both": entry } - elif one: - return { "one": entry } - elif two: - return { "two": entry } - else: - return { "none": entry } - - -res01 = [] -res02 = [] -with open("./input", 'r') as f: - for line in f: - p = parse(line) - res01.append(validate_01(p)) - res02.append(validate_02(p)) - -count01=0 -for r in res01: - print(r) - if r.get("ok", False): - count01=count01+1 - -count02=0 -for r in res02: - print(r) - if r.get("one", False): - count02=count02+1 - elif r.get("two", False): - count02=count02+1 - else: - pass - -print("count 1: {}".format(count01)) -print("count 2: {}".format(count02)) diff --git a/users/Profpatsch/advent-of-code/2020/03/main.py b/users/Profpatsch/advent-of-code/2020/03/main.py deleted file mode 100644 index 4d6baf946c3e..000000000000 --- a/users/Profpatsch/advent-of-code/2020/03/main.py +++ /dev/null @@ -1,66 +0,0 @@ -import itertools -import math - -def tree_line(init): - return { - "init-len": len(init), - "known": '', - "rest": itertools.repeat(init) - } - -def tree_line_at(pos, tree_line): - needed = (pos + 1) - len(tree_line["known"]) - # internally advance the tree line to the position requested - if needed > 0: - tree_line["known"] = tree_line["known"] \ - + ''.join( - itertools.islice( - tree_line["rest"], - 1+math.floor(needed / tree_line["init-len"]))) - # print(tree_line) - return tree_line["known"][pos] == '#' - -def tree_at(linepos, pos, trees): - return tree_line_at(pos, trees[linepos]) - -def slope_positions(trees, right, down): - line = 0 - pos = 0 - while line < len(trees): - yield (line, pos) - line = line + down - pos = pos + right - -trees = [] -with open("./input", 'r') as f: - for line in f: - line = line.rstrip() - trees.append(tree_line(line)) - -# print(list(itertools.islice(trees[0], 5))) -# print(list(map( -# lambda x: tree_at(0, x, trees), -# range(100) -# ))) -# print(list(slope_positions(trees, right=3, down=1))) - -def count_slope_positions(trees, slope): - count = 0 - for (line, pos) in slope: - if tree_at(line, pos, trees): - count = count + 1 - return count - -print( - count_slope_positions(trees, slope_positions(trees, right=1, down=1)) - * - count_slope_positions(trees, slope_positions(trees, right=3, down=1)) - * - count_slope_positions(trees, slope_positions(trees, right=5, down=1)) - * - count_slope_positions(trees, slope_positions(trees, right=7, down=1)) - * - count_slope_positions(trees, slope_positions(trees, right=1, down=2)) -) - -# I realized I could have just used a modulo instead … diff --git a/users/Profpatsch/advent-of-code/2020/04/main.py b/users/Profpatsch/advent-of-code/2020/04/main.py deleted file mode 100644 index 36bbed7146d6..000000000000 --- a/users/Profpatsch/advent-of-code/2020/04/main.py +++ /dev/null @@ -1,104 +0,0 @@ -import sys -import itertools -import re -import pprint - -def get_entry(fd): - def to_dict(keyval): - res = {} - for (k, v) in keyval: - assert k not in res - res[k] = v - return res - - res = [] - for line in fd: - if line == "\n": - yield to_dict(res) - res = [] - else: - line = line.rstrip() - items = line.split(" ") - for i in items: - res.append(i.split(":", maxsplit=2)) - -def val_hgt(hgt): - m = re.fullmatch(r'([0-9]+)(cm|in)', hgt) - if m: - (i, what) = m.group(1,2) - i = int(i) - if what == "cm": - return i >= 150 and i <= 193 - elif what == "in": - return i >= 59 and i <= 76 - else: - return False - -required_fields = [ - { "name": "byr", - "check": lambda s: int(s) >= 1920 and int(s) <= 2002 - }, - { "name": "iyr", - "check": lambda s: int(s) >= 2010 and int(s) <= 2020 - }, - { "name": "eyr", - "check": lambda s: int(s) >= 2020 and int(s) <= 2030, - }, - { "name": "hgt", - "check": lambda s: val_hgt(s) - }, - { "name": "hcl", - "check": lambda s: re.fullmatch(r'#[0-9a-f]{6}', s) - }, - { "name": "ecl", - "check": lambda s: re.fullmatch(r'amb|blu|brn|gry|grn|hzl|oth', s) - }, - { "name": "pid", - "check": lambda s: re.fullmatch(r'[0-9]{9}', s) - }, - # we should treat it as not required - # "cid" -] - -required_dict = {} -for f in required_fields: - required_dict[f["name"]] = f - -def validate(keyval): - if keyval[0] not in required_dict: - return { "ok": keyval } - if required_dict[keyval[0]]["check"](keyval[1]): - return { "ok": keyval } - else: - return { "validation": keyval } - -def all_fields(entry): - missing = [] - for r in required_dict: - if r not in e: - missing.append(r) - if missing == []: - return { "ok": entry } - else: - return { "missing": missing } - -count=0 -for e in get_entry(sys.stdin): - a = all_fields(e) - if a.get("ok", False): - res = {} - bad = False - for keyval in e.items(): - r = validate(keyval) - if r.get("validation", False): - bad = True - res[keyval[0]] = r - if bad: - pprint.pprint({ "validation": res }) - else: - pprint.pprint({ "ok": e }) - count = count+1 - else: - pprint.pprint(a) - -print(count) |