Solve day3 part 1

This commit is contained in:
Gabriel Augendre 2021-12-03 12:08:16 +01:00
parent 0f1e1f7c3f
commit 3bf0fcec57
5 changed files with 1106 additions and 0 deletions

52
2021/day03_gamma.py Normal file
View file

@ -0,0 +1,52 @@
from collections import defaultdict
def main(filename: str, expected_part_1: int = None, expected_part_2: int = None):
print(f"\n+ Running on {filename}")
with open(filename) as f:
data = f.read().strip().split("\n")
counter_part_1 = solve_part_1(data)
print(f"1. Found {counter_part_1}")
if expected_part_1:
assert expected_part_1 == counter_part_1
counter_part_2 = solve_part_2(data)
print(f"2. Found {counter_part_2}")
if expected_part_2:
assert expected_part_2 == counter_part_2
def solve_part_1(data):
count_ones = defaultdict(int)
total = len(data)
for binary in data:
for index, digit in enumerate(binary):
if digit == "1":
count_ones[index] += 1
gamma = ""
epsilon = ""
for index in range(len(data[0])):
most_common = _most_common(count_ones, total, index)
gamma += most_common
epsilon += "0" if most_common == "1" else "1"
return int(gamma, 2) * int(epsilon, 2)
def _most_common(count_ones, total, index):
"""
Return 1 if the most common value is 1, otherwise 0.
"""
if count_ones[index] >= total / 2:
return "1"
return "0"
def solve_part_2(data):
return 0
if __name__ == "__main__":
main("inputs/day03-test1", expected_part_1=198)
main("inputs/day03")

1000
2021/inputs/day03 Normal file

File diff suppressed because it is too large Load diff

12
2021/inputs/day03-test1 Normal file
View file

@ -0,0 +1,12 @@
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010

14
2021/new_day Executable file
View file

@ -0,0 +1,14 @@
#!/bin/bash
set -euxo pipefail
if [[ $# -ne 2 ]]; then
>&2 echo "Usage: $0 <number> <python_module_name>"
exit 2
fi
filename=day$1_$2.py
cp template.py $filename
sed -e "s/dayXX/day$1/g" -i "" ./$filename
mkdir -p inputs
touch inputs/day$1
touch inputs/day$1-test1

28
2021/template.py Normal file
View file

@ -0,0 +1,28 @@
def main(filename: str, expected_part_1: int = None, expected_part_2: int = None):
print(f"\n+ Running on {filename}")
with open(filename) as f:
data = f.read().strip().split("\n")
counter_part_1 = solve_part_1(data)
print(f"1. Found {counter_part_1}")
if expected_part_1:
assert expected_part_1 == counter_part_1
counter_part_2 = solve_part_2(data)
print(f"2. Found {counter_part_2}")
if expected_part_2:
assert expected_part_2 == counter_part_2
def solve_part_1(data):
return 0
def solve_part_2(data):
return 0
if __name__ == "__main__":
main("inputs/dayXX-test1")
main("inputs/dayXX")