summaryrefslogtreecommitdiffstats
path: root/20/py
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-12-04 06:29:06 +0100
committerGustav Sörnäs <gustav@sornas.net>2020-12-04 06:29:06 +0100
commit6a77a12c1389b034c5a5b0ca401918b7cd667146 (patch)
tree8ca699ad82c2a74f72f6fd8585b0778942428754 /20/py
parent383825b1b6201dc90c350abbc7ae5a28031f7e96 (diff)
downloadaoc-6a77a12c1389b034c5a5b0ca401918b7cd667146.tar.gz
day 04
Diffstat (limited to '20/py')
-rw-r--r--20/py/d04.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/20/py/d04.py b/20/py/d04.py
new file mode 100644
index 0000000..a0a58a1
--- /dev/null
+++ b/20/py/d04.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+import sys
+
+
+def pt1(_in):
+ valid = 0
+ want = {s for s in "byr iyr eyr hgt hcl ecl pid cid".split()}
+
+ for line in _in:
+ if line == "\n":
+ if len(want) == 0 or (len(want) == 1 and "cid" in want):
+ valid += 1
+ want = {s for s in "byr iyr eyr hgt hcl ecl pid cid".split()}
+ continue
+ for entry in line.split(" "):
+ want.remove(entry.split(":")[0])
+ if len(want) == 0 or (len(want) == 1 and "cid" in want):
+ valid += 1
+ return valid
+
+
+def valid_entry(k, v) -> bool:
+ if k == "byr":
+ try:
+ v = int(v)
+ except:
+ return False
+ return 1920 <= v <= 2002
+ elif k == "iyr":
+ try:
+ v = int(v)
+ except:
+ return False
+ return 2010 <= v <= 2020
+ elif k == "eyr":
+ try:
+ v = int(v)
+ except:
+ return False
+ return 2020 <= v <= 2030
+ elif k == "hgt":
+ cm = False
+ try:
+ if v[-2:] == "cm":
+ cm = True
+ elif v[-2:] != "in":
+ return False
+ v = int(v[:-2])
+ except:
+ return False
+ if cm:
+ return 150 <= v <= 193
+ return 59 <= v <= 76
+ elif k == "hcl":
+ if v[0] != "#":
+ return False
+ if len(v) != 7:
+ return False
+ for c in v[1:]:
+ if c not in "0123456789abcdef":
+ return False
+ return True
+ elif k == "ecl":
+ return v in "amb blu brn gry grn hzl oth".split()
+ elif k == "pid":
+ try:
+ _ = int(v)
+ except:
+ return False
+ return len(v) == 9
+ elif k == "cid":
+ return True
+
+
+def pt2(_in):
+ valid = 0
+ want = {s for s in "byr iyr eyr hgt hcl ecl pid cid".split()}
+
+ for line in _in:
+ print(repr(line))
+ if line == "\n":
+ print(want)
+ if len(want) == 0 or (len(want) == 1 and "cid" in want):
+ valid += 1
+ want = {s for s in "byr iyr eyr hgt hcl ecl pid cid".split()}
+ continue
+ for entry in line.split(" "):
+ k, v = entry.strip().split(":")
+ if valid_entry(k, v):
+ want.remove(k)
+ print(want)
+ if len(want) == 0 or (len(want) == 1 and "cid" in want):
+ valid += 1
+ return valid
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ input = open(sys.argv[1], "r").readlines()
+ else:
+ input = open("../input/04", "r").readlines()
+ print(pt1(input))
+ print(pt2(input))