Skip to content

Commit 47f11af

Browse files
committed
Added day 2020-23
1 parent f4f4c16 commit 47f11af

File tree

2 files changed

+314
-0
lines changed

2 files changed

+314
-0
lines changed

2020/23-Crab Cups.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# -------------------------------- Input data ---------------------------------------- #
2+
import os, grid, graph, dot, assembly, re, itertools
3+
from collections import Counter, deque, defaultdict
4+
5+
from compass import *
6+
from simply_linked_list import *
7+
8+
9+
# This functions come from https://github.com/mcpower/adventofcode - Thanks!
10+
def lmap(func, *iterables):
11+
return list(map(func, *iterables))
12+
13+
14+
def ints(s: str):
15+
return lmap(int, re.findall(r"-?\d+", s)) # thanks mserrano!
16+
17+
18+
def positive_ints(s: str):
19+
return lmap(int, re.findall(r"\d+", s)) # thanks mserrano!
20+
21+
22+
def floats(s: str):
23+
return lmap(float, re.findall(r"-?\d+(?:\.\d+)?", s))
24+
25+
26+
def positive_floats(s: str):
27+
return lmap(float, re.findall(r"\d+(?:\.\d+)?", s))
28+
29+
30+
def words(s: str):
31+
return re.findall(r"[a-zA-Z]+", s)
32+
33+
34+
test_data = {}
35+
36+
test = 1
37+
test_data[test] = {
38+
"input": """389125467""",
39+
"expected": ["92658374 after 10 moves, 67384529 after 100 moves", "149245887792"],
40+
}
41+
42+
test = "real"
43+
input_file = os.path.join(
44+
os.path.dirname(__file__),
45+
"Inputs",
46+
os.path.basename(__file__).replace(".py", ".txt"),
47+
)
48+
test_data[test] = {
49+
"input": open(input_file, "r+").read(),
50+
"expected": ["45286397", "836763710"],
51+
}
52+
53+
54+
# -------------------------------- Control program execution ------------------------- #
55+
56+
case_to_test = 1
57+
part_to_test = 2
58+
59+
# -------------------------------- Initialize some variables ------------------------- #
60+
61+
puzzle_input = test_data[case_to_test]["input"]
62+
puzzle_expected_result = test_data[case_to_test]["expected"][part_to_test - 1]
63+
puzzle_actual_result = "Unknown"
64+
65+
66+
# -------------------------------- Actual code execution ----------------------------- #
67+
68+
69+
if part_to_test == 1:
70+
moves = 100
71+
for string in puzzle_input.split("\n"):
72+
cups = [int(x) for x in string]
73+
74+
for i in range(moves):
75+
cur_cup = cups[0]
76+
pickup = cups[1:4]
77+
del cups[0:4]
78+
79+
try:
80+
dest_cup = max([x for x in cups if x < cur_cup])
81+
except:
82+
dest_cup = max([x for x in cups])
83+
cups[cups.index(dest_cup) + 1 : cups.index(dest_cup) + 1] = pickup
84+
cups.append(cur_cup)
85+
86+
print(cups)
87+
88+
pos1 = cups.index(1)
89+
puzzle_actual_result = "".join(map(str, cups[pos1 + 1 :] + cups[:pos1]))
90+
91+
else:
92+
moves = 10 ** 7
93+
nb_cups = 10 ** 6
94+
95+
class Cup:
96+
def __init__(self, val, next_cup=None):
97+
self.val = val
98+
self.next_cup = next_cup
99+
100+
string = puzzle_input.split("\n")[0]
101+
next_cup = None
102+
cups = {}
103+
for x in string[::-1]:
104+
cups[x] = Cup(x, next_cup)
105+
next_cup = cups[x]
106+
107+
next_cup = cups[string[0]]
108+
for x in range(nb_cups, 9, -1):
109+
cups[str(x)] = Cup(str(x), next_cup)
110+
next_cup = cups[str(x)]
111+
112+
cups[string[-1]].next_cup = cups["10"]
113+
114+
cur_cup = cups[string[0]]
115+
for i in range(1, moves + 1):
116+
# #print ('----- Move', i)
117+
# #print ('Current', cur_cup.val)
118+
119+
cups_moved = [
120+
cur_cup.next_cup,
121+
cur_cup.next_cup.next_cup,
122+
cur_cup.next_cup.next_cup.next_cup,
123+
]
124+
cups_moved_val = [cup.val for cup in cups_moved]
125+
# #print ('Moved cups', cups_moved_val)
126+
127+
cur_cup.next_cup = cups_moved[-1].next_cup
128+
129+
dest_cup_nr = int(cur_cup.val) - 1
130+
while str(dest_cup_nr) in cups_moved_val or dest_cup_nr <= 0:
131+
dest_cup_nr -= 1
132+
if dest_cup_nr <= 0:
133+
dest_cup_nr = nb_cups
134+
dest_cup = cups[str(dest_cup_nr)]
135+
136+
# #print ("Destination", dest_cup_nr)
137+
138+
cups_moved[-1].next_cup = dest_cup.next_cup
139+
dest_cup.next_cup = cups_moved[0]
140+
141+
cur_cup = cur_cup.next_cup
142+
143+
puzzle_actual_result = int(cups["1"].next_cup.val) * int(
144+
cups["1"].next_cup.next_cup.val
145+
)
146+
# #puzzle_actual_result = cups[(pos1+1)%len(cups)] * cups[(pos1+2)%len(cups)]
147+
148+
# -------------------------------- Outputs / results --------------------------------- #
149+
150+
print("Case :", case_to_test, "- Part", part_to_test)
151+
print("Expected result : " + str(puzzle_expected_result))
152+
print("Actual result : " + str(puzzle_actual_result))
153+
# Date created: 2020-12-23 06:25:17.546310

2020/23-Crab Cups.v1.py

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# -------------------------------- Input data ---------------------------------------- #
2+
import os, grid, graph, dot, assembly, re, itertools
3+
from collections import Counter, deque, defaultdict
4+
5+
from compass import *
6+
from doubly_linked_list import *
7+
8+
9+
# This functions come from https://github.com/mcpower/adventofcode - Thanks!
10+
def lmap(func, *iterables):
11+
return list(map(func, *iterables))
12+
13+
14+
def ints(s: str):
15+
return lmap(int, re.findall(r"-?\d+", s)) # thanks mserrano!
16+
17+
18+
def positive_ints(s: str):
19+
return lmap(int, re.findall(r"\d+", s)) # thanks mserrano!
20+
21+
22+
def floats(s: str):
23+
return lmap(float, re.findall(r"-?\d+(?:\.\d+)?", s))
24+
25+
26+
def positive_floats(s: str):
27+
return lmap(float, re.findall(r"\d+(?:\.\d+)?", s))
28+
29+
30+
def words(s: str):
31+
return re.findall(r"[a-zA-Z]+", s)
32+
33+
34+
test_data = {}
35+
36+
test = 1
37+
test_data[test] = {
38+
"input": """389125467""",
39+
"expected": ["92658374 after 10 moves, 67384529 after 100 moves", "149245887792"],
40+
}
41+
42+
test = "real"
43+
input_file = os.path.join(
44+
os.path.dirname(__file__),
45+
"Inputs",
46+
os.path.basename(__file__).replace(".py", ".txt"),
47+
)
48+
test_data[test] = {
49+
"input": open(input_file, "r+").read(),
50+
"expected": ["45286397", "836763710"],
51+
}
52+
53+
54+
# -------------------------------- Control program execution ------------------------- #
55+
56+
case_to_test = "real"
57+
part_to_test = 2
58+
59+
# -------------------------------- Initialize some variables ------------------------- #
60+
61+
puzzle_input = test_data[case_to_test]["input"]
62+
puzzle_expected_result = test_data[case_to_test]["expected"][part_to_test - 1]
63+
puzzle_actual_result = "Unknown"
64+
65+
66+
# -------------------------------- Actual code execution ----------------------------- #
67+
68+
69+
if part_to_test == 1:
70+
moves = 100
71+
for string in puzzle_input.split("\n"):
72+
cups = [int(x) for x in string]
73+
74+
for i in range(moves):
75+
cur_cup = cups[0]
76+
pickup = cups[1:4]
77+
del cups[0:4]
78+
79+
try:
80+
dest_cup = max([x for x in cups if x < cur_cup])
81+
except:
82+
dest_cup = max([x for x in cups])
83+
cups[cups.index(dest_cup) + 1 : cups.index(dest_cup) + 1] = pickup
84+
cups.append(cur_cup)
85+
86+
print(cups)
87+
88+
pos1 = cups.index(1)
89+
puzzle_actual_result = "".join(map(str, cups[pos1 + 1 :] + cups[:pos1]))
90+
91+
else:
92+
moves = 10 ** 7
93+
nb_cups = 10 ** 6
94+
cups = DoublyLinkedList(True)
95+
96+
for string in puzzle_input.split("\n"):
97+
for cup in string:
98+
cups.append(cup)
99+
100+
new_cups = {
101+
str(i): DoublyLinkedListElement(str(i), None, None)
102+
for i in range(10, nb_cups + 1)
103+
}
104+
for key, cup in new_cups.items():
105+
if key != "10":
106+
cup.prev_element = new_cups[str(int(key) - 1)]
107+
if key != str(nb_cups):
108+
cup.next_element = new_cups[str(int(key) + 1)]
109+
new_cups["10"].prev_element = cups.elements[string[-1]]
110+
new_cups[str(nb_cups)].next_element = cups.elements[string[0]]
111+
112+
cups.elements.update(new_cups)
113+
cups.elements[string[-1]].next_element = new_cups["10"]
114+
cups.elements[string[0]].prev_element = new_cups[str(nb_cups)]
115+
116+
del new_cups
117+
118+
print([(i, cups.elements[str(i)]) for i in map(str, range(1, 15))])
119+
120+
cur_cup = cups.start_element
121+
# #print (cups.elements)
122+
for i in range(1, moves + 1):
123+
print("----- Move", i)
124+
# #print (','.join([x.item for x in cups.traverse(cups.start_element)]), cur_cup.item)
125+
126+
cups_moved = [
127+
cur_cup.next_element,
128+
cur_cup.next_element.next_element,
129+
cur_cup.next_element.next_element.next_element,
130+
]
131+
cups_moved_int = list(map(lambda i: int(i.item), cups_moved))
132+
# #print ('Moved cups', [x.item for x in cups_moved])
133+
134+
cups.delete_by_value(cur_cup.next_element)
135+
cups.delete_by_value(cur_cup.next_element)
136+
cups.delete_by_value(cur_cup.next_element)
137+
138+
dest_cup_nr = int(cur_cup.item) - 1
139+
while dest_cup_nr in cups_moved_int or dest_cup_nr <= 0:
140+
dest_cup_nr -= 1
141+
if dest_cup_nr <= 0:
142+
dest_cup_nr = nb_cups
143+
dest_cup = cups.find(str(dest_cup_nr))
144+
145+
# #print ("Destination", dest_cup_nr)
146+
147+
cups.insert(dest_cup, cups_moved)
148+
cur_cup = cur_cup.next_element
149+
150+
pos1 = cups.find("1")
151+
puzzle_actual_result = int(pos1.next_element.item) * int(
152+
pos1.next_element.next_element.item
153+
)
154+
# #puzzle_actual_result = cups[(pos1+1)%len(cups)] * cups[(pos1+2)%len(cups)]
155+
156+
# -------------------------------- Outputs / results --------------------------------- #
157+
158+
print("Case :", case_to_test, "- Part", part_to_test)
159+
print("Expected result : " + str(puzzle_expected_result))
160+
print("Actual result : " + str(puzzle_actual_result))
161+
# Date created: 2020-12-23 06:25:17.546310

0 commit comments

Comments
 (0)