2024.02
This commit is contained in:
parent
ee3a3f9233
commit
7166572ccc
6 changed files with 106 additions and 1 deletions
1
challenges/2024/02-redNosedReports/README.md
Normal file
1
challenges/2024/02-redNosedReports/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# [Day 2: Red Nosed Reports](https://adventofcode.com/2024/day/2)
|
87
challenges/2024/02-redNosedReports/main.py
Normal file
87
challenges/2024/02-redNosedReports/main.py
Normal file
|
@ -0,0 +1,87 @@
|
|||
import sys
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def parse(instr: str) -> list[list[int]]:
|
||||
res = []
|
||||
for line in instr.splitlines():
|
||||
res.append(list(map(int, line.split(" "))))
|
||||
return res
|
||||
|
||||
|
||||
def test_pair(
|
||||
a: int, b: int, sequence_is_negative: Optional[bool]
|
||||
) -> tuple[bool, bool]:
|
||||
diff = b - a
|
||||
this_is_negative = diff < 0
|
||||
|
||||
if sequence_is_negative is not None and this_is_negative != sequence_is_negative:
|
||||
return False, this_is_negative
|
||||
|
||||
return 1 <= abs(diff) <= 3, this_is_negative
|
||||
|
||||
|
||||
def test_report(rep: list[int]) -> bool:
|
||||
should_be_negative: Optional[bool] = None
|
||||
ok = False
|
||||
|
||||
for i, v in enumerate(rep[:-1]):
|
||||
w = rep[i + 1]
|
||||
|
||||
ok, neg = test_pair(v, w, should_be_negative)
|
||||
if should_be_negative is None:
|
||||
should_be_negative = neg
|
||||
|
||||
if not ok:
|
||||
break
|
||||
|
||||
return ok
|
||||
|
||||
|
||||
def one(instr: str):
|
||||
reports = parse(instr)
|
||||
|
||||
n = 0
|
||||
for rep in reports:
|
||||
if test_report(rep):
|
||||
n += 1
|
||||
|
||||
return n
|
||||
|
||||
|
||||
def two(instr: str):
|
||||
reports = parse(instr)
|
||||
|
||||
n = 0
|
||||
for rep in reports:
|
||||
if test_report(rep):
|
||||
n += 1
|
||||
else:
|
||||
ok = False
|
||||
for i in range(len(rep)):
|
||||
r = rep.copy()
|
||||
r.pop(i)
|
||||
if test_report(r):
|
||||
ok = True
|
||||
break
|
||||
|
||||
if ok:
|
||||
n += 1
|
||||
|
||||
return n
|
||||
|
||||
|
||||
def _debug(*args, **kwargs):
|
||||
kwargs["file"] = sys.stderr
|
||||
print(*args, **kwargs)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 2 or sys.argv[1] not in ["1", "2"]:
|
||||
print("Missing day argument", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
inp = sys.stdin.read().strip()
|
||||
if sys.argv[1] == "1":
|
||||
print(one(inp))
|
||||
else:
|
||||
print(two(inp))
|
14
challenges/2024/02-redNosedReports/tests.json
Normal file
14
challenges/2024/02-redNosedReports/tests.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"1": [
|
||||
{
|
||||
"is": "2",
|
||||
"input": "7 6 4 2 1\n1 2 7 8 9\n9 7 6 2 1\n1 3 2 4 5\n8 6 4 4 1\n1 3 6 7 9\n"
|
||||
}
|
||||
],
|
||||
"2": [
|
||||
{
|
||||
"is": "4",
|
||||
"input": "7 6 4 2 1\n1 2 7 8 9\n9 7 6 2 1\n1 3 2 4 5\n8 6 4 4 1\n1 3 6 7 9\n"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -14,4 +14,5 @@ A day denoted with a star means it has a visualisation.
|
|||
|
||||
| Day | Status | Solutions | Notes |
|
||||
|-------------------------------------|--------|----------------------|-------|
|
||||
| 01 - Historian Hysteria | ★ ★ | Python | The reading comprehension was the hardest part of this. |
|
||||
| 01 - Historian Hysteria | ★ ★ | Python | The reading comprehension was the hardest part of this. |
|
||||
| 02 - Red-Nosed Reindeer | ★ ★ | Python ||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 26 KiB |
|
@ -1,2 +1,4 @@
|
|||
{"day": 1, "part": 1, "runner": "py", "min": 0.016046524047851562, "max": 0.025307178497314453, "avg": 0.016975646018981935, "n": 100}
|
||||
{"day": 1, "part": 2, "runner": "py", "min": 0.0161440372467041, "max": 0.019031047821044922, "avg": 0.016828114986419677, "n": 100}
|
||||
{"day": 2, "part": 1, "runner": "py", "min": 0.021907567977905273, "max": 0.02720332145690918, "avg": 0.023289167881011964, "n": 100}
|
||||
{"day": 2, "part": 2, "runner": "py", "min": 0.02489948272705078, "max": 0.0319674015045166, "avg": 0.026371052265167238, "n": 100}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue