Day 15 (Python)
This commit is contained in:
parent
abf0d2ac99
commit
97e79c4fce
7 changed files with 210 additions and 27 deletions
54
.github/README.md
vendored
54
.github/README.md
vendored
|
@ -14,33 +14,33 @@ Puzzle inputs and descriptions are not included in this repository. You'll have
|
|||
|
||||
<!-- PARSE START -->
|
||||
|
||||
| Day | | Python | Go |
|
||||
| --------------------------- | ------------------------------ | ------------------------------------- | --------------------------------- |
|
||||
| [1](/01-reportRepair) | ![Completed][check] | [Link](/01-reportRepair/python) | [Link](/01-reportRepair/go) |
|
||||
| [2](/02-passwordPhilosophy) | ![Completed][check] | [Link](/02-passwordPhilosophy/python) | [Link](/02-passwordPhilosophy/go) |
|
||||
| [3](/03-tobogganTrajectory) | ![Completed][check] | [Link](/03-tobogganTrajectory/python) | [Link](/03-tobogganTrajectory/go) |
|
||||
| [4](/04-passportProcessing) | ![Completed][check] | [Link](/04-passportProcessing/python) | [Link](/04-passportProcessing/go) |
|
||||
| [5](/05-binaryBoarding) | ![Completed][check] | [Link](/05-binaryBoarding/python) | [Link](/05-binaryBoarding/go) |
|
||||
| [6](/06-customCustoms) | ![Completed][check] | [Link](/06-customCustoms/python) | [Link](/06-customCustoms/go) |
|
||||
| [7](/07-handyHaversacks) | ![Completed][check] | [Link](/07-handyHaversacks/python) | [Link](/07-handyHaversacks/go) |
|
||||
| [8](/08-handheldHalting) | ![Completed][check] | [Link](/08-handheldHalting/python) | [Link](/08-handheldHalting/go) |
|
||||
| [9](/09-encodingError) | ![Completed][check] | [Link](/09-encodingError/python) | [Link](/09-encodingError/go) |
|
||||
| [10](/10-adapterArray) | ![Completed][check] | [Link](/10-adapterArray/python) | [Link](/10-adapterArray/go) |
|
||||
| [11](/11-seatingSystem) \* | ![Completed][check] | [Link](/11-seatingSystem/python) | [Link](/11-seatingSystem/python) |
|
||||
| [12](/12-rainRisk) \* | ![Completed][check] | [Link](/12-rainRisk/python) | [Link](/12-rainRisk/go) |
|
||||
| [13](/13-shuttleSearch) | ![Partially complete][partial] | [Link](/13-shuttleSearch/python) | |
|
||||
| [14](/14-dockingData) | ![Completed][check] | [Link](/14-dockingData/python) | [Link](/14-dockingData/go) |
|
||||
| 15 | ![Not yet attempted][pending] | | |
|
||||
| 16 | | | |
|
||||
| 17 | | | |
|
||||
| 18 | | | |
|
||||
| 19 | | | |
|
||||
| 20 | | | |
|
||||
| 21 | | | |
|
||||
| 22 | | | |
|
||||
| 23 | | | |
|
||||
| 24 | | | |
|
||||
| 25 | | | |
|
||||
| Day | | Python | Go |
|
||||
| -------------------------------- | ------------------------------ | ----------------------------------------- | --------------------------------- |
|
||||
| [1](/01-reportRepair) | ![Completed][check] | [Link](/01-reportRepair/python) | [Link](/01-reportRepair/go) |
|
||||
| [2](/02-passwordPhilosophy) | ![Completed][check] | [Link](/02-passwordPhilosophy/python) | [Link](/02-passwordPhilosophy/go) |
|
||||
| [3](/03-tobogganTrajectory) | ![Completed][check] | [Link](/03-tobogganTrajectory/python) | [Link](/03-tobogganTrajectory/go) |
|
||||
| [4](/04-passportProcessing) | ![Completed][check] | [Link](/04-passportProcessing/python) | [Link](/04-passportProcessing/go) |
|
||||
| [5](/05-binaryBoarding) | ![Completed][check] | [Link](/05-binaryBoarding/python) | [Link](/05-binaryBoarding/go) |
|
||||
| [6](/06-customCustoms) | ![Completed][check] | [Link](/06-customCustoms/python) | [Link](/06-customCustoms/go) |
|
||||
| [7](/07-handyHaversacks) | ![Completed][check] | [Link](/07-handyHaversacks/python) | [Link](/07-handyHaversacks/go) |
|
||||
| [8](/08-handheldHalting) | ![Completed][check] | [Link](/08-handheldHalting/python) | [Link](/08-handheldHalting/go) |
|
||||
| [9](/09-encodingError) | ![Completed][check] | [Link](/09-encodingError/python) | [Link](/09-encodingError/go) |
|
||||
| [10](/10-adapterArray) | ![Completed][check] | [Link](/10-adapterArray/python) | [Link](/10-adapterArray/go) |
|
||||
| [11](/11-seatingSystem) \* | ![Completed][check] | [Link](/11-seatingSystem/python) | [Link](/11-seatingSystem/python) |
|
||||
| [12](/12-rainRisk) \* | ![Completed][check] | [Link](/12-rainRisk/python) | [Link](/12-rainRisk/go) |
|
||||
| [13](/13-shuttleSearch) | ![Partially complete][partial] | [Link](/13-shuttleSearch/python) | |
|
||||
| [14](/14-dockingData) | ![Completed][check] | [Link](/14-dockingData/python) | [Link](/14-dockingData/go) |
|
||||
| [15](/15-rambunctiousRecitation) | ![Partially complete][partial] | [Link](/15-rambunctiousRecitation/python) | |
|
||||
| 16 | | | |
|
||||
| 17 | | | |
|
||||
| 18 | | | |
|
||||
| 19 | | | |
|
||||
| 20 | | | |
|
||||
| 21 | | | |
|
||||
| 22 | | | |
|
||||
| 23 | | | |
|
||||
| 24 | | | |
|
||||
| 25 | | | |
|
||||
|
||||
<!-- PARSE END -->
|
||||
|
||||
|
|
28
15-rambunctiousRecitation/README.md
Normal file
28
15-rambunctiousRecitation/README.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
# [Day 15: Rambunctious Recitation](https://adventofcode.com/2020/day/15)
|
||||
|
||||
### Related
|
||||
|
||||
* [Numberphile - Don't Know (the Van Eck Sequence)](https://www.youtube.com/watch?v=etMJxB-igrc)
|
||||
|
||||
<details><summary>Script output</summary>
|
||||
|
||||
```
|
||||
❯ python .\python\
|
||||
AoC 2020: day 15 - Rambunctious Recitation
|
||||
Python 3.8.5
|
||||
|
||||
Test cases
|
||||
1.1 pass
|
||||
1.2 pass
|
||||
1.3 pass
|
||||
1.4 pass
|
||||
1.5 pass
|
||||
1.6 pass
|
||||
2.1 pass
|
||||
|
||||
Answers
|
||||
Part 1: 206
|
||||
Part 2: 955
|
||||
```
|
||||
|
||||
</details>
|
40
15-rambunctiousRecitation/info.json
Normal file
40
15-rambunctiousRecitation/info.json
Normal file
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"year": "2020",
|
||||
"day": "15",
|
||||
"title": "Rambunctious Recitation",
|
||||
"testCases": {
|
||||
"one": [
|
||||
{
|
||||
"input": "0,3,6",
|
||||
"expected": 436
|
||||
},
|
||||
{
|
||||
"input": "1,3,2",
|
||||
"expected": 1
|
||||
},
|
||||
{
|
||||
"input": "1,2,3",
|
||||
"expected": 27
|
||||
},
|
||||
{
|
||||
"input": "2,3,1",
|
||||
"expected": 78
|
||||
},
|
||||
{
|
||||
"input": "3,2,1",
|
||||
"expected": 438
|
||||
},
|
||||
{
|
||||
"input": "3,1,2",
|
||||
"expected": 1836
|
||||
}
|
||||
],
|
||||
"two": [
|
||||
{
|
||||
"input": "0,3,6",
|
||||
"info": "other test cases ommitted because part two takes quite a while",
|
||||
"expected": 175594
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
77
15-rambunctiousRecitation/python/__main__.py
Normal file
77
15-rambunctiousRecitation/python/__main__.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
import json
|
||||
import platform
|
||||
import sys
|
||||
|
||||
from rich import print
|
||||
|
||||
from partOne import partOne
|
||||
from partTwo import partTwo
|
||||
|
||||
|
||||
def run_tests(test_cases):
|
||||
do_tests = True
|
||||
if len(test_cases) == 0:
|
||||
do_tests = False
|
||||
elif len(test_cases["one"]) == 0 and len(test_cases["two"]) == 0:
|
||||
do_tests = False
|
||||
|
||||
if not do_tests:
|
||||
print("Info: no test cases specified. Skipping tests\n")
|
||||
return
|
||||
|
||||
print("Test cases")
|
||||
|
||||
def rt(tcs, f, n):
|
||||
for i, tc in enumerate(tcs):
|
||||
print(f"{n}.{i+1} ", end="")
|
||||
expectedInt = tc["expected"]
|
||||
result = f(str(tc["input"]))
|
||||
if result == expectedInt:
|
||||
print("[green]pass[/green]")
|
||||
else:
|
||||
print(f"[red]fail[/red] (got {result}, expected {expectedInt})")
|
||||
|
||||
rt(test_cases["one"], partOne, 1)
|
||||
rt(test_cases["two"], partTwo, 2)
|
||||
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
info = open("info.json").read()
|
||||
except FileNotFoundError:
|
||||
print("Error: could not open info.json")
|
||||
sys.exit(-1)
|
||||
|
||||
info = json.loads(info)
|
||||
|
||||
year = info["year"]
|
||||
day = info["day"]
|
||||
title = info["title"]
|
||||
|
||||
print(f"[yellow]AoC {year}[/yellow]: day {day} - {title}")
|
||||
print(f"Python {platform.python_version()}\n")
|
||||
|
||||
try:
|
||||
challenge_input = open("input.txt").read()
|
||||
except FileNotFoundError:
|
||||
print("Error: could not open input.txt")
|
||||
sys.exit(-1)
|
||||
|
||||
if "vis" in sys.argv:
|
||||
import visualise
|
||||
|
||||
print("[green]Running visualisation....[/green]")
|
||||
|
||||
visualise.visualise(challenge_input)
|
||||
sys.exit()
|
||||
|
||||
run_tests(info["testCases"])
|
||||
|
||||
if "debug" in sys.argv:
|
||||
sys.exit()
|
||||
|
||||
print("Answers")
|
||||
print("Part 1:", partOne(challenge_input))
|
||||
print("Part 2:", partTwo(challenge_input))
|
26
15-rambunctiousRecitation/python/common.py
Normal file
26
15-rambunctiousRecitation/python/common.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
from typing import List, Tuple
|
||||
|
||||
|
||||
def find_value_n(instr:str, threshold:int) -> Tuple[int, List[int]]:
|
||||
inp = [int(x) for x in instr.strip().split(",")]
|
||||
|
||||
indexes = {}
|
||||
|
||||
for i, n in enumerate(inp):
|
||||
indexes[n] = i
|
||||
|
||||
while len(inp) < threshold:
|
||||
c = len(inp) - 1
|
||||
previous_number = inp[c]
|
||||
|
||||
occurences = indexes.get(previous_number, None)
|
||||
new_number = 0
|
||||
|
||||
if occurences is not None:
|
||||
new_number = c - occurences
|
||||
|
||||
indexes[previous_number] = c
|
||||
|
||||
inp.append(new_number)
|
||||
|
||||
return inp[-1], inp
|
6
15-rambunctiousRecitation/python/partOne.py
Normal file
6
15-rambunctiousRecitation/python/partOne.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from common import *
|
||||
|
||||
|
||||
def partOne(instr: str) -> int:
|
||||
x, _ = find_value_n(instr, 2020)
|
||||
return x
|
6
15-rambunctiousRecitation/python/partTwo.py
Normal file
6
15-rambunctiousRecitation/python/partTwo.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from common import *
|
||||
|
||||
|
||||
def partTwo(instr: str) -> int:
|
||||
x, _ = find_value_n(instr, 30000000)
|
||||
return x
|
Loading…
Add table
Add a link
Reference in a new issue