mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement day 22 part 1
This commit is contained in:
44
2019/aoc2019/day22.py
Normal file
44
2019/aoc2019/day22.py
Normal file
@@ -0,0 +1,44 @@
|
||||
from typing import List, TextIO
|
||||
|
||||
|
||||
def shuffle(instructions: List[str], deck_size: int) -> List[int]:
|
||||
deck = list(range(0, deck_size))
|
||||
|
||||
for instruction in instructions:
|
||||
if "new stack" in instruction:
|
||||
deck = list(reversed(deck))
|
||||
continue
|
||||
|
||||
parts = instruction.split(" ")
|
||||
if parts[0] == "cut":
|
||||
by = int(parts[1])
|
||||
|
||||
new_deck = deck[by:]
|
||||
new_deck += deck[:by]
|
||||
|
||||
deck = new_deck
|
||||
else:
|
||||
increment = int(parts[3])
|
||||
|
||||
new_deck = list(range(0, deck_size))
|
||||
target_index = 0
|
||||
|
||||
for card in deck:
|
||||
new_deck[target_index] = card
|
||||
target_index = (target_index + increment) % len(deck)
|
||||
|
||||
deck = new_deck
|
||||
|
||||
return deck
|
||||
|
||||
|
||||
def part1(data: TextIO):
|
||||
instructions = [line.strip() for line in data]
|
||||
|
||||
result = shuffle(instructions, 10007)
|
||||
|
||||
for i, card in enumerate(result):
|
||||
if card == 2019:
|
||||
return i
|
||||
|
||||
raise Exception("Did not find card")
|
||||
43
2019/tests/test_day22.py
Normal file
43
2019/tests/test_day22.py
Normal file
@@ -0,0 +1,43 @@
|
||||
import pytest
|
||||
|
||||
from aoc2019.day22 import shuffle
|
||||
|
||||
SAMPLE_INSTRUCTIONS = [
|
||||
"""deal with increment 7
|
||||
deal into new stack
|
||||
deal into new stack""",
|
||||
"""cut 6
|
||||
deal with increment 7
|
||||
deal into new stack""",
|
||||
"""deal with increment 7
|
||||
deal with increment 9
|
||||
cut -2""",
|
||||
"""deal into new stack
|
||||
cut -2
|
||||
deal with increment 7
|
||||
cut 8
|
||||
cut -4
|
||||
deal with increment 7
|
||||
cut 3
|
||||
deal with increment 9
|
||||
deal with increment 3
|
||||
cut -1""",
|
||||
]
|
||||
|
||||
CORRECT_SHUFFLES = [
|
||||
"0 3 6 9 2 5 8 1 4 7",
|
||||
"3 0 7 4 1 8 5 2 9 6",
|
||||
"6 3 0 7 4 1 8 5 2 9",
|
||||
"9 2 5 8 1 4 7 0 3 6",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize('instructions,correct', zip(SAMPLE_INSTRUCTIONS, CORRECT_SHUFFLES))
|
||||
def test_shuffle(instructions, correct):
|
||||
instructions = [line.strip() for line in instructions.splitlines()]
|
||||
|
||||
correct = [int(i) for i in correct.split(" ")]
|
||||
|
||||
result = shuffle(instructions, 10)
|
||||
|
||||
assert result == correct
|
||||
Reference in New Issue
Block a user