From ad3029759a1df71c4bd73584c4d2e809fc25c3f0 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 23 Jan 2021 17:52:59 +0100 Subject: [PATCH] Implement 2019 day 4 --- 2019/aoc2019/day04.py | 38 ++++++++++++++++++++++++++++++++++++++ 2019/tests/test_day04.py | 17 +++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 2019/aoc2019/day04.py create mode 100644 2019/tests/test_day04.py diff --git a/2019/aoc2019/day04.py b/2019/aoc2019/day04.py new file mode 100644 index 0000000..87cf039 --- /dev/null +++ b/2019/aoc2019/day04.py @@ -0,0 +1,38 @@ +import itertools +from typing import TextIO + + +def read_range(data: TextIO) -> range: + a, b = next(data).split('-') + + return range(int(a), int(b) + 1) # plus one because inclusive + + +def valid(number: int, strict: bool) -> bool: + s = str(number) + prev = '/' # is smaller than '0' + has_group = False + + if len(s) != 6: + return False + + for k, g in itertools.groupby(s): + if k < prev: + return False + + prev = k + + amount = sum(1 for _ in g) + + if amount == 2 or not strict and amount > 2: + has_group = True + + return has_group + + +def part1(data: TextIO) -> int: + return sum(1 for password in read_range(data) if valid(password, False)) + + +def part2(data: TextIO) -> int: + return sum(1 for password in read_range(data) if valid(password, True)) diff --git a/2019/tests/test_day04.py b/2019/tests/test_day04.py new file mode 100644 index 0000000..3d3248a --- /dev/null +++ b/2019/tests/test_day04.py @@ -0,0 +1,17 @@ +import pytest + +from aoc2019.day04 import valid + + +@pytest.mark.parametrize('number,strict,expected', [ + (122345, False, True), + (111123, False, True), + (111111, False, True), + (223450, False, False), + (123789, False, False), + (112233, True, True), + (123444, True, False), + (111122, True, True) +]) +def test_valid(number: int, strict: bool, expected: bool) -> None: + assert valid(number, strict) == expected