summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d22.py
blob: 01b9a4c55abab25010403a80b29db9ba667092bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#advent of code 2020
#day 22
#some problems with copying, modifying, accessing data between functions
#had a bit of workarounds
#Im too lazy to reduce the amount of code 
#by including part1 and part2 in a single function

def NormalCombat(player1, player2):
	decks = dict();
	decks[0] = player1.copy();
	decks[1] = player2.copy(); 
	while len(decks[0]) > 0 and len(decks[1]) > 0 :
		card0 = decks[0].pop(0);
		card1 = decks[1].pop(0);		
		if card0 > card1:
			decks[0].append(card0);
			decks[0].append(card1);
		elif card0 < card1:
			decks[1].append(card1);
			decks[1].append(card0);
	score = 0;
	for deck in decks:
		if len(decks[deck]) == 0: continue;
		for c, card in enumerate(decks[deck]):
			score += (len(decks[deck])-c)*card
		break;
	return score;

def RecursiveCombat(player1, player2):
	decks = dict();
	decks[0] = player1.copy();
	decks[1] = player2.copy(); 
	previoushands = dict();
	previoushands[0] = [];
	previoushands[1] = [];
	while len(decks[0]) > 0 and len(decks[1]) > 0 :
		if tuple(decks[0]) in previoushands[0] and tuple(decks[1]) in previoushands[1]:
			return 0, None;
		previoushands[0].append(tuple(decks[0]));
		previoushands[1].append(tuple(decks[1]));
		card0 = decks[0].pop(0);
		card1 = decks[1].pop(0);
		if card0 <= len(decks[0]) and card1 <= len(decks[1]):
			winner, winscore = RecursiveCombat(decks[0][:card0],decks[1][:card1]);
		elif card0 > card1:
			winner = 0;
		elif card0 < card1:
			winner = 1;
		playedcards = [card0,card1];
		decks[winner].append(playedcards[winner]);
		decks[winner].append(playedcards[(winner+1)%2]);
	score = 0;
	for deck in decks:
		#print(decks[deck]);
		if len(decks[deck]) == 0: continue;
		for c, card in enumerate(decks[deck]):
			score += (len(decks[deck])-c)*card
		winplayer = 0 + deck;
		break;
	return winplayer, score;

PuzzleInput = open("22.in","r").read();
playerdata1, playerdata2 = PuzzleInput.split("\n\n");
playerdecks = dict();
for pi, playerdata in enumerate( [playerdata1,playerdata2] ):
	playerdecks[pi] = [int(val) for val in playerdata.split("\n")[1:] if val != ""];

p1 = NormalCombat(playerdecks[0],playerdecks[1]);
print("part 1 =",p1);
_, p2 = RecursiveCombat(playerdecks[0],playerdecks[1]);
print("part 2 =",p2);
print('''part 1 = 34664
part 2 = 32018
''');