refactored
This commit is contained in:
parent
354c655b19
commit
69cf76cf9e
1 changed files with 73 additions and 0 deletions
73
2020/22/22_refactored.py
Normal file
73
2020/22/22_refactored.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
def read_file():
|
||||
with open("input_sample.txt") as f:
|
||||
p1, p2 = f.read().split('\n\n')
|
||||
p1 = p1.split('\n')[1:]
|
||||
p2 = p2.split('\n')[1:]
|
||||
p1 = list(map(int, p1))
|
||||
p2 = list(map(int, p2))
|
||||
return p1, p2
|
||||
|
||||
def combat(p1,p2):
|
||||
while True:
|
||||
c1 = p1.pop(0)
|
||||
c2 = p2.pop(0)
|
||||
if c1 > c2:
|
||||
p1 += [c1, c2]
|
||||
else:
|
||||
p2 += [c2, c1]
|
||||
if len(p1) == 0:
|
||||
return p2
|
||||
if len(p2) == 0:
|
||||
return p1
|
||||
|
||||
def part1():
|
||||
p1, p2 = read_file()
|
||||
winner_deck = combat(p1, p2)
|
||||
score = 0
|
||||
for i, card in enumerate(reversed(winner_deck)):
|
||||
score += (i+1)*card
|
||||
return score
|
||||
|
||||
def recursive_combat(p1, p2):
|
||||
seen = set()
|
||||
while True:
|
||||
# does p1 auto-win?
|
||||
state = (tuple(p1), tuple(p2))
|
||||
if state in seen:
|
||||
return 1, p1
|
||||
seen.add(state)
|
||||
# does anyone win by normal rules?
|
||||
if len(p1) == 0:
|
||||
return 2, p2
|
||||
break
|
||||
if len(p2) == 0:
|
||||
return 1, p1
|
||||
# draw cards
|
||||
c1 = p1.pop(0)
|
||||
c2 = p2.pop(0)
|
||||
# should we recurse?
|
||||
if len(p1) >= c1 and len(p2) >= c2: # play recursive round
|
||||
winner, deck = recursive_combat(p1[:c1],p2[:c2]) # copy that many cards
|
||||
if winner == 1:
|
||||
p1 += [c1, c2]
|
||||
else: # winner == 2
|
||||
p2 += [c2, c1]
|
||||
else: # play normal round
|
||||
if c1 > c2:
|
||||
p1 += [c1, c2]
|
||||
else: # c2 > c1
|
||||
p2 += [c2, c1]
|
||||
|
||||
def part2():
|
||||
p1, p2 = read_file()
|
||||
winner, winner_deck = recursive_combat(p1, p2)
|
||||
score = 0
|
||||
for i, card in enumerate(reversed(winner_deck)):
|
||||
score += (i+1)*card
|
||||
return score
|
||||
|
||||
def main():
|
||||
print(part1(),part2())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue