Compare commits

...
10 Commits
Author SHA1 Message Date
0x01FE 75982f2b96 Solved 2025 Day 6 Parts 1 & 2 2025-12-06 18:02:41 -06:00
JISAUAY d5d846ab0c started 2025 day5 parts 1 & 2 2025-12-05 14:03:39 -06:00
JISAUAY 4fe4802afc Solved 2025 Day 3 Parts 1 & 2 2025-12-03 10:46:19 -06:00
JISAUAY 14a422d4e2 solved 2024 Day 2 Parts 1 & 2 2025-12-02 14:36:16 -06:00
0x01FE cc2ff9309d kind of started day2 p1 2025-12-02 11:15:32 -06:00
JISAUAY 1a711cd261 Solved 2025 Day 1 Parts 1 & 2 2025-12-01 14:23:49 -06:00
JISAUAY 4f07ea9f81 solved day14 2025-03-12 13:27:15 -05:00
JISAUAY 26d6292256 solved day13 part 2 2025-03-10 16:36:58 -05:00
JISAUAY adb6512003 did day10 and day12 part 1 2025-03-10 15:18:35 -05:00
0x01FE 078c7dc82c solved day13 p1 2025-03-10 14:45:13 -05:00
66 changed files with 15586 additions and 0 deletions

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
543213210349876210129890176034034565966563210587109092121
656104101236762121456761789125120677877432101498218187030
787215678945643012369852652196541986778943452387367256541
898764101223454921058943543087632345657654363456456349654
234459814312367838901012634678983954108932276545234438743
105308765101298987632108768901017873217841189034105698894
076218965290345676543289457632124561678750025121236787101
987987874387654989123498398543401410589867014240901223218
128876210260123478004567212898532323475678923457816314509
019564320178874565213216500187645654129854503966765405678
323469834569982104304307431234578765036763212875896876989
767878706521676235425498120110569834545678923214387932376
876967017430501543216326013223432728901298012103098541205
985054328941432652107817154370121112854347543892107670314
834123217632965469234908965987430004761256556701256789323
729654306541874678945699874876548123450236789210345430110
618783210930123012876789103765659874210101654345014521221
105690129850019823498632212014567865321256789765623012434
104941010761236710567541003423438978762349809854789923455
203832123450145623456410212789829569451056012343210854396
312745898567876514589321345657810438342347898901345765987
405656776343998105679430103456910123239897687432216705476
512346785434867234578345612765878762101798576521009812345
694567698123452105507656709894349656123603401098967826565
783878981030143245412349814763234341014512032367654983456
012969976543201236093218923452123210012432145456543452187
121001876124210187187108765421005391143465434505412341093
321232565035303298296089012321016789834874328212303433282
210543458749456334345676521056525470765966019301601214101
109851239658765478034785435437434321014987458456732105010
238760548789678969123699876348945610523456367234845256723
321017656698767056782176501267876525676789210105996367894
438998765589850145891089437678801234989654101986087458965
567321996434743234106543228769960145676543243877124349896
675490887525612103257890119454877658983450112568233210787
587586716014101678965432001323768943232162103499545012345
896675105003234567876721017012057890123078213487636776596
745564234123098656989830398701146321265459812345629889487
932213047894187765216541235610235430876343501676712012376
871302120765276894307890344320145210901265430989800193401
560456961294345653210787653410236389810178125476543287632
410367854386543464678876544567107458103269076398389326543
321298765677812104589965433218998567234387681267276410014
123457654308903243218760129809889234985898790354105569123
016534567210211038909678978321010125676787063203234678874
105673898323302347874541065410981589094543154112356787965
234982765432423456743232456723873672187612267053543298874
122801894541510161250101365834712543870101348765632107985
021289843690678870367010212945603434983289659054901001276
130126732784569965478101204988914301874378778123892104345
245035011098430156789678345677765210165134589104743077656
356544324567821025898569101056879321051021678201654988745
987676543056932110185430202346978432896120214312345679034
678989432108945523679021312567566543787034305478943456123
549034549087876654578110453498754694986545456967012987101
432123678896521783063234569787103785675676567852173985432
101210510123430192154345478776212656548989656743089876501
+66
View File
@@ -0,0 +1,66 @@
with open('input.text', 'r') as file:
data: list[str] = file.readlines()
topo_map = [[int(c) if c != '.' else -1 for c in line.strip()] for line in data]
x_bound: int = len(topo_map[0]) - 1
y_bound: int = len(topo_map) - 1
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, o) -> bool:
return o.x == self.x and o.y == self.y
def in_bounds(c: Coord) -> bool:
if c.y > y_bound or c.y < 0:
return False
if c.x > x_bound or c.x < 0:
return False
return True
def score_trail(c: Coord, last: int | None = 0) -> list[Coord]:
if not in_bounds(c):
return None
v: int = topo_map[c.y][c.x]
if v == 9:
return [c]
if v - last != 1 and last != 0:
return None
up, down, left, right = Coord(c.x, c.y - 1), Coord(c.x, c.y + 1), Coord(c.x - 1, c.y), Coord(c.x + 1, c.y)
nines = []
for dir in [up, down, left, right]:
if in_bounds(dir):
if topo_map[dir.y][dir.x] - v == 1:
for nine in score_trail(dir, v):
if nine not in nines:
nines.append(nine)
return nines
total = 0
for y, line in enumerate(topo_map):
for x, n in enumerate(line):
if n == 0:
total += len(score_trail(Coord(x, y)))
print(total)
+61
View File
@@ -0,0 +1,61 @@
with open('input.text', 'r') as file:
data: list[str] = file.readlines()
topo_map = [[int(c) if c != '.' else -1 for c in line.strip()] for line in data]
x_bound: int = len(topo_map[0]) - 1
y_bound: int = len(topo_map) - 1
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def in_bounds(c: Coord) -> bool:
if c.y > y_bound or c.y < 0:
return False
if c.x > x_bound or c.x < 0:
return False
return True
def score_trail(c: Coord, last: int | None = 0) -> int:
if not in_bounds(c):
return 0
v: int = topo_map[c.y][c.x]
if v == 9:
return 1
if v - last != 1 and last != 0:
return 0
up, down, left, right = Coord(c.x, c.y - 1), Coord(c.x, c.y + 1), Coord(c.x - 1, c.y), Coord(c.x + 1, c.y)
dirs = []
for dir in [up, down, left, right]:
if in_bounds(dir):
if topo_map[dir.y][dir.x] - v == 1:
dirs.append(score_trail(dir, v))
return sum(dirs)
total = 0
for y, line in enumerate(topo_map):
for x, n in enumerate(line):
if n == 0:
total += score_trail(Coord(x, y))
print(total)
+8
View File
@@ -0,0 +1,8 @@
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
+140
View File
@@ -0,0 +1,140 @@
DDDDDDDDDDDDDDDDDHHHHHHDDDDBBBBBBBBBBBBBBBBBBBBBBBBBAKAAQQRRRGGGGGGGGZZGAQRQRQQQQQQQCCCCCCCCCCCCCCCZZEZJZZZZZZZZZZZZZZUUUUUUUUUUUUUIIIIIIIII
DDDDDDDDDDDDDDDDDHHHHDDDDDDBBBBBBBBBBBBBBBBBBBBBBBBAAAAAQQRRRRRRGGGGGGGGAQRQQQQQQQQQQQCCCCCCCCCCCCCCZZZZZZZZZZZZZZZZZZZZUUUUUUUUUUUUIIIIIIII
DDDDDDDDDDDDDDDHDDHHDDDDDDDBBBBBBBBBBBBBBBBBBBBBBBBAAXAAQARRRRRRGGGGGGKKAQQQQQQQQQQQQQQQCCCCYCCCYCCCZZZZZZZZZZZVVZZZZZZZVUUUUUUUUUUUIIIIIIII
DDDDDDDDDDDDDDDHHHHDDDDDDDDDDDBBBBBBBBBBBBBBBBBBAAAAAAAAAARRRRRRRGGKGGKKQQQQQQQQQQQQQCQQCCCCYYCCYYYCZZZZZZZZZZZVVVZZVZVVVUUUUUUUUUUUUIIIIIII
DDDDDDDDDDDDDDJDDDDDDDDDDDDDDDBBBBBBBBBBBBBBBBBBAAAAAAAAAAAORRRRGGGKKGKKQQQQQQQQQQQQQCCCCCCCYYCYYYYYYZZZZZZZVVVVVUVVVVVVUUUUUUUUUUUUIIIIIIII
DDBBDDDDDDDDDDJJDDDDDDDDDDDDDDBBBBBHBBBBBBBBBBBBBAAAAAAAAAARRRRRRGGKKKKKKQQQQQQQQQQRRRRCCCCCCYCYYYYYYZZZZZZZVVVVVVVVVVVVUUWUUUUUUUUUIIIIIIII
DDDBBDDDBDDDDDJDDDDDDDDDDDDDPBBBBBBBRRBBBBBBBBBBAAAAAAAAAAARRRRRRGEEKKKKKQPQQQQQQQQFRRRRRCCCCYYYYYYYYZZZZZZZZVVVVVVVVVVVVUUVVVUUUUUUIIIIJIII
DDDBBBBBBBDDDJJDDDDDDDDDDDDDPPPBBBBBBBBBGGGBBBBBBBAAAAAAAAAARRXXKKKKKKKKKQPPQPPQQQQQRRRRRRCCCYYYYYYYYZVYYZHZPPVVVVVVVVVVVVVVVVVVLUUUIIJJJJJI
DDBBBBBBBIDDDDDDDDDDDDDDDDDPPPPBBBBBDDLLGLLBBBBBBBBBAAAAAAAAARKKKKKKKKKKKQPPPPPQRRRRRRRRRRRCCCYYYYYYYYYYYZHZYVVVVVVVVVFVVVVVVLLVLQQQQIQQQJII
DDBBBBBBIIDCDHDDDDDDDDDDDDDPPPPPPBBBDLSLLLLLBBBBBBBBBLAALLBBBBBBKBKKKKKKKQPPPPPPPRRRRRRRRRRRCCCEYYYYYYYYYYYYYVVVVVVFFFFFVVVVVVLLLQQQQQQQQJII
MDBBBBBBBBCCDCDPPDDDDDDDDDPPPPPPUBBBDLLLLLLLLLBBBBBBBLALLLBBBBBBBBKKKKKKKKKKKPPPRRRRRRRRRRRREEEEEYYYYYYYYYYYYYYVVVVFFFFFVVVLVVLLLQLQQQQQIIIQ
MMBMMBBBCBCCCCCPPPDDDDDDDDPPPPPPUBBBBLLLLLLLLLBBBBBBVVVVVVBBBBSSBBKKKKKKKKKPZZZZZRRRRRRRRRRRDEEEEYYYYYYYYYYYYYYYVFFFFFFFVLLLLLLLLLLQQQQQQQQQ
MMMMMBBBCCCCCCCPPPDDDDDDNDPPPPPUUUUULLLLLLLLLLBBSBBBVVVVVVVBSSSSSKKKKKKPPPPPZZZZZRRRRRRRRRRDDDEEEYYYYYYYYYYYYYYYFFFFFFFFFWLLLLLLLLLJJJJQQQQQ
MMMMCCCCCCCCCCCCCCWDDDDDDUUPPPPUUUUUULLLLFFLLBBBSSSSVVVVVVVVVVVVVVVOOKKPPPPPZZZZZZRRRRRRRRRDDDEEYYEYYYYYAFYYYYYFFFFFFFFWWWWLLLLLLLLJJJJJQQQQ
MMMMMCCCCCCCCCCCCCCHHHHDDUUUUUUUUUUUUUFLFFFSLSSSSSSSVVVVVVVVVVVVVVVOOEEPPMPPZZZZZZRRRRRRRDDDDDDEEEEEYYYYAAAYYFFFFFFFFFWWWWLLLLLLLLLMJQQQQQQQ
MMMMMCCCCCCCCCCCCCCHHHHHUUUUUUUUUUUUFFFFFFFSLPSSSSSSVVVVVVVVVVVVVVVOOEEPMMPPZZZZZZRRRRRRRDDDDDEEEEEEEYYYAAAFFFFFFFFFFFWWWWLLLLLLLLLLQQQQQQQQ
MMMMCCCCCCCCCCCCUUUHHHHUUUUUUUUUUUQQFFFQFFFSSSSSSSSSVVVVVVVVVVVVVVVOEEEPMMMMZZZZZZRRRRKKKMMDDGGGEEEEQAAAAAAFFFFFFFFFFFFWLLLLLLLLLLLLQQQQQQQQ
MMMMMCCCCCCCCCCCUUUUHHHHHHHHHHHHUUQQQQQQFFSSSSSSSSSSVVVVVVVVVVVVVVVEEEEEDDDMZZZZZZRRRRKKKMMMMGGGGGGEAAAAAJJJJJJJJJJFFFFLLLLLLLLLLLLQQQQQQQNN
MMTMMMMCCCZZCUAUUUUUHHHHHHHHHHHHUUQQQQQQQFSSSSSSSSSSVVVVVVVVVVVVVVVNDDEEDDDDZZZZZZRRBRRKKKMMMMMGGGEEPAAAAJJJJJJJJJJFFAFFLLLLLLLLLLLLQQQQQQQN
MMTMTTMCCCZZZUAAUUUUHZHHHHHHHHHHUUUQQQQQQFFSSSSSSSSSVVVVVVVVVVVVVVVNNDDDVDDDZZZZZBRRBRRKMKMMMMMGGGGEPAAAAJJJJJJJJJJFFAAALLLLLLLLLLLLQNQQQQNN
MMTTTTTTCZZZUUUUUUUUUZZHHHHHHHHHUUUQQQQQFFFSSSSSSSSSVVVVVVVVVVVVVVVSSDDDDDDDZZZDDBBBBBBMMKKMMMMMMMGMAAAAAJJJJJJJJJJFFAAAALLLLLLLLLLQQNNNQNNN
TTTTTTTTZZZUUUUUUUUUEEZHHHHHHHHHHFUQQQFFFFFFSFSSSSSSVVVVNNNNNNNNNNNNNADDDDDDZZZDDBBBBBBMMMKMMMMMMMMMAAAAAJJJJJJJJJJAAAAAALLWWJLWLLLLQNNNNNNN
TTTTTTTZZZZZZZUUUUUUEUAHHHHHHHHHHHHHHHHFFFFFFSSSSSSSVVVVNNNNNNNNNNNNNADDDDDDZZZDDDDBBMMMMMMMMMMMMMMMAACFAJJJJJJJJJJAAAAAAACCCCCCWLLLQNNNNNNN
TTTTTTTZZZZZZZUUUUUUUUUHHHHHHHHHHHHHHHHFFFFFSSSSSSSSVVVVNNNNNNNNNNNNNAAADDDDZZZIIDBBBBMHMMMMMMMMMMMMFFFFFJJJJJJJJJJAAAAAAACCCCCCLLLWWNNNNNNN
TTTTTTTZZZZZZZZZUUUUUUUHHHHHHHHHHHHHHHHHFFSSSSSSSSSSSSSSSNNNNNNNNNNNAAJDDDDDZZZIIDDBBHHHHMMMMMMMMMMMFUFFFJJJJJJJJJJAAAAAAACCCCCCWWWWWNNNNNNN
TTTTJJOJZZZZZZZZZUUUUEUZZZZZZHHHHHHHHHHHFFFFFSSSSXXXXSNNNNNNNNNNNNNNNNJJDDDDZZZIIIIIBBHHMMMRMMMFFMFFJJJJJJJJJJJJJJJAAAAAAACCCCCCWNNWNNNNNNNN
TTCJJJJJJJWZZZZZZZUUUZZZHHHHHHHHHHHHHHHHFFFFFSSSSXXXXNNNNNNNNNNNNNNNNNJDDDDDZZZIIIIIHHHHMMMMMMMMFFJJJJJJJJJJJJJJJJJAAAAAACCCCCCCWNNNNNNNNNNN
CCCJWWJJJJWZZZZZZZZZZZZZHHHHHHHHHHHHHHHHFFFFFFXSXXXXXXNNHHNNNNNNNNNJJJJJDDDDDDDDIIIIHHHHMMMMMMMMFJJJJJJJJJJJJJFAAAACCAAAACCCCCCCWWWNNNNNNNNN
CCCWWWWJWWWWZZZZZZZZZZZOHHHHHHHHHHHHHHHHFFFFFFXXXXXXXXNHHHNNWNNNNNNJJJJJJDDDDDDIIIIHHHHHHHHMMMMMFJJJJJJJJJJJJJJJAAACCCCACCCCCCCCWDWNNWNNNNNN
WWWWWWWJWWWWZZZZZZZZZZZZZZYYYYYZHHHHHHHHYYWWWWWWWWXXXXNHHHNWWWWWNNNNJJJJJDDDDDDDIIIHHHHHHHHHHHMMMJJJJJJJJJJJJJJJACCCCCCCCCCCCCCCWWWWMWNNNNNN
OWWWWWWWWWWWWWZZZZZZZZZZWWYYYYYYYYHHHHHHYFWWWWWWWWXXXXXNHHHWWWWJRNRJJJJJDDJJJJIIIIHHHHHHHHHHMMMMMFJJJJJJJJJJJJJJCCCCCCCCCCCCCCCCWWWWWWWNNNNN
OOWWWWWWWWWWWWZZZZZZZZZZYYYYYYYYYYHHHHHHYYWWWWWWWWFXXXRVHHHWWRRRRRRJJJJJJJJJJJJJIIHHHHHHHHHHMMBBMFFFXXJJJJJJJJJJCCCCCCCCCCCCCCCCWWWWWWWNNNNN
OOOOWWWWWWWWWWZZZZZZZZZZYXYYYYYYYYHHHHHHYYWWWWWWWWFXXXVVVHIIWRRRRRJJJJJJJJJJJJJJIIIMHHHHHHHBBBCBMMMFXXJJJJJJJJJJCCCCCCCCCCCCCCWWWWWWWWWNNNNN
OOWWWWWWWWWWWWWZZZZZZZZZZZZYYYYYYYHHHHHHEEWWWWWWWWFFFVVVHHHIRRRRRRRJJJJJJJJJJJJJZIIHHHHHQHHBBBBBMMBBFFJJJJJJJJJJCCCCCCCCCCCCCCCCCWWWWWNNNNNN
OOWWWWWWWWWWWWZZZZZZWWWWWWZYYYYYYYYEEEESSYWWWWWWWWFVVVVVVHHRRRRRRJJJJJJJJJJJJJZZZZTAAAHAABBBBBBBBBBBBKJJJJJJJJJJCCCCCCCCCCCCCCCCCWWWWWWWNNNN
WWWWWWWWWWWWWWWTTZZZWWWWWWVYVYYYYSYYYYYSSSWWWWWWWWYIVNNNVRRRRRRRRJJJJJJJJJJJJZZZZTTAAAAAABBBBBBBBBBBKKJJJJJJJJJCCCCCCCCCCCCCCCCCCWWWVSSNNNNN
WWRRRWWLVWWLWSTTWWWWWWWWWWVVVYYYSSSSSYSSSSWWWWWWWWYIINNNHRRRRRRRRRJJJJJJJJJJJZZZZAAAAAAAAABBBBBBTTBBYYJJJJJJJJJCCCCCCCCCCCCCCCCCCWWWSSSSNNNN
RWRRRRRLVVWLLTTTWWWWWWWWWVVVVYYSSSSSSSSSSSWWWWWWWWYNNNNNRRRRRRRRRRRLJJJJJJJJZZZZAAAAAAAAAAAABBBBBLYYYYYKKKKKKKKCTTTTTCCCCCCCCCCCCWWWSSSSNSNN
RRRRRRRLLLLLTTTTWWWWWWWWWVVVVVSSSSSSSSSSSWWWWWWWWWYINNNNNRRRYRRRRRRLLJJEEJJJJZZZAAAAAAAAAAAAABBMLLYLLYYKKKKKTKKTTTTTTTCGCCCCCCCCCWWWSSSSSSNN
RRRRRRLLLLTTTTTTWWWWWWXWWVVVVSSSSSSSSSSSSWWWWWWWWYYYYNNNNNRNSSURRRLLLLJEEGJJJZZZZZZAAAAAAAAAABBMLLLLYYYYKKZKTTKTTTTGGGGGGCCCCCCCCWTTSSSSNNNN
RRRRRRLLLLLVTTTTTTTWWWWWWWWVVSSSSSSSSSSSSWWWWWWWWYYYYNNNNNNNSSURRRRLLLGGGGBJJJZZZZAAAAAAAAAAABBBLLLLTTTTKKKTTTTTTTGGGGGGGCCCCGGTTWTTSSSGSNNN
RRRRRRLLLLLTTTTTTTTTWWTTTWVVVSSSSSSSSSSSSWWWWWWWWYYYYNNNSNNSSSSSSGGGGGGGGOJJQZZZZZVAAAAAAAAAVVVLLLLLTTTTKKKTTTTTTGGGGGGGGGGGGGGTTTTSSSSSSSNN
RRRRRRRLLLLTTTTTTTTTWTTTTTVVVSJSSSSDSSSSSSSWWWWWWYYYYNNSSSSSSSYYYGGGGGGGGGMJZZZZZZVVAAAAAAAVVVVLLLLLTTTKKKKKTTTTTGGGGGGGGGGGGGGTGGTSSSSSSSNN
RRRRRLRLLLLLLLTTTTTTTTTTTTVVVSJSSDDDSSSSSSSSTYYYYYYYYNNSSSSSSSGYGGGGGGGGGGGJJJJZZVVVAAAAAAAAAAVLLLLSSTTTTTKTTTTTTTGGGGGGGGGGGGGGGGSSSSSSNNNN
RRRLLLLLLLLLLTTTTTTTTTTTTTTTVJJJJJWDSSSSSSSSTTYYYYYYYNNSSSSSSSGGGGGGGGGGGGGGJJJZZZAAAAAAAAAAAAVLLLLSSTTTTTTTTTTTTTGGGGGGGGGGGGGGGGSSSSSSSNNN
RRRRRLLLLLLLTTYTTTTTTTTTTTTTVJJJJJDDSSSSSSTTTTYYYYYYYPPSSSSSSSGGGGGGGGGGGGGJJJJJJVVAAAVAAAAAAALLNLLNNNNTTTTTTTTTTATAGGGGGGGGGGGGGGLSSSSSSSNN
RRRRLLLLLLLLLTTTTTTTTTTTTKTTVJJJJJDDEEESSETTTTYYYYYKYPKSSSSSSSSGGSSSGGGGGGGGJJJJJVVVVVVVAAAAXXXLNNNNNKNNNNNTTTTTTAAAGGGGGGGGGGGGGLLSLLSSSSNN
RRRRLLLLLLLLLLWTTTTHTTTKKKTKKJJJJJJJHEESEEEYTKYGGGGKKKKSSSSSSSSGSSSSGGGGGGYGJJJJVVVVVVVVVAAXXXXLNNNNNKNNNNNNTTTAAAAAGGGGGGGGCGGGQCLLLLSSSSSS
RRRRLLLLLLLLLLLNRTTTTTTKKKKKKJJJJJJJJEEEEEYYTTAAAAAAAAAKSMSSSSSSSSSGGGGGGGGGGGGJVVVVVVVVKKXXXXXXNNNNNNNNNNNTTAAAAAAAGAGGGGGCCJGGQCLLLLSSSSSS
RRRRRLLLLLLNNXNNNMMMTTTKKKKKKJJJJJJJEEEEEEGGGGAAAAAAAAAKMMSSSSSSSSSGGGGGGGGGWWGVVVVVVVVVKKXGXXXNNNNNNNNNNNNAAAAAAAAAAAEGGCCCCCCCCCLLLLLSSSSS
RRRRRRLLLLLNNNNNNNMMMMMKKKKKKKJJJJJJJJEEEEENGGAAAAAAAAAKSSSSFFFFFFFSSZGGGGWWWWWVVVVVVVVVVKKXXXXNNNNNNNNNNNNAAAAAAAAAAAEAQCCCCCCCCCLLLLLSLSSS
RRRRRLLLNNLNNNNNNMMMKKKKKKKKKKKYJJJEEEEEEEENGGAAAAAAAAASSSSSFFFFFFFSGGGGWWWWWGGVVVVVVVVVVVVXXXXNNNNNNNNNNNNQQQQAAAAAAAAAAAACCCCCCCLLLLLLLSSS
RRRRRLLLLNNNNNNNNNNNKKKKKKKKKXKEJEEEEEEEEENNGGAAAAAAAAAJJSSSFFFFFFFSSSWWWWWWWWVVVVVVVVVVXXXXXXXXNNNNNNNNNNQQQQQAAAAAAAAALLACCCCCCCLLLLLLLTSS
RJZRQLLLAANNNNNNNNNKKKKKKKVKKKEEEEEEEEEEEEENNGAAAAAAAAAKSSSFFFFFFFFWWWWWWWWWWWWVVVVVVVVVXXXXXXXXNNNNNNNNNNQQQQQAAAAAAAAAAACCCCCCCCLLLLLTTTSS
JJJJJAALANNNNNNNNNNNKKKKKVVKKKKEEEEEEEEEEEEEEGAAAAAAAAAUSSSFFFFFFFFFFFWWWWWWWWWWVVVVVVZVVVXXXXXXNNNJNNNNNNNNQQAAQQQAAAAAACCCCCCCCCLLLTLTTTTT
JJJJJAAAANNNNNNNNNNNNKKVKVVVVVKEEEEEEEEEEEEEJJAAAAAAAAAUUUUFFFFFFFFFFFWWWWWWWWWWVVVVVZZVVVXXXXXXXXXXNJNNNNNNQQQQQQAAAAAAACCCCCCCCLLLTTTTTTTT
JJJJAAAAAOOONNNNNNNNNKKVVVVVVVVVEEEEEEEEEEEEJJAAAAAAAAAUUUUFFFFFFFFFFFWWWWWWWWWWVVVVVZVVVVVXXKXXXXXXXXNNNQQQQQQQQQQAAAAAAACCCCCCCLLTTTTTTTTT
JJJJJAAOOOOONNNNNNNNKKKVVVVVVVVVVEEEEEEEEEEEEJAAAAAAAAAUUUUFFFFFFFFFFFWWWWWWLLWVPVVVVVVVVVVXKKXXXXXXXXXQQQQQQQQQQQQAAAARQQCCCCCCCCCCTTTTTTTT
JJJJAAAAOOOOOOOOOONNKKKVVVVVVVVVVEEEEEEEEEEEEJJJMGGFFUUUUUNFFFFFFFFFFFWWWLLWLLTVVVVVVVVVVVVGGKKKKKKKJXXQQQQQQOQOQQQQQQAAQCCCCCCCCCGCTTTTTTTT
JJAAAAOOOOOOOOOOFFNNNVVVZZVVVVVVVVVFFEFFEEEEJJJMMMFFFFFFFFFFFFFFFFFFFFGWWLLLLLTVVVVVVVVVVVVGKKKKKKKQKKKQQQQQQOOOOQOOQQQQQCCCCCCCCGGGIITTTTTT
HJJAAAOOOOOOOOOOFFNNVVVVZZZZZZFVVVFFFFFFEEJJJJJMMMFFFFFFFFFFGGGGGFFFFFFFFFFLLLLLVVVVVVVVVVVVKKKKKKKKKKOOQQOUOOOOOOOQQQQQQQCCCCCCCIIIIIIIIITT
AJAAAAOOOOOOOOOOFFFNVVVVZZZZZZFFVFFFFFFFEEVJJJMMMMMFTFFFFFFFGGGGGFFFFFFFFFFLLLLLLVVVVVVVVVKVKKKKKKKKKOOOOOOOOOOOOOOQQQQQQQCCCCCCTTIIIIIIIITT
AAAAAAAOOOOOOOOOFFFFQQVVZZZZZZZFFFFFFFFFEEVVJJMMMMTTTFFFFFFFNNGGGGGGGFFFFFFLLLLLVVVVVVVVKKKKKKKKKKKKKOOOOOOOOOOOOOOOQQQQQQQQCQQFIIIIIIIITTTT
AAAAAAAOOOOOOOOOOOQFQQQZZZZZZZZZFFFFFFFFFVVVJJJJJTTTTTTTTCCNNNGGGGGGGFFFFFFLLLLLVVXOVVKKKKKKKKKKKKKKKKOOOOOOOOOOOOOQQQQQQQQQQQQFIIIIIIIIITTT
AAAAAAAAOOOOOUOOOOQQQQQQZZQZZZQFFFFFFFFVVVVVVJJJTTTTTTTTTCCGGGGGGGGGFFFFFFFLLLLLOOOOOVVKVKKKKKKKKKKKKKOOOOOOOOOOOOJJJJJJQQQQQQFFFIIIIIIIIITT
AAAAAAAOOOUOOUOQQQQQQQQQQQQQQQQQFFFFJJFJJJVVVJJJTTTTTTTTTTCCGGGGGGGGFFFFFFLLLLLLOOOOOVVVVKOKKKKJKKKKKKOOOOOOOOOOOJJJJJJJQQQQQQFFFFIIIIIITTTT
AAAAAAAAOOUUUUUTQQQQQQQQQQQMQQQQQFFJJJJJJJVVVJJTTTQTTTTTTTCGGGGGGGGGFFFFFFFFFYLOOOOOOVVVVVKKKKJJKKKKKKOOOOOOOOOOOOJJJJJJJJQQFFFFFFIIIIITTTTT
AARAAAAAOUUTUTTTTQQQQQQQQQQQQQQQQFFJJJJJJJVVVJJJJJTTTTNNNNNFGGGGGAGGFFFFFFFFFYOOOOOOBVVVVVJJJJJJJJJJOOOOOOOOMMOOOJJJJJJJJJQFFFFFFFIIIIITTTTT
AAAQQAAAATTTTTQQQQQQQQQQQQQQQQQZZJJJJJJJJJVVVJJJJJTTHHHHHNFFRFGAAAAAAAAAFFFFFOOOOOOOOOJJJJJJJJJJJRJJJJJOOOMJMMOOOJJJJJJJJJFFFFFFFIIIIITTTTTT
AQQQQQAAAATTTTQQQQQQQQQQQQQQQQQZJJJJJJJJJJJJJJJJJJJTHHHHHFFFFFAAAAAAAAAAFFFFFOOOOOOOOOJJJJJJJRRRRRJJJOOOOOMMMMMMMJJOJJJJJJJFFFFGGLIIIGGTTTTT
QQQQQVVAVATTTTQQQQQQQQQPPPPPQZQZZZZZJJJJJJJJJJJJJJJJHHHHHFFFFFFFAAAAAAAAFFFFFAAAAAAOOOJJJJJJJRRRRRRJJJOOOOOMMMMMMMCJJJJJJJJFFFFGGGIIIGTTTTTT
QQQQQQVVVVKKTTQQQVVQQQQQQAPLZZZZZZAZJJJJJJJJQQJQJJJJHHHHHFFFFFFFFAAAAAAAFFFFFAAAAAAOJJJJJJJJJRJRRJJJJJOOJJOMMMMMMMMMMJJJJJJGGGGGGEEEGGGTTTTT
QQQQQQVVVVVVVVVVVVVQQQQQQALLLLPZZAAAJJJJJQQQQQQQQJJJHHHHHFFFFFFFFAFQQAQAFFFFFAAAAAAOOJJJJJJJJJJRRJJJJJJJJJOOMMMMMMMJJJJJJJUUGGGGGEEGGGTTTTTT
QQQQQQVVVVVVVVVVVVVQQQQQQQLLLPPZAAAAJJJJQQQQQQQQQQQJHHHHHFFFFFFBFFFQQQQQFFFFFAAAAAAOOOFJJJJJJJJJJJJJJJJJJJOOMMMMMMMMMMMJJUUGGGGGGGGGGGTTTTTT
SSSQQSFVVVVVVVVVVVVVVQQQQLLLHHHAAAAAARJAAOQQQQQQQQQQHHHHHFFFFFFFFFFQQQQQQAAAAAAAAAAFFFFJJJJXJJJJSJJJJJJJJJOOMMMMMMMMMMMMMUUGGGGGGGGGGGGTTTTT
PSSSSSSVVVVVVVVVVVVVVLLLQQLLHHHPAAPPPRROOOOOQQQQQQQQHHHHHFFFFFFFFFMQQQQQQAAAAAAAAAAFFFFFFFXXXXJSSSJJJJPJOOOOOMUMMMMMMMMMMMUGGGGGGGGGGGGGTOTO
SSSSSSSSSVVVVVVVVVVVVLLLQQLLHHHPPPPPRROOOOOOOOQQQQQQHHHHHFFFFFFFGGGQQQQQQAAAAAAAAAAFFFFFFFXXXXSSSJJJOOJJJOOOOMMMMMMMMMMMUUUGGGGGGGGGGGGTTOOO
SSSSSSSSSSSVVVVVVVVVLLLLLQLLHHHHHHPPOOOOOOOOQQQQQQQGGGGGGFFFFFFGGQGQQQQQQAAAAAAAAAAFFFFFFFXXXSSSTJJJOOOOOOOOOMMMMUMUMUMMUGGGGGGGGGGGGGGGGOOO
SSSSSSSSSSVVVVVVVVVVVQQLLLLLHHHHHHPOOOOOOOOOOQQQQQQGGGGGGFFFFGGGGQQQQQQQQAAAAAAAAAAFFFFFFXXXLSSSSJJYOOOOOPOOOOMMMUUUUUUUUGGGGGGGGGGGGGGGGOOO
SSSSSSSSSSVVVVVVVVVNNQQLLLLPHHHHHHOOOOOOOOOOQQQQQQGGGGGGGFFFFGGGQQQQQQQQQAAAAAAAAAAFFFFFFXZXSSSSSTYYOYHOPPOOOMMQQQUUUUUUUGGGGGGGGGGGGGOGGOOO
SSSSSSSSSSVVVVVVVQVVQQQQQLLLLHHHHHOOOOOOOOOOOOQQQQGGGGGGGGFFGGGGQQQQMMQQQQQQQYYYYYYFFFFFZZZXYSSSSYYYYYYYPQQQQQQQQQQQQUUUGGGGGFNGGGGGGGOOOOOO
SSSSSSSSSSVVVVVVVQNNQQQQLLLLLLZOOOOOOOOOWWOOOQQQQQQQQGGGGGGGGGGGGGGGMMMMQQQQQYYYYYYFFFFFZZZYYSSSSYYYYYYYQQQQQQQQQQQQQLLUGFFGGFGGEOGGOOOOOOOO
SSSSSSSSSSVVVVVVVQQQQQQQQLLLLZZOOOOOOWOWWWOOOQQQQQQQQQQGGGGGGGGGGGGGMMMMQQYYYYYYYYYFFFFFYZYYYYYSYYYYYYYYQQQQQQQQQQQQQZLULLFFFFGGOOOGOOOOOOOO
SSSSSSSSSSSVVQQVVVQQQQQQQUUUZZZZZOOOOWWWWWWWOOOQQQQQQQQGQQGGGGGGGGGMMMMMMMYYYYYYYYYYYFLLYYYYYYYYYYYYYYYYQQQQQQQQQQLQLLLLLLFFFFGFFOOOOOOOOOOO
SSSSSSSSSSMVVQQQQQQQQQUUQUUUUZZZZZZOOWWWWWWWEEEPQQQQQQQQQQGGGGGGGGGMMMMMMMMMMYYYYYYYYYYYYYYYYYYYYYYYYYYYYQQQQQQQLLLLLMLLLLLLLFFFFFOOOOOOOOOO
FSSSSSSSSSMVVQQQQQQQQUUUUUUUUZZZZZZWWWWWWWWWEPPPPPPQQQQQQQGGGGGGGGMMMMMMMMMMYYYYYYYYYYYYYYYYYYYYYYYYYYYYQQQQQQQQQQLLLLLLLLLLLFFFFOOOOOOOOOOO
FIIIAASSSMMMQQQQQQQQQUUUUUUUVZZZZWWWWWWWWWWEEPPPPTPPQQQQQQGGQGGGGGGMMMNMMYYYYYYYYYYYYYTTVYYYYYYYUYYYYYYYQQQQQQQQQQQLLLLLLLLLLFFFSSOOOOOOOOOO
FFIIIISSMMMQQQAQQQQQQQQUUUUUVVZZZWWWWWWWWWWPPPPPPPPQQQQQQQQQQQGGGGGMMMMMYYYYYYYYYYYYYYTTVYYYYUYYUUYYYYYYYQQQQQQQQQLLLLLLLLLLLFEESSAWWOOOOOOL
IIIIMMMMMMMMMMQQQQQQQQQUUULQQVVQAWWWWWWWWPPPPPPPPPPQQQQQQQQQQGGGGGGMMMMMTYYYYYYYYYYYYYTTVYZYYUUUUUUUYYYYQQQQQQQQQQLXLLLLLLLLEEEESSAWWWOOLLLL
QQIIIQQMMMMMMMQQQQQQQQQUUKKQQQQQQQWWWWWWWPPPPPPPPPPQQQQQQQQQQGGGGGGMFMMMTYYYYYYYYYYYYTTTTTYYYUUUUUUUUYYYYQQQQQQQQQQQLLLLLLLLLEEEEEAWWWWOLLLL
QQIIQQQMMMMMMMMKKKKKKKKKKKKQQQQQQQKWWWWJWPPPPPPPPPPQEQQQQQQQQQGGGWGGGMMMTTTTYYYYYYYYTTTTTTYYYUUUUUUUUYYYQQQQQQQQQXXLLLLLLLLLLLEEEEAWLWWLLLLL
QQIQQQQQQMMMMMMKKKKKKKKKKKKQQQQQWWWWWWWJPPJJPPPPPPPPQQQQQQQQQQGGCGGGCMMMMKKYYYYYYYYTTTTTTTTTULUUUUUUUYYYYQQQQQQQXXXXKXLGGGGLLLEEEEALLWLLLLLL
QQQQQQQQQQMQMMKKKKKKKKKKKRQQQQQQQWWWWJJJJJJJJPPPPPPQQQQQQQQQQQGGCCGGGAMKKKKYYYKYYYYTTTTTTTTTUUUUUUUUUYYYYYQQQXXXXXXXXXXGGGGLLEVEEAALLLLLLLLL
QQQQQQQQQQQQQMMKKKKKKKKKKKQQQQQQQWWWWWJJJJJJJJJPPPPQQQQDDDDDQQQQCCCGGKMKKKKKKKKYYYYITTTTTTTTUUUUUUUUUUYYYQQQQQXXXXXXXXXGGGGGGGGGLLLLLLLLLLLL
QQQQQQQQQQQMMMKKKKKKKKKKKKYQQQQQQQQJJJJJJJJJJJPPPDDDDDDDDDDDYXXPPPPPPKKKKKKKKKKKYYNNTTTTTTTUUUUUUUUULLUUYYQQQQSXXXXXXXXGGGGGGGGGLULLLLLLLLLL
QQQQQQQQQQQMMMKKKKKKKKKKKYYQQQQQQQJJJJJJXJJJJPPPPDDDDDDDDDDDDDDDYPPPPKKKKKKKKKKKYYNNTTTTSTTTUUUUUUUUUUUUUUQQSSSXXXXXXXXGGGGGGGGGUULLLLLLLLLL
QCCQQQQQQQQQMMMMKKKKKKKKKYYQQQQQQCJJJXXXXXXXXPPPPDDDDDDDDDDDDDDDBBPPKKKKKKKKKKKKKKNTTNNPSSSSUUUUUUUUUUUUSSSSSSSSSXGGGGGGGGGGGGGGUUULLUULLLLL
CCCCCCQQQQQQQQMMKKKGKKKKYYYYYYQQQCJJJXXXXXXDDDDDDDDDDDDDDDDDDDDDYBPPKKKKKKKKKKKKKKNNTNPPPSPSPUUUUUUUUUUUUSSSXXXSFXGGGGGGGGGGGGGGUUUUUUAAAALL
CCCCCQQMMMQMMMMMQKGGGKKKYYYYYYNNNJJJJXXXXXXDDDDDDDDDDIQDDDDDYYYJYYYKKKKKKKKKKKKKKKKNNNPPPPPSPPPPPPIUUUUUUUUSXXXXXXGGGGGGGGGGGGGGEEEUUUAAAALL
TTCCCCCSMMMMQMQQQGGGGBBBYYYYNNNNNNJJXXXXXXXDDDDDDDDDDEQDDDDDYYYYBBBBKKKKKKKKKKKKKKKNNPPPPPPPPPPPPPPUUUUUSSSSXXXXXXGGGGGGGGGGGGGGOEEUUUUAAALN
TTTTCCSSMQQQQQQQQQGGGBBBBYYNNNNNNNNNNXXXXXXDDDDDDDDDDEQDDDDDBBBBBBBBKKKKKKWWBBKKNOKNNNPPPPPPPPPPPPUUUUUSSSSSSXXXXXXXXXXXXXEEEEEOOQUUUQQQAANN
TTTTCCSSSSUQQQQQQQQBBBBBYYNNNNNNNNNXXXXXXXXDDDDDDDDDDEEDDDDDBBBBBBBIKWWWWWWWWWKKNNNNNNPPPPPPPPPPPPPUUUSSSSSSXXXXXXXXXXLXXXEEEEEOOQQQQQQQNNNN
TTTTTCSSSSSQQQQQJJBBBBBBBYNNNNNNNNNXXXXXXXXXXXXDDDDDEEEDDDDDBBBBBBIIIWWWWWWWWDKNNNNNNNNPPPPPPPPPPSSUSSSSSSSSXXSXXXXLLXLLXXEEEEEEQQQQQQQQNNNN
TTTTTCCSSSSSQQQQQQBBBBBBBYNZNNNNNNNNNNNNNXXXXXXDDDDDDDDDEBBBBBBBBBIIWWWWWWWWDDDDNNNNNNNPPPPPPPPSSSSSSSSSSSSSSSSSXXSSSXLLEEEEEEEEEEQQQQQGNGGG
TTTTTCCSSSSSQQQQBBBBBBBBYYNZNFFNENNUUNNNNXXXXXXDDDDDDDDDBBBBBBBBBBIIWWWWWWWWDZDNNMNNNNNPPPPPPPPSSSYSSSSSSSSSSSSSSSSSSLLLEEEEEEEEJJQQGGGGGGGG
TTTTCCCCCSSSQSQQSSBBBBBYYMMZZNNNNNNUNNNNNNNUUXEDDDDDDDDDBBBBBBBBBBIWWWWWWWWZZZZNNMMNNNNGPPPGSSSSSYYYYYSSISSSSSSSSISSSSSLEEOEEEEEEJJJGGGGGGGG
CCTCCCPPPSSSSSSSSSRRBBBYMMMZNNNNNNNNNNNNNNNUNNEDDDDDDDDDBBBBBBBBBIIWWWWWWWWZZZZZZNNNNZGGGPGGGSSSSYYYYSSSIIIIIIIIIIISQQSQSEOOEEEEJJJJGGGGGGGG
CCCCCCPPPPSPSSSSSSSRRRBYMMMMEENNNNNNNNNNNNNNNNEDDDDDDDDDBBBBBBBBBIIWWWWWWWWZZZZZZZZZZZGGGGGGYYYYYYYSSSSSIIIIIIIIIIIXQQQQQOOOOGEEJCJGBGGGGGGG
CCCCCCPPPPPPPPPPRRRRRRMMMMMMMMMNNNNNNNNNNNNNNEEDDDDDDDDDBBBBBBVBBBBBWWWWWWZZZZZZZZZZZZZGWGGGYYYYYYYYYSSSIIIIIIIIIXXXXQQQQOOOMCCCCCGGGGGGGGGG
UUCCCPPPPPPPPPPRRRRRRRMMMMMMMMNNNNNNNNQNNNNNNEEDDDDDDDDDBBBBBBVBBBBBWWWWWWZZZZZZZZZZZZWWWYGGYYYYYYYYYSSSIIIIIIIIIXXXQQQQQOOOCCCCCKKGHCGGGGGG
UUUUPPPPPPPPPPRRRRRRRRMMMMMMMMMMMNNNMNQQQNNNEEEEEEEEEEBBBBBBVVVVVBBBBWWWWWSZZZZZZZZZZZWWWYYYYYYYYYYYYYYSIIIIIIIIIXXQQQQOQOOOOCCCCCKCCCGGGGGG
UUUPPPPPPPPPPPRRRRRRRRRRMMMMMMMMNNNMMQQQQQBEEEEEEEEEEESBBVVVVVVVVVBVWWWWWWWZZZZZZZZZZZZWWYYYYYYYYYYYYYYIIIIIIIIIIIQQQQOOOOOOOCCCCCCCCGGGGGGG
UUUUUPPPPPPPPPRRRRRRRRRRMMMMMMMMMMMMMMQQQBBBBEEEEEEEESSSSLLVVVVVVVVVWWWWWWYZZZZZZZZZZZZZWYYYYYYYYYYYYYYYIIIIIIIIIICCCQQLOOOLCCCCCCCCCGGGGGGG
UUUUPPPPPPPRRPPRRRRRRRMRMMMMMMMMMMMMJMQQQQQBQQEEEEEEESSSSSSVVVVVVVVVVWWWCWZZZZZZZZZZZZZZWYWWYYYYYYYYYYYYTIIIIIIIIIIICQQLLLOLLCCCCCCCCCGGGGGG
UUUUPPPPPPRRRRRRRRRRRMMMMMMMMMMMMMMXXXXQQQQQQQEEEEESSSSSSSSSSVVVVVVVVSSIIWWZZZZZZZZZZZZZWWWWWWYYYYYYYBYYYIIIIIIIIIIIZZZZZLLLLCCCCCCCCCCGGGGG
UUUUXXPPXPPRRRRRRRRRRMMMMMMMMMMMMMMMXXXQQQQQQEEEEEESSSSSSSSSSSVVVVVHHIIIIZZZZZZZZZZZZZZWWWWWWYYYYYYYYYYYYYIIIIIIIIIZZZZZZLLLCCCCCCCCCCGGGGGG
UUUXXXXXXPPRRRRRRRRRRMRRMMMMMMMMMMMXXXXXQQQQQEEEEEEEQSSSSSSSSSSUVVVHHIIIIZZZIAZZCZZMZDDDDDDDWWYYYNNYYYYYYNIIIIIIIIIZZZZZLLLLCCCCCCCCCGGGGGGG
XXXXXXXGRRRRRRRRRRRRRRRRMMMQMMMMMMXXXXXXQQQQQQQEEQEEQQSSSSSSSSSUUUMMMIIIIIIIIICCCZZDDDDDDDDDWWYYYYNNYYYYYNNIIIIZZZIZZZLLLLLCCCCCCCCCCCGGGGGG
XXXXXXXGRRRRRRRRRJRRRRRRRRMQMMMMMJXXXXXXXQTTTQQQQQQQQQSSSSSSSSSSUMMMIIIIIIIIIICCZZZDDDDDDDDDWWWYPUNNNYYYYNIIIIIZZZZZZZZLLLLCCCCCCCCCCCGGGGGG
XXXXXXGGGRRRRGJJJJRRRRRRRJJMMMMJJJTXXXXXQQTTTQQQQQIIQQSSSSSSSSSSSMMMMIIIIIIIIIZZDDDDDDDDDDDDWWWPPUNNNNNNNNNNZZZZZZZZZZLLCCLCCCCCCCCCCGGGGGGG
XBBBXGGGGRGRGGUJJJJJRJRRRJJMMJJJJTTTXXXXQTTTTTTQQQIIISSSSISSSSSSSMMMMIIIIIIIIIZZDDDDDDZWDDDWWPPPUUNNNNNNNNNNNZZZZZZZZZZRRCCCCCCCCCCCSSGGGGGG
XBBBGGGGGGGGGGGGJJJJJJRJJJJJJJJJTTTTXXXXTTTTTTTQQIIGGSSSSISSSSMSSMMMMIIIIIIIIIZZDDDDDDZWDDDWWPPPUUNNNNNNNNNNNNNZZZRRZZZZRCCKCCCCCCCCCSSGGGHZ
BBBBGGGGGGGGGGGEJJJJJJJJJJJJJJJTTTTTTTXXTTTTTTTIIIIGIZZIIIISSSMMMMMMMMIIIIIIIIZZDDDDDDWWDDDWWPPPUUUNNNNNNNNNNNNZFZRRRRRRRRRKCCCCCCCCCCCGGGGZ
BBBGGGGGGGGGGGGGJJJJJJJJJJJJJJJJTTTTTTTTTTTTTTTIIIIIIIIIIIVVSMMMMMMMMMIIIIIIIIZZDDDDDDWWDDDWWWPUUUUNNNNNNNNNNNXFFFFRQRRRRRRCCRRCYYCLLLCZZZZZ
BBBGGGGGGGGGGJJGGJJJJJJJJJJJJJJJTTTTTTTTTTTTIIIIIIIIIIIIIIVISMMMMMMMMMIIIIIIIIIZZZZZZZZZDDDWWWWQQNNNNNNNNNNNNNXFFFFRRRRRRRRRRRRRRRCLZZZZZZZZ
BBBBGGGGGGGGGGJJJJJJJJJJJJJJJJJJJTTTTTTTTTTTTIIIIIIIIIIIIIIIMMMMMMMMVVJJJIIIIIIIIZZZZZZZWWWWWWQQQNNNNNNNNNNNNNXFRRFRRRRRRRRRRRRRRRRLZZZZZZZZ
BBBBBGGGGGGGGGJJJJJJJJJJJJJJJJJJJJJTTTTTTTTTTIIIIIIIIIIIIIIIIMMMMMMMMJJJJJJIIIIIIZZZZZZZWWWWWWQQQNNNNNNNNNNNNXXFXRRRRRRRRRRRRRRRRCCYSYZZZZZZ
BBBBGGGGGGGGGGGGJJJJJJJJJJJJJJJJJJJTTTTTTTTTTTIIIIIIIIIIIIIIIMMMMMMMMJJJJJJIIIIIIIIDZZZNWWWWWWQQNNNNNNNNNNNXNXXFXVVRRRRRRRRRRRRRRRRYYYYYZZZZ
BBGGGGGGGGGGGGGGGGCCCJJRJJJJJJJJJJTTTTTTFTTTTTIIIIIIIIIIIIIIIMMMMMJJJJJJJJJIIIIIIDDDZZZMWWWWWWWGGNHNNNNNNNNXXXXXXXRRXRRRRRRRRRRRRRRYYYYYZZZZ
BBBBBGGGGGMMMGOUUGCCJJYJJJJJJJJJTTTTTTTFFFTTTTIIIIIIIWIIIIIINMMMMMJJJJJJJJJIIIIIIIIDDMMMMXWWGGGGGGNNNNNNNNXXXXXXXXUXXIRRRRRRRRRRRYYYYYYZZZZZ
BBBBBBBGGGMMMUUUUUCCCNJJJJJJJJJJJJTTTFFFFFFFTTTWIIIIIWIIIIIINNMMMMMJJJJJJJJJTJIIIDDDDMMMMXLGVGGGGGGNNNXXXXIXXXXXXXXXXIRRXRRRRRRRYYYYYYYYZZZZ
BBBBBBGGGGMMMUUUUUUUUUJJJJJJJJJJJJTTTTFFFFFFQFEWIIIIWWIIIIIINMMMMMJJJJJJJJJJJJIDDDDDMMMMMXLGGGGGGGGGGNGXXXXXXXXXXXXXXIIXXRRRRRRRYYYYYYYYYZZZ
BBBBBBBBFFFMUUUUUUUUUUJJJJJJJJJJJJJGJJFFFFFFFFEWWWWWWWIWIIIIJJJMJJJJJJJJJJJJJJJDDDDDMMMMUXLGGGGGGGGGGNGXXXXXXXXXXXXXIIIXXRRRRRYYYYYYYYYYYYYY
BBBBBBFFFFFFFUUUUUUUUUJJJJJJJJJJJJJJJFFFFFFFFFFPWWWWWWWWIDDIJJJJJJJJJJJJJJJJDDDDDLLLLMUUUXGSGGGGGGGGGGGGXXXXXXXXXXXXIIIXXYRRRRYYYYYYYYYYYYYY
BBBBBBFFFFFFFFUUUUUUUUJJJJJDJVJJJJJJJFFFFFFFFFFWWWWWWWWWUJJJJJJJJJSSJJJJJJJJDDDDLLLLLUUUUUGGGGGGGGGGGGGGGXXXXXXXXXXXIXXXXYRRRYYYYYYYYYYYYYYA
BBBBBBBBFFFFFFFUUUUUUUJJZJJJJJJJJJJJFFFFFFFFFFFQWWWWWWWWUUJJJJJSSSSJJJJJJJJJDDDDLLLLLLLUUGGGGGGGGGGGGGGGGXOXXXXXXXXXXXXXXXXXRYYYYYYYYYYYYYYY
BBBBBBBFFFFXFUUUUUUUUUZZZJZZUJJJJJJJJJJJFFFFFFFQWWWWWWWWWUJJJLJJSSSSSSSJJJJJDLLLLLLLLLLLGGGGGGGGGGGGGGGGGXOXXXXXXXXXXXXXXXXWXYYYYYYYYYYYYYYY
BBBBBBBBUUUUUUUUUUUUUZZZZZZZUUJJJJJJJJFFFFFFFFFFMWWWWWWXXXUUJLLLLLSSSSSJJJDDDDLLLLLLLLUGGGGGGGGGGGGGGGGGGGGXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYY
BCBUUUBUUUUUUUUUUUUUZZZZZZZUUUJJJJJJJFFFFFFFFFFMMXXXWXXXXXUUJDLLLLSSSSSSJJJDDDDLDDLUUUUGGGGGGGGGGGGGGGGGGGGXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYWY
BCCUUUUUUWUUUUUUUUUUZZZZZZZZUUUUJJJJBFFFFFFFMMMMMMXXXXXUUUUUULLLLLSSSSSSJJJDDDDDDDDDURGGGGGGGGGGGGGGGGGGGGXXXXXXXGGXXXXXXXXXXYYYYYYYYYYYYYWW
+128
View File
@@ -0,0 +1,128 @@
with open('test.text', 'r') as file:
data: str = file.read()
gardens: list[list[str]] = [[c for c in line.strip()] for line in data.split('\n')]
x_bound: int = len(gardens[0]) - 1
y_bound: int = len(gardens) - 1
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def in_bounds(c: Coord) -> bool:
if c.y > y_bound or c.y < 0:
return False
if c.x > x_bound or c.x < 0:
return False
return True
def neighbor_count(c: Coord) -> int:
neighbors = 0
up, down, left, right = Coord(c.x, c.y - 1), Coord(c.x, c.y + 1), Coord(c.x - 1, c.y), Coord(c.x + 1, c.y)
v: str = gardens[c.y][c.x]
for direction in [up, down, left, right]:
if in_bounds(direction):
if gardens[direction.y][direction.x] == v:
neighbors += 1
return neighbors
# Uses a flood fill to find each region, and returns a region as a list of coordinates
def flood_fill(start: Coord) -> list[Coord]:
filled: list[Coord] = []
to_fill: list[Coord] = [start]
edges: list[tuple[int, Coord]] = [] # Each edge is a tuple of (direction unit vector, x or y depending on if left, right or up, down)
v: str = gardens[start.y][start.x]
while to_fill:
c = to_fill.pop()
filled.append(c)
up, down, left, right = Coord(c.x, c.y - 1), Coord(c.x, c.y + 1), Coord(c.x - 1, c.y), Coord(c.x + 1, c.y)
for direction in [up, down, left, right]:
if in_bounds(direction):
if gardens[direction.y][direction.x] == v:
if direction not in filled and direction not in to_fill:
to_fill.append(direction)
continue
unit_direction = c - direction
# Means it's up/down
if unit_direction.x == 0:
if (c.y, unit_direction) not in edges:
edges.append((c.y, unit_direction))
# Left / Right
else:
if (c.x, unit_direction) not in edges:
edges.append((c.x, unit_direction))
print(v, len(edges))
for edge in edges:
print(edge[0], edge[1])
return filled
def print_region(region: list[Coord]) -> None:
for member in region:
print(member, end=' ')
print()
for y, line in enumerate(gardens):
for x, char in enumerate(line):
print(char if Coord(x, y) in region else ' ', end='')
print()
# Part 1
total_cost = 0
checked = gardens.copy()
for y, line in enumerate(gardens):
for x, char in enumerate(line):
if checked[y][x] == "-1":
continue
region = flood_fill(Coord(x, y))
area = len(region)
perimeter = 0
for member in region:
perimeter += 4 - neighbor_count(member)
for member in region:
checked[member.y][member.x] = '-1'
total_cost += area * perimeter
# print(f'A region of {char} plants with price {area} * {perimeter} = {area * perimeter}')
print(f'Total Cost: {total_cost}')
+5
View File
@@ -0,0 +1,5 @@
EEEEE
EXXXX
EEEEE
EXXXX
EEEEE
+1279
View File
File diff suppressed because it is too large. Load diff
+65
View File
@@ -0,0 +1,65 @@
import re
BUTTON_A_COST = 3
BUTTON_B_COST = 1
MAX_PRESSES = 100
with open('input.txt', 'r') as file:
data: list[str] = file.readlines()
machines = []
for i in range(0, len(data), 4):
button_a = [int(n) for n in re.findall('[0-9]+', data[i])]
button_b = [int(n) for n in re.findall('[0-9]+', data[i+1])]
prize = [int(n) for n in re.findall('[0-9]+', data[i+2])]
machines.append([button_a, button_b, prize])
# Very simple niave solution for part 1
print('<', '-' * 10, ' Part 1 ', '-' * 10, '>')
total_cost = 0
for machine in machines:
ax, ay = machine[0]
bx, by = machine[1]
x, y = machine[2]
smallest_a, smallest_b = float('inf'), float('inf')
for a in range(MAX_PRESSES):
for b in range(MAX_PRESSES):
if (a * ax) + (b * bx) == x and (a * ay) + (b * by) == y:
if a < smallest_a:
smallest_a = a
if b < smallest_b:
smallest_b = b
if smallest_a == float('inf') or smallest_b == float('inf'):
continue
cost = (smallest_a * BUTTON_A_COST) + (smallest_b * BUTTON_B_COST)
total_cost += cost
print('Total cost: ', total_cost)
print('<', '-' * 10, ' Part 2 ', '-' * 10, '>')
# Part 2 (unfortunately lifted this formula from A.P. (https://github.com/CodingAP) )
total_cost = 0
for machine in machines:
ax, ay = machine[0]
bx, by = machine[1]
x, y = [n + 10000000000000 for n in machine[2]]
b: float = ((ax * y) - (ay * x)) / ((ax * by) - (ay * bx))
a: float = (x - (bx * b)) / ax
if b.is_integer() and a.is_integer():
cost = (a * BUTTON_A_COST) + (b * BUTTON_B_COST)
total_cost += cost
print('Total cost: ', int(total_cost))
+15
View File
@@ -0,0 +1,15 @@
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279
+501
View File
@@ -0,0 +1,501 @@
101, 103
p=84,26 v=99,-23
p=98,17 v=-41,-46
p=3,84 v=-17,-23
p=92,66 v=36,-4
p=16,102 v=95,-60
p=14,90 v=-71,-62
p=26,29 v=91,-20
p=74,36 v=67,30
p=59,66 v=86,-4
p=32,47 v=-79,7
p=82,42 v=3,-84
p=61,16 v=28,34
p=82,9 v=-84,-78
p=5,71 v=16,84
p=15,79 v=-48,75
p=76,92 v=-32,68
p=43,93 v=54,78
p=22,73 v=-49,68
p=79,13 v=-78,-55
p=61,17 v=1,90
p=71,58 v=-73,16
p=60,63 v=-31,87
p=8,41 v=-17,-96
p=13,51 v=-16,-51
p=86,15 v=12,-65
p=35,71 v=57,3
p=77,81 v=89,86
p=100,37 v=93,-84
p=31,38 v=22,20
p=9,98 v=99,-47
p=29,21 v=72,-76
p=67,99 v=76,-25
p=62,67 v=54,78
p=80,79 v=-1,91
p=74,7 v=51,-42
p=31,57 v=30,70
p=7,74 v=57,-75
p=49,29 v=-9,34
p=27,70 v=-45,-54
p=96,30 v=47,-77
p=7,22 v=-65,52
p=50,53 v=15,-1
p=37,44 v=46,-96
p=85,87 v=-10,-25
p=91,8 v=47,-56
p=96,11 v=-50,-67
p=75,85 v=80,90
p=51,72 v=41,79
p=81,67 v=-93,-25
p=78,51 v=65,-99
p=94,21 v=15,38
p=41,63 v=-77,89
p=98,11 v=-52,31
p=97,53 v=67,12
p=10,93 v=78,-74
p=13,23 v=53,40
p=73,39 v=-11,58
p=82,54 v=45,-39
p=4,14 v=-52,60
p=69,85 v=-93,86
p=88,27 v=-98,-64
p=54,88 v=50,-27
p=53,84 v=-82,-15
p=47,51 v=24,61
p=100,94 v=-54,-52
p=91,23 v=1,-66
p=95,45 v=-42,7
p=76,92 v=80,53
p=29,0 v=13,-29
p=38,46 v=40,2
p=29,19 v=-24,-59
p=4,53 v=-74,11
p=77,87 v=45,-13
p=75,12 v=-82,-52
p=95,84 v=38,93
p=52,52 v=20,17
p=16,0 v=-83,51
p=68,21 v=98,-72
p=9,54 v=-76,20
p=27,9 v=9,-55
p=32,44 v=-11,-96
p=90,59 v=67,6
p=68,52 v=65,30
p=71,44 v=-3,11
p=6,14 v=16,44
p=10,0 v=18,-40
p=85,41 v=17,90
p=15,4 v=-59,57
p=44,65 v=2,97
p=15,78 v=53,-48
p=34,12 v=46,53
p=43,45 v=86,-83
p=76,52 v=-92,-81
p=11,80 v=97,-24
p=37,3 v=48,63
p=1,54 v=49,-5
p=45,61 v=-5,81
p=71,63 v=87,95
p=72,40 v=-83,32
p=10,9 v=-83,47
p=3,23 v=-10,-73
p=84,1 v=85,52
p=52,24 v=-18,36
p=76,37 v=21,-84
p=49,26 v=20,11
p=66,54 v=30,-4
p=24,66 v=-61,79
p=34,22 v=41,-90
p=43,6 v=-52,-66
p=15,30 v=68,6
p=72,74 v=-55,93
p=35,25 v=24,-66
p=80,21 v=56,36
p=43,67 v=59,95
p=61,39 v=-69,-88
p=61,93 v=-66,65
p=18,94 v=97,74
p=4,43 v=13,-75
p=13,62 v=-74,-91
p=61,27 v=32,-59
p=28,88 v=55,-19
p=52,55 v=-94,-60
p=83,37 v=46,97
p=2,72 v=-52,-77
p=35,31 v=-33,23
p=75,73 v=30,-12
p=55,7 v=87,-70
p=48,52 v=-41,-22
p=50,15 v=39,-54
p=35,69 v=63,-92
p=40,55 v=-20,-84
p=51,27 v=61,-67
p=24,29 v=62,21
p=12,14 v=86,45
p=57,29 v=-99,-66
p=82,74 v=16,26
p=2,40 v=-32,-69
p=23,14 v=-81,49
p=89,70 v=-32,99
p=4,27 v=60,-67
p=34,10 v=-77,-57
p=40,73 v=88,73
p=26,38 v=-90,21
p=31,25 v=45,15
p=93,8 v=-65,54
p=61,25 v=-69,-79
p=13,63 v=19,27
p=58,13 v=15,-42
p=29,1 v=3,65
p=65,59 v=41,15
p=86,69 v=-89,-14
p=23,63 v=-87,-79
p=14,7 v=81,-54
p=3,92 v=-96,61
p=78,24 v=-34,-70
p=48,30 v=-22,10
p=59,79 v=85,66
p=91,7 v=5,-60
p=61,25 v=-20,41
p=5,90 v=60,87
p=68,9 v=-24,25
p=27,55 v=42,9
p=48,41 v=37,-78
p=43,44 v=80,-68
p=73,20 v=30,-49
p=13,62 v=-19,-3
p=46,11 v=24,50
p=17,90 v=86,75
p=77,18 v=-84,79
p=5,52 v=4,-30
p=28,63 v=34,41
p=72,83 v=87,-15
p=11,16 v=51,-60
p=4,33 v=-63,-71
p=70,77 v=34,-25
p=37,46 v=22,-20
p=87,49 v=-25,2
p=89,16 v=45,-59
p=9,82 v=-33,97
p=66,27 v=87,-72
p=64,97 v=-38,-40
p=51,90 v=-73,76
p=25,57 v=-68,-95
p=41,13 v=8,-48
p=39,13 v=59,29
p=42,51 v=13,9
p=70,102 v=-14,-54
p=41,69 v=2,83
p=74,7 v=-10,39
p=91,63 v=32,-99
p=6,22 v=-70,-55
p=78,5 v=-12,37
p=54,76 v=-46,-84
p=17,19 v=-4,-62
p=70,101 v=76,58
p=71,94 v=41,74
p=16,91 v=18,-32
p=10,90 v=95,-53
p=97,61 v=71,5
p=63,49 v=-73,-70
p=85,27 v=-76,-56
p=98,11 v=47,47
p=58,7 v=-5,46
p=5,48 v=-6,-94
p=4,90 v=-87,-16
p=55,84 v=-3,-29
p=74,1 v=95,-35
p=3,43 v=35,28
p=11,29 v=91,40
p=10,11 v=38,31
p=61,44 v=-19,10
p=87,52 v=76,96
p=3,92 v=27,67
p=68,64 v=87,-6
p=74,88 v=87,-34
p=24,52 v=43,-61
p=91,10 v=-65,-63
p=65,98 v=49,-21
p=88,66 v=-71,-46
p=21,84 v=-26,93
p=7,69 v=84,81
p=43,21 v=6,-9
p=43,64 v=-73,-19
p=35,47 v=79,-88
p=54,21 v=39,-62
p=20,63 v=-33,27
p=21,51 v=99,10
p=16,82 v=-72,-31
p=23,10 v=-2,-45
p=37,33 v=-22,21
p=41,74 v=-9,88
p=31,96 v=-15,65
p=37,12 v=46,55
p=72,54 v=-54,-52
p=9,58 v=-28,-87
p=0,13 v=-96,-50
p=65,70 v=18,11
p=32,38 v=90,-84
p=97,67 v=40,-3
p=45,17 v=90,57
p=36,85 v=2,83
p=29,39 v=63,78
p=51,99 v=-7,-40
p=18,93 v=18,-30
p=75,93 v=-12,65
p=1,85 v=27,-20
p=17,84 v=97,72
p=3,68 v=-74,96
p=72,22 v=-49,52
p=18,65 v=-50,1
p=71,16 v=63,-59
p=36,44 v=-20,85
p=77,21 v=-27,96
p=70,54 v=95,-70
p=20,5 v=-44,-9
p=97,64 v=55,94
p=49,82 v=35,-16
p=63,54 v=2,-51
p=88,101 v=1,65
p=1,3 v=-89,-34
p=29,97 v=-24,-42
p=45,46 v=-66,14
p=51,33 v=68,35
p=91,29 v=-78,-35
p=10,56 v=-83,31
p=11,94 v=-41,-15
p=63,76 v=19,90
p=84,84 v=21,84
p=24,41 v=-79,25
p=94,82 v=23,85
p=60,52 v=-48,-4
p=47,36 v=66,-51
p=0,49 v=-6,-90
p=40,23 v=-99,-63
p=21,79 v=-64,-40
p=71,18 v=-14,-67
p=53,44 v=-51,7
p=71,40 v=83,51
p=96,87 v=93,-29
p=46,64 v=22,88
p=3,53 v=44,-52
p=54,57 v=74,-95
p=61,63 v=-95,-12
p=96,82 v=3,-17
p=41,96 v=5,89
p=7,46 v=-19,20
p=2,7 v=55,33
p=27,15 v=29,33
p=54,64 v=-7,2
p=84,58 v=-93,59
p=80,24 v=56,5
p=23,13 v=66,-56
p=93,100 v=-89,45
p=89,82 v=91,69
p=55,90 v=96,-5
p=43,41 v=16,-93
p=54,70 v=28,-85
p=50,64 v=-33,-22
p=99,35 v=71,17
p=23,77 v=11,-3
p=78,99 v=43,-38
p=3,80 v=-57,8
p=22,75 v=-48,-18
p=3,94 v=-98,-33
p=72,89 v=-90,39
p=87,84 v=67,61
p=28,0 v=22,55
p=65,55 v=82,70
p=55,48 v=17,-96
p=11,37 v=-33,52
p=63,63 v=-94,9
p=0,10 v=-78,59
p=91,17 v=23,-58
p=56,77 v=72,81
p=99,47 v=14,19
p=15,18 v=31,24
p=47,9 v=56,-13
p=38,11 v=-9,-50
p=93,2 v=-76,47
p=97,52 v=-45,-32
p=51,44 v=-65,68
p=15,2 v=-83,72
p=15,99 v=97,54
p=85,81 v=45,78
p=11,57 v=3,-13
p=91,30 v=11,56
p=42,90 v=-75,73
p=24,7 v=99,-68
p=55,58 v=83,-7
p=35,4 v=15,31
p=21,39 v=42,27
p=62,9 v=6,-48
p=59,99 v=-20,46
p=93,71 v=1,96
p=31,3 v=77,-47
p=98,11 v=25,-52
p=28,41 v=92,22
p=90,64 v=93,81
p=64,93 v=-71,-28
p=31,65 v=-74,-47
p=62,44 v=21,30
p=35,22 v=-76,5
p=69,2 v=-4,47
p=34,28 v=52,32
p=3,37 v=-17,21
p=43,92 v=90,-50
p=16,59 v=29,-1
p=41,6 v=57,-50
p=93,58 v=-74,-16
p=88,60 v=-2,-10
p=62,19 v=-51,37
p=30,80 v=79,83
p=75,14 v=-84,79
p=77,10 v=-34,-71
p=92,60 v=21,13
p=21,25 v=-26,-67
p=88,101 v=57,80
p=60,93 v=14,-99
p=55,33 v=61,-77
p=76,51 v=-60,67
p=23,31 v=-48,25
p=47,28 v=71,18
p=6,10 v=-6,55
p=74,29 v=-51,-56
p=43,49 v=-66,15
p=53,15 v=17,46
p=34,89 v=-90,-28
p=53,12 v=26,-53
p=68,96 v=32,68
p=10,50 v=-6,5
p=30,7 v=69,80
p=2,69 v=60,84
p=78,74 v=32,-12
p=83,87 v=-8,-31
p=86,86 v=48,-45
p=19,6 v=7,-48
p=53,32 v=-55,-89
p=32,35 v=-23,-39
p=95,23 v=-87,43
p=56,82 v=50,-22
p=28,101 v=99,-36
p=8,77 v=5,-13
p=74,21 v=-27,-90
p=68,59 v=98,-6
p=83,93 v=21,76
p=80,24 v=-91,-78
p=7,78 v=47,-8
p=19,81 v=90,-14
p=96,20 v=-30,44
p=70,54 v=-14,10
p=93,25 v=-65,33
p=51,76 v=26,90
p=79,25 v=45,-69
p=89,6 v=-47,-54
p=32,78 v=62,18
p=98,32 v=57,23
p=34,30 v=-22,-91
p=37,94 v=-72,86
p=81,94 v=-45,63
p=20,37 v=-24,29
p=2,63 v=-26,-19
p=4,29 v=-72,-68
p=18,95 v=45,71
p=64,84 v=28,-25
p=8,32 v=84,-93
p=15,3 v=-6,-41
p=42,53 v=81,-92
p=20,73 v=79,72
p=43,3 v=28,-38
p=86,85 v=-21,72
p=97,29 v=69,36
p=23,74 v=-55,72
p=83,87 v=45,-26
p=70,0 v=-93,57
p=61,0 v=-25,74
p=22,0 v=-35,56
p=12,8 v=-70,34
p=27,24 v=66,-74
p=27,87 v=29,78
p=36,98 v=68,72
p=26,40 v=40,-82
p=38,34 v=-80,6
p=34,83 v=33,74
p=23,24 v=9,27
p=46,96 v=96,-43
p=80,41 v=52,19
p=33,10 v=37,-47
p=47,15 v=74,73
p=25,102 v=-3,-72
p=73,63 v=-71,-1
p=27,78 v=-2,83
p=28,8 v=18,55
p=95,102 v=-39,-42
p=65,69 v=-38,-16
p=54,17 v=-18,48
p=63,64 v=96,96
p=3,32 v=-37,33
p=96,84 v=36,61
p=67,9 v=67,-54
p=88,54 v=-74,-52
p=70,52 v=52,14
p=97,81 v=-55,-56
p=4,11 v=40,54
p=51,9 v=-16,-97
p=59,88 v=85,75
p=58,24 v=72,-67
p=73,59 v=76,-93
p=34,40 v=81,2
p=38,22 v=94,52
p=77,27 v=78,39
p=65,50 v=28,16
p=63,14 v=-38,-48
p=13,70 v=-24,75
p=60,16 v=12,-9
p=43,65 v=92,50
p=66,31 v=-24,-65
p=67,32 v=10,4
p=20,27 v=-27,97
p=87,35 v=-52,38
p=69,86 v=80,-41
p=55,81 v=4,-15
p=11,102 v=-28,54
p=34,74 v=52,-16
p=74,90 v=19,77
p=100,71 v=-63,-17
p=16,27 v=-52,30
p=77,75 v=-59,-50
p=18,76 v=27,81
p=65,99 v=42,-45
p=30,15 v=-79,48
p=4,95 v=80,-31
p=81,87 v=83,15
p=22,31 v=33,34
p=46,77 v=-43,-42
p=36,37 v=-99,27
p=35,86 v=29,20
p=54,16 v=-9,-77
p=58,5 v=-38,-34
p=40,26 v=4,-53
p=31,36 v=56,-5
p=46,101 v=-5,97
p=99,97 v=47,88
p=52,42 v=94,-81
p=92,100 v=95,65
p=86,19 v=-78,-48
p=75,100 v=-23,63
p=74,38 v=98,-99
p=61,92 v=-42,-40
p=70,98 v=8,63
p=4,82 v=-74,-32
p=79,1 v=63,-33
p=5,49 v=-17,11
p=55,39 v=-82,-68
p=91,98 v=-96,64
p=55,82 v=24,77
p=54,48 v=83,13
p=0,23 v=-19,-74
p=25,50 v=48,36
p=99,21 v=36,-68
p=26,33 v=9,9
+137
View File
@@ -0,0 +1,137 @@
import math
import re
# SECONDS = 7519
SECONDS = 10000
with open('input.txt', 'r') as file:
data: list[str] = file.readlines()
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Coord(self.x * other, self.y * other)
def __rmul__(self, other):
return Coord(self.x * other, self.y * other)
class Robot:
pos: Coord
vel: Coord
def __init__(self, pos: Coord, vel: Coord):
self.pos = pos
self.vel = vel
def __str__(self) -> str:
return f'p={self.pos.x},{self.pos.y} v={self.vel.x},{self.vel.y}'
robots: list[Robot] = []
WIDTH, HEIGHT = [int(n) for n in data[0].split(', ')]
for line in data[1:]:
p1, p2, v1, v2 = [int(n) for n in re.findall('-?[0-9]+', line)]
robots.append(Robot(Coord(p1, p2), Coord(v1, v2)))
def time_passes(robots: list[Robot], seconds: int) -> list[Robot]:
for robot in robots:
robot.pos = robot.pos + (robot.vel * seconds)
while robot.pos.x >= WIDTH:
robot.pos.x = robot.pos.x - WIDTH
while robot.pos.x < 0:
robot.pos.x = WIDTH + robot.pos.x
while robot.pos.y >= HEIGHT:
robot.pos.y = robot.pos.y - HEIGHT
while robot.pos.y < 0:
robot.pos.y = HEIGHT + robot.pos.y
return robots
def print_robo_map(robots: list[Robot]) -> None:
robomap = [[0] * WIDTH for i in range(HEIGHT)]
for robot in robots:
robomap[robot.pos.y][robot.pos.x] += 1
for row in robomap:
for c in row:
print('.' if c == 0 else c, end='')
print()
# Order is quad 1, 2, 3, 4
def count_quads(robots: list[Robot]) -> list[int, int, int, int]:
ignore_y = HEIGHT // 2
ignore_x = WIDTH // 2
quads = [0, 0, 0, 0]
for robot in robots:
if robot.pos.x == ignore_x or robot.pos.y == ignore_y:
continue
# Quad 1
if robot.pos.x < ignore_x and robot.pos.y < ignore_y:
quads[0] += 1
# Quad 2
elif robot.pos.x > ignore_x and robot.pos.y < ignore_y:
quads[1] += 1
# Quad 3
elif robot.pos.x < ignore_x and robot.pos.y > ignore_y:
quads[2] += 1
# Quad 4
elif robot.pos.x > ignore_x and robot.pos.y > ignore_y:
quads[3] += 1
return quads
robots = time_passes(robots, 46)
for i in range(46, SECONDS, 101):
robots = time_passes(robots, 101)
print_robo_map(robots)
print('Frame: ', i)
input()
print("\033[H\033[J", end="")
# print_robo_map(robots)
# print('Safety Factor: ', math.prod(count_quads(robots)))
# smallest_sf = float('inf')
# frame = 0
# for i in range(100000):
# robots = time_passes(robots)
# sf = math.prod(count_quads(robots))
# if sf < smallest_sf:
# frame = i
# smallest_sf = sf
# print(frame)
+13
View File
@@ -0,0 +1,13 @@
11, 7
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3
+71
View File
@@ -0,0 +1,71 @@
##################################################
#OOO.O.#...O.O..#.....OO...#.....OO.O..OO.....#..#
##.O...O.OO#.#.O.#.O.O...O#.OO.....OO..OO.O..#...#
#OO.O....O....O..........O.O...O........#.OOO....#
#..#.O#..O.O..O.O#..OOO...OO.#......O...O.O.#.OOO#
#...#..OO..........O.O...O....#....O#OO.O..O.#.#.#
#.#.O....O..OO....O#....O..OO...#.......O..O.O...#
#O...O.#OO..O...........OO.....#O...O.O.#.OO.OO..#
#O.O......O..#..O.#.##OO........#..##O.O#......#.#
#..O........#............OO...OO...OO###..O.OO.OO#
#..O..OO.......O.......#O..O#O..#.O..O...#......O#
#OO..#........#.O..O........O.OO.O#...O#......#..#
#.......#...#.....#..O.O.......OOOO#....O..#.....#
#....O....O.O.OO#OO#..OO.....#.##..O#O.....OO..O.#
#...OOO..O...OO..O..O.OO.O.#O..#O#..O.O...O...#.O#
#O.O...O..O....#.OO....O......O....#...#.O.OOO#.O#
#O#O#.O#......O.OO.O..O....#..#O......O....O.O..O#
#...##..O.O......O.#.O.O...O...O....OO.....O..O..#
#O..#.O...O.O..O....#.O....O....##O..O.OOOO.....O#
#.O.O...O.#..OO.....O.#..#..#....OO.......O.#OOO.#
#.O#...O..O...#...#..OO..OO.OO.OO..O#.....O...O.O#
#...O.O.OO.O.O.O.........O.........O..........O#.#
#....#....O##.OO.OO......O.OO.#.O.#.O...O....O..##
#..O...O..O.O..#O.O..OO.OOOO..............O#O....#
#...O#OO....OO.O..OO.OO.@....OO.O...O....O.O...#O#
#...O....O..#.##..O....OO.O.O.O..#.OO.#OO....O.OO#
#..O.O..#.O......#O..#O.O.#....O....#...O...O..OO#
#..O...OO.....O.O..O.O..O......O.OO.OOO...OO.O#..#
#....#.O..OOOOOOO..O#.O....O.O..OOO.O...#.O...OOO#
#O...O...O#...##...O....OO...O.O.OOO.O#.#....OO.O#
#..O.#.O#.OO..O.O.#..OOOO##O.O....OO.O.O.O#O.OOO##
#.O.O..O.....O..OO..O...O.............O.O........#
#.O.O.....O#OOO..#O#O...O.O.O..O.OO...#OO....O.OO#
#....#....O#OO...O..#...O.O...O...............#O.#
##....##...O#..O.OO.O..O.O..#..OO.O#....O.O..#O.O#
#O...O.O...........O##..#.O......#..#.#..O.O#..OO#
#.#.O.O...OO..OO.O......O..O.OO.O.......O..#.#...#
#.......O..#..#...#.......#OO.OO...OOOO.......#..#
#.#.......O.......#....OOO......#....O.O.O....O..#
#O#O..#..OOOO..OO.O....O.O......O##.OO......O.O..#
#..OOO.....OO..#......OO.##.O..OO...O.....OO....##
#.OO...OO..O#..O.#O.O..OOO..OO.O.OO......O....OO.#
#O..O.......O.O....OO....#.......O.....#.O.......#
#...O#...OO..#O##.O.O.O#O..OO...OO.O.OOO...O...O.#
#.#...OO.....O.#.OO...OO..#O...O...O.....O..O..O.#
#..#O......OO.....O..##...OOO..O.OO..O....#...#OO#
#......OO..##...OO.....#.....###...#O#O....#.....#
#O.#O#......#..OO........O#.OO........O...O......#
#...O..#...#O.....OOO...O..#.O..O.#O.O..O.....O..#
##################################################
^<>^<^>v^^^v><^<^v^<><><^^^>><>>vvv<vv>^^^^v^<v^v>>v>><<^>>^v<<>vvv<^>^<^<<vv^>>><>vv^>vv^>^<vv<^^><^>>v<vvv^^^v^v^>>>><vv><>^v^v<<^<>><v^v>^<v^^><<><vv>vv^vv<<<vv^^<<v<v><<^^<v<<>v^^^<^^^>>>v^^<>>^^>>><><^<><><v>vvv<^<v^v^<>^><><>>^>v<^>>><<v<>^>^v^v>v>^>v^v<v<>^v<^^<<^vv<^v><^v<><>vv><^<v>>^<>v<vv<<v<<<v>v^>>>^><>vvv><v<>^<v<vv>^<^>^>^v<v<^<<>><^<^v<^^>^><^<>^v^^<^v>>v<<v><^<^><^><^><<<>^>>>>v^>>>^>v<<<>v^<v^^v<^>><<^<><<^v^v^^^^>^^^v^<<v^^<^>v>><<^v<><^^^<vv>v>^^v^v<vv>><^>v<^^^^<>>>v<<<><<<v^^v^v<^^<>v^vvv^^<>v><>v^^>>v^>v<^vv^v^>>v>^vv><><<^>^>v^^>v^>>^^>v^<<>>^^v^^^>>v><<<<v<<v<v^><v>^<^>^^^<v^vv<><<v^^>^>v><v<>^>><v^<^><^vv<>>^vv><v^>>>^<><vvv^^<v>^^^<>^v^^<><v<>vvv>><>>>^^>^<>v>>v<^^v>^<^^v<v>>v<^^v<v>^<>v>^^<<^<vvv^<<v^<<<><>>>^><^<v^^<v>^v><^<<<<>^v>><><^>^^v^>^<v<>^<vvv>>vv>v>><>^<>>^<v^^<><^>v><<<>>>^vv<<^>vvv<^v<v<<vv^v><<v^<v>><>v^<<<^><<<<<v<v^>v^>>v^>vv^><v^><<>><<^>>>^<v<><v^<<^<>^<vvv^>>v^><><>v^>>><v>^v><^v^<v<><><vv>><v>v^<>v^vvv^>>>v><<<v<<>v<>^<>v^^^^v>v>>v^<^<^<<
>>v^><^^^^><^<<vv^^v<^<><><vv<^<v^^><<<^>>vv<v^<^<v><^v^>^v>vv>><^^^^<v>>^v>^><v>>vv>^vvvv^^v^vv><v>>v^^>^vv>>vv^v>vvv>v^<v<^<<^^v^^>><><^>>><<v<>^<<>><>^>^v<<<vv^>>>>>>v>vv>^^v<<^^>v<v^>v>v^<^>vv^<^vv<^v^>^^v^v><>^>^v<>^^><v>v^<^v^><<>^<vv<>>^^<>v><^>><v>v<^>^^<<v<>^^^^>>vv^^^>^>^^v<>^>v>v^v<^^<>^v>v<v^<v<v>v>>>v><^vv^<<v<^<vvvv<^^v^<^><^vv><^^<^>v^>^^^^^<>v>vvv>^^<^<v><>><>^v>v^v^<^<>v>^>^^^><v>v>^<>^<<^v><>^^v<<v>^<><^>>vvvv^<>><v^vvv>^><^<<<<v^<<^^<<>><<^^><v^v^<>v>v>v^^>v<<^>v^vv<vv^>vvv<v>^v^^<v^v<vv<<v<^>>>>^^<v<v<>><>v>v>^>vv^v^<v>v^><vv<>vv>v^<^^<v^^<<><>>vv<v^<vv^^>>>^^^<>v>>vvv^>><<^>v<^^><<vv><<^<vv><^><v>><^^<<^v>^^><<<>^^>><v>>><v<<<<v^>^^>v>v^<^<<>vvvvv<<<^v>vvv<>^^<<^vv<><v^>^v^>^v>>v>v<>^<<^<>v>^>><^>^><>^<<^v^vv<<^><<^<^>v^^>^<<<v>^<v<v>v^v<v>>^vv>^<^>^>><^>^vvvvvv>^>^<><v<>>>vvv^>v^^<>v<^>v>v<<><<^>^v>^><v^>v^<^<>v^<<v><>^>^^v<^>>^vv^<>^v<><^>>v^>^<<^vv<^>vvv^>v><<>^^^v>v<<^>><vvvvvv><>^<><<<>>v<>>v<v^^>vv^>><<^v>>>v>^v>><^>^v>^>^^<v<<vvv^v<>^^v^<<v<^^>v^>>^<v>^^^vvv
v<<^<^><><>^>v^><vv^<<<<^>^^>>^<<^^<>^^^v<<v^<v<>><v<<^<><^^v<<<>v<^vvv>v^v^<<>>vv>^^v<^<v^<<<vv^>vv>>>>>>^<^^>^v<<^<<>^^>^>^><v^^v<vvv<v^>^^<^<<vv^<<^>>><^<>v^<>><^<<<v<^^<v^<>v<>^<<><v^<<>>>^v^>>^^v<<>v<v^v^v>^>^^>>^vv^>^<^^^<^^v^><>><vv<^>>v>>^v<^>vvv^>^^<v<^>>^><v^<v<v<<^<><<>^><<^>v^^v>^^v<<<vv>>^<<><v>><<vv^vv>^<v>v^^v><><><<>^>>vv^^>v^>v<<<^^<^>^vv><^^>>^v^^<<^vvvv^v>>v<vv^<>>>v^<^>>>^^<>^<v>>vv^v^<<^^v>^vvvv>^v<>vv<<<><v^^v><vvv<<<v>^><vvv>v<<^><^^><<<^^^^^>v>^vvvvv>^>^<v>^>v>>vv^<^<^v<<^>^>vv<<v>^>>v>v<>><<><><v^>>v^v>^v>^<v^<<^>^>>vv>>v<<<><^>>>vv^>v<vv>>v^vvv>><<^<v>^<^<>>v<<v>>>^><>^^^^vv<^^<^vv><vv<^>>v^<v^v>^v^>>^v>^><v>v^>^>^vv>^^<v>^>>^>^v<^^^v^>>>^>^><vv<<^<^<^>v^<<^^>^<^>vv<^^^v^^>^^v<>^^<^v^<^>^^><><>v^vv^>^>>>>^>v>vv><^vv<<<^>^<<^v^<^>><<^<>^><>^v^>vv>^v>>v<>v<<v^^><v^<^<v^vvvv<>^v<><vv^<<^^v^><>>>^^^<<^>>>v<<>>vv<v<v><v>v>><v>>^>v^v<v^<^^>^vv>>>v<^<<<v^v<<>v><vvv<v<^>^><>v^^^><<^<<>><<<<^>^<>>^^^>^>vvv<<<<v>>v^<vv><><^<v^v^<><v^^>^<^<^>^^v^>v^<v><v<><v>>><<vv<>><>^
>v^vv>^^>^v^>^<>><^vv<>>^v>v<<<^<<^>>>>^^v^>v^<vvv>>>^><<<^^v<v>^>^^^>><><<^vvvvv^<>^>^>^<^^<>^>vv<>^>^>v>^>>vv<v^<>>v^<<^^v^^v<v^>^^v<<>^^v<>v>vv<^<v<<<<<>^><<^<^^>vv>^<v<><^<^vvv<>>^><^^<>vvvv<<^^><<v<<v<<v>vvv^>^<><<^>>v><vv>v><vv<^<<<<<<^><<>v^vvv<>v>>>^<v>>v<^>v^v^^<^>>><>>>^<>v<>>>>>>><v^vv>><>v>v<<<v<<>v^>v<<vvv>^^<>><>><^^^^^^v>vv^<^^<><>^vv<v>^v^<<^v>>^v^v>^v>vv<^<<^v<>vv<>vv>v>^vv^<^>vv>v<v<>^^v>v<v^>v^<>v^^>^<^^vv<<><>>^>vv^<^>v^vvvv^v^<^v<<v^<>v<^<^^>v^^>^v><^v>v<v<>>>^^vv<v><^v<<<>^<^>v<<<v><<^<^>v<>^vvv<<<<v^<>v^>v^^<^^v<>><<><^<>>^vv>^^<>v<^^<>^>^<v^^^<^<^>^v<^<^^vvvvv<v>>^>^<v<v^^>v>^>vv^v><>^<v^>^>v>>^^^vv^<<^v^v^v^<v^<vv<<^<<<^><<<><v^v^>>><^<><>>^>v<>v>v>>>v>^^>><>>v<^<>^<>>^v>>>v^>>>v>v<^<^v<vv^v>>v^<<^v<v<<<^<>>>^<v<><><vv<<<><^^vv^<>vv<^<<><>>^v<>>v^vv^<<<^vv^vv^^v<^v<<v>>>^v>^<>^v>v<<^vv^>>^^^<^>><v<<<><v<v^vv<v>>><vv>>^<<<^v>v<>><<v<v^^^<<v>^v>^><<^><>vvv^^^vv^><><v^^><v>><><>^vv><vvv<v>^>^^<^>v^<vv<<<<>v<v>^^^^><^v>>^<^<>^<^^v<^^>>>>>><^<^v<^v<v<vv^>v<^>v<>^>>>
<<^>v>><>><><<>><v^>^>>^>^<>^^v<<<v^v<vv^<><^>^v><^><>vvvv^<^^>>v<<v^<^v<<vv<vv>>^>^v>^v>>^vv>^<>^v><^<^vv^vv^^<<>^^v^v>^v<>>vv<>v>vv<^<vvvv^<^>^v^v^<<vvv<v<^><><^>^^>^<>v<^v>^<>v<^<^<^>>^<<^^<v^^^^>v^vv^><<v^^v>^<>^v^>^^v>^>><^>^>^^v><<^<^>v<^><v>>>v>v^>^<<v<><^><^^<>^^vvv^v<v>><v><v^v^>v<><<v<<v^^>^<>v<v<><<vv><^><>^<v>>v^^>v>^^^>v^v<<>>>^v<><>^v^<^<><^v>>v<<<^v<v^^^v^^<^^v>>^v^^v^>^<<^<v>^<v<>>v^>^v<^^<>><><^v>^<><<>^><<>>v>^^v^><>>>>v<<><>>^^>^^vvv<<v^><>><>v<<<vv^>v^v>vvv<^><v^>^vv><v>>>v>>^><^vv<^^<^^^<>v>^<^<vvv<>><vv<v^vv^^v>v^>vvv>^^<vv<<>><v^^vvv>^<<<>^v>vv>><<^v^>v^>^<<>^>v<>><^^>^v>^><^>><>^v<>v^<><^>^<<v<>>^>>^>>>^<<<v<v<<^vv<^><<v^>v<<>>v^>^^v<v^<>><><v^>>v^<<v<>^>^<<>^<^^v<v^><^v>^^<>>v<>>>^><>v^>^^^^>v^<>>^^^<<<v^>v^<>>>v>>^^>vv>>><<^>v<^<^>v<<^^<<>>>^^<^>>>^>^<<^^vvv>>^>>v^<>^v<><<^>><>v>v>v<>^^v>^<vv<<^<^^v^<<>>vv>>v<^^^v><>v>^v^<>><^^^vv^>^^vv<>><vv<<^<<v^^<v>>><^<>v><^>vv>>v^^^>v>v>>vvv<>^>^^<^vv^<^<>^><^<>^><v^<>^><<v^v>v^v>^^>v^^>vv^>^v>^>>v>^>v<<^v<^<>>vvv<^^vv^<
<<vvvv^<>>>vvv><<v<>^<>>^^>v<<v<^^v>>^v^^^v<>v^^v^>^^<^^<^^><<^^^>^^><>v<^^><^<<vv^v<<>v>><^^<^>^<v^>>v<^vvv<^^>>><>><v>vvvv^<<<v>><vv^vvv^><>^<>vvv^<vv>>v^^^v<^^^^^<^^<<><^^^^v<<>><^>>v<vv>>>>>v^v>v><<^>v<^^<><<>v<<<v^^^><v^^v>^<>^<^>^v><v>v^<>^v<>><v^vvv<<<<><<<^^<v^>v^v<<^^><>><v<^^^v<<^^<^>vv<<v<<^><<^<>><^^><v<>>^<>^<<^^<v^vv^vvv^>>><vv<<>>>><<><>^>^^>>v^v^>^>v>v>vv<><v<v^^^^vv>>^^>><<^v^>^vv>>v>><<><>^^vv^v^>>vv^>v^>^>vv<v>vv<^>^>^><^>v^<^^vv>>^<v<^><>^^^^<^><<^<^^^v>v^<<><<vv>v<vvv>><v<<<^<^^>>v><^>^vvv<v^v<^><^<v>><<<v<<^^v<<vv>^vv<vv<<>vv>v>v>v>><><<<>v^v>^^v<v><v>v<>^^>><>>>^>v<v^v>>^^v^^<>^>^^vv<><<<v<^<v<^<v>v<^<^vv<v<<><v<<v^^^v<>v^vvv<<v<>>>^^^v>v^<<<^^>^>v^^v^>^>^vv><^^^>vv<v<<^v^v>>v^<^^^v^^<vv<<<><v><>>^vvv<v^vvv<<v^vv<v^v^>vv<v<>>^<>>><^><><<<v>^>>>^<<<v>>v^v^<>>v^^^vv^^<>^><^<>>>v<v<><^>v^<vvvvvv^<<vv<<>^^>>vv<^<>v^>>><vv><v>>^>><>^<<<v><>^<v^^<v<vvv^v>v^v>vvvv^^v^v^v>><<>>><^^>><v^>v>v<^>^<>^<><<<v^>v^v^><>^><v<>^v>^^><^^vvv^><><<vv><<^>^<<<<v><<^^>^<v<>vvv<v^>^v<v^
^v<>^^^<<<v^v^vv<^<>>^^<v>^>><<^v^<^>>^v<v>^v^><<>v<<^<^<<^>v^<v^>>v>^v^^vv>^><<^v>^<^>^>v^^v<<><>^>^<>><^><<^v<<vv>^vv^v^>^^>^^>^<<^<<^<<v<v^^><v^^>v^>^>>>vv^<>>^<>v>>>^><<<><>^>^<^v>>^<v^>>>>v<>v<^vv^<v>^<v>^>v<v<>>v^>vv<^<><>vv>^^<v<><<^v^>^v^vv>v<<v^v<>v^v>v><^^<v^>v^^v<><v^>vv^>^<>v^<vvv<vv>^>^vv>v^<>vvv<^vv<>^^<<^^<<vvv>>v^v^<^^^<v<^v^^<>^>^^<>>^^v^v^><^v><>^><v<v^<>v^><>^vv<^<<>vvv^^<v^<^>><v>v>^v>v>^^v><v<v<vv^>>vv><^<>^>vv<>v<>>>^<>^^^vv>v^>v<>v^vv^^<vv<v<v>vv>><v^vv>><>v<vv>^><<vv<>v^<<>^<><v<>vv><<<^<>>v^<>^><^<>^>^v^><^^<v<>>vv^><^v^^>v^v<^^^<>^v^^<<><<>v><>>>><>v<<^^^vv>^^>^<<<>>>v>>v>>^>^><vv^^v^vv^^<vv>v^^<v<><^vv><vv<v<v^^>^<<<>^><>^v<v><v^v><>^v>^><<^>^>v><<v<<^^vv^^>^^<^>v>v>^v<<v^v^^vvvv>^<^vv>v>v>>v>>><v<^><^<vv<^>^>v>^^<>^^v>^<<<>^<vvvv><^v>v>^^^>vv^<><v><<<>^^^v<<<<<<>v<^v^>>>vv<^<><^>^^>>><>>^>>>><v^<>^^<>^^^><v<<^vvv>vv>v<<<><<v<><v>vv>v>>^v<v>^<vv^>^vv^<v>>v>>><>v^^>><>^^<<>vv^v<>^<<><<v^^>v<^v^>>^<v<v>v><>vvv^<<^>^>v<>^vv<>^>>^<><>>>v^<>v^v^<^>><vv><<<>>^v>vv^
>v^vv><^>>^v^<<<<>vv>^<vv^<v^vvv^^<><^<v>v^<><<>vvv^<^v^>>><v>v>^^>>^vv^^v><v><><<^>^<v^^v><<>^><>^<v>v^<><><<>v<><^^><^<<>>>v^>>v^^^>^^v<v<<^>><>>v>^^v^<v^^>^^v<^^v^v>^>>v><>vvv>vv^^><<<v^>^><v<v^v>^>>^>^<v>>>^>><>>v<<<<v^v^v<>>^<v>v<<v>^<><vv^>^><<v^v<^>>><>>^v>^v>>v<v^>^<<<^v>>><><^vv>>v<^vvv^>><>>>v<<>vv><>v^^v<v>>v<v^>v><<<v<^>^vv>v<>v^^<<<v<^<>>^<<>^^>^><<^^>^^>v^>>^>v>^v^v>v<>>>^<<<<^v^^>^>^^v>^>^v>^^>^vv<>vv^><v<v>>>^v^>><>><<>v^>>v<^v<><><<<>^v^>>^^<v^>v^^>vvvv>^><<><v^>v^^^^<^><vv<v<v<<<v<<v<v>v<vv^<^v<^v^^v<<^v><^<>^^v<>>^<^<>v>^>><<><v<^>><<>^^^v>^^^>^v^<>v^>><>^<vv^<v<^>>>vvv>^^>vv<^>^<<>^v>><vv<<^>^<^^vv<^>vv<^>^v>>>v^>>^<v>v><><v^<<>v><^<v>^>><>^v<<vv<^><v>>vv>>>^v<^v<<<>v^<>><>^vvvv^vv>>>>^v>><^v><^<v^v>^<<v^^^vv<^v<<<<<^v^>v<v<v^>^v>><<^^><>^>^>^<v^v>v><^<v^<^^v<^^^^<>^<>v^>v<>^v^vv><<<<v^v>^^><v^^^^>>^v>v>v<v>^<v<v<vvv<^<^v>>><^<<>>><<v>>><^v>><v<><v<><^<^^v^^>>>>>>>>^<<<v^>^><^>vvv^^^^<>^<v>vv>^vv^v^>v<>>^>>^><^v<v<<^><vvvv^<^^^<<v^^<v^>><<<^<<<v>v^><>>v<><><^v<^>v^v
><>^vv<v<^>><^<><<^^^^v<^>v<<><^^^v<vv^v^<^v^<^v<v<>vv<v^<<<^>v^v^^v^>v>><>^^>>>vv^<<^>^>><v^vv^>v>v^^<<>^>v^^v<^v>^>vv^v<><>^>>^>v<<>v^^<^^^>>v>><v^v>><^^^vvv<vv^<v<<^>v<^^v<vv>v<v>v>v^^v^^>^v^>^v^><v><<v>^<v>^<>><v<<>v^<<>v>v<<<^^^v^^<>v<v^>^>>vvv>v><vv<v>v>^v^v<<^^vv><>^v>^v^>>^^v<>v>v<^^^<<<v<>v<v<v>vv^vv><<v^v><vv>>^<>><<^^<v<^>>^v<^vv<<<<>>><>^><<vv^^>v<vvv<<^v>vv><vvv<v^^>>>v^v>><>>^<>v><><v>v<<<<^^<v^<v^>v<<v^<^v<>^>v<<<^^^>^>v<^v^<<^<<>><v><v>><v^<^^^>v<<v>^vv><>>^>>>v^^vv^<>>^^^v^<>><>^vvv^v>^^v>^^<^^v<<^>^><>^v>v<vvv^<<v>vv>>>>^^^><<<>><>v^v<vv>v^^^^<>v<^^v^v<v^vv^v>>>>^^><><>>>>^v^>^v^v^vvvv>^^^<^><>^^<vv><v^<^v<><vvv>v>>><^<^^vv><vv<<>>^^^v^v><>vv><<>^v^>>^v>>><^vv^>>>>vvv^^vvvvvv<^vvvv<<v<<vvv^^^>v^<<^vv^<^>v^><v<>>v^<v^^^^v^^^^<<>>>v^^<^vv>><v<<<v^v^^<>>^vv^<v>>>>v^v<>^^>^>v<><vv^<<v^v>vv<<<<^<<<>^^v^v^^<<v^v^<v^^>><^<>v>^v>vv^><<v^v^^vv><^>><^<^^<v><<v<>^>>>>vvv<^>vv>^>v<>><<^>^vvv^>>v<><^>v^v<^<>>><^^^<v>vv<v^<^>^<<<^^<v^^v<^>^<>^^>v>^<v<>v><>^<<<^^^^<<><^^v>><<<v><^<^
vv>>^vv^^<^vv<^v>^<>^<v<^v^v^v^^>^^vvv>^<>^<<<<^^><vv^vvvv^>^^>>v<^><v^vv^^^<>>v<^vv^^^<^<<^^<>^<^^<^<v<<^>>>^<^><>>>vv>^>v^^>v><^<^<v>><v<v>>>v<^^>><v^v<vv>^v<vv<>^^<<>>v<v<^^^<<v^^<<^<^^<^<>vv<v>>v<<<<>v<v>><>^^vvv<<>><>>^v<vv<v<v^><^>>^v<v^<>>>>>v>v<>>^<>><>>v<<>v<^>^^v^^vv<<^<<<><^<<vvv<^^>>>v^^^v><<^<^<^^>v<<><<^>>v>^v^<<<^vv>>>^^^vv<<<>^>><>v><<<v^^^<^><>>v>^vvv<<v^>v<v^v>>><<<vv>>^v<^><<^v<<^v^>>>v<^<^>^^><>>v>^^^>vv>vv<v<vv<<<>vv<>v^>^^vv^<>>vvv>^<>v<>vv^v>v^^>>><vvv<v<>>^^v><vv<<vvv<>>v>^^<>^><v^><v^^^^<vv>^<v>v^v^v<>v>^v^v^>^<<v>><vvv^^v<^>>vv><><<v>>>>vv>^^vvv>v<vv<<vv<<^<^><<v>v<<v^v^v<v>>v<<<<^vv>v^^>>v<^>>v^>^<>>v<<^<><vv>v^^^v^>><vv^>>^^<>^<<<>>^<<^v<>^<<<vv>>>^v^<v>^v<<<^^^>v<vv>v>^<>v><>>v<^^<<^^><<^<v^^^^>^>v<>v>^<<<v<>v^^><v>>v^v>vv<>><<>^^^^>>^vv<v^v><>>>vvv^<<v<<v>><<>^^<^>^^><^^v^v^^>v^v^<<^v>>v<v>v><>v>>vvv^v<^<v>>>^^<><v<^v>vv><v<^<^>^>vv^v^<^^vv>^>><v>>^>vvvv<^<vvvvv^>v><>><v>>v<^<^v<v>^>>v^>v^^^vv^v>v<^v>^^>>><v^v<>v>vv<vv^v<v<>^v<^^><v^^^>^<>v^v^v^^vv^<<<v^>>
^<<v>^v<v^<^^^v^^v><^v>^^^<v>>><<<<^v^><^v>v>>^><<vv<<^<^^v<v>>v>^<>vv>vv^^>>v<<><>v>vvv^v<>v^^<^v<<^^^^<^>>v<<<^^>v>vv<>^^<^^^>^<^v<<><^<v>>vv><<>^vv><^<v><^^^^vv>^^<>>v>^v><v><^v^>vv><<^v>^v<<>v^<>^<^>^><v<>v^>^v<>v>^<<<vvv^^v>>vv>^^^>^^><v<^^><>v>><^v^>^<v^<^^^v^^>v<v>^>><vv^>><<^v<>><<<v>^v<v<>v<^>>^^>^>v>v^^>v>vvv^>>v>>^<<vv><v^vv<>vv<v<v<v<><v>v^^v^<>^^^^v>>^v^<^<^^>><^^<><>^v<^>>^>^^<vv><<<><<^>>v>vv^^v<v^v^v>^<<<<^^^>v><>><vvv>>>>v^v^>>>>>>v^^<<><<^>^<^>^<>v>v><v<v<^<>><><>vvv>>v<<vv^<><>^>^^<^<^v^^>^<<^^<^>^^<<>^><^<^><<<v>v<<>>v^<<>>>^v<>v<vv>>>^vv^>v^>^^v<^^<><>v<>>v^^><v<<<<^^>><vvv><v><<<<v<^<<^vv<>>><>>>^^<>^^^^^^v<v>vv<<<<v^vvv>v^v<^<<^v<>^v>>^v<<<<^<>>vv^vv<v><^>>>>>^v>v>>^^v^<<><<>v<vv<v^vv<v>^<><<<v>^<><^><><vvv>v^^^><vv>>v><^^^<<<><^<^<<>^^^v^v^<vv<<>><v<v^<>^<vv>v><>><^<^^>vv>>v>>><>^<v<v><^v^<v>>^>>v<^v><^^v><v^<^vv<v>^<v><<<>>^vv<^^^<>>><^<^<v<>^<v>><v<<>^<v<v<<>>>>^<v<<<><>><^<>^>>v>^^<>^v^vv^>><^>v<vv<>>v^vv><^^<v^v><^^<v>^^^^<^v^^>v<v^^<^^>v>^><v^<^>>vvv<^>>vv>
<^<^<v^^v^v>>^>vv>>^><<v^<><>^<^>vv<>^<v<^^<^v<<>^v^^><<<<vv>vvvv>vv<^><v<^<<^v^<v<<><^^>>^><^v^<^^><v>v^<<v>>^>>^^^<>v<v^><>>^^vvvv<^<<<>^<>><^^<v<<^^vv^^>v<<<v>>v<><v<<<^^<^^>^>><^>v^^<>^>><>vv>^^<vv><^^vvv^v<^<^v>^^<v^^<><v<^><v^><^>v>^>>>^<vvv>v>>v^v><>><><<<v^v^^<^v>^>^<>>^^v<><^v^<<^^<^v^vvv>>v^^>>v>><^v^>><<^>>><<>^v<^^^<><v>v<^>>><>v^><v>>vv<<><^><<<<^v<<v<><<v^^<vv><v<<^v>v^<^>>v><<^><^<>^^<vv<<<<^vv<<<>vv>^<<<<<^>^><v>^^><><^^>><<>^^><<^v>^<<>v<>v<v^<^^v><<><<<><>>^<^^v^^<v<vv^>^>v<<^^^<v^v><<^><^^v<>^vv^<<<^<<<v<>v<^^>^><^^<^<^<v><>vv>vv>^^^^<<<<>v<<><<<^^>^>^><v<v<>vv>^><^><<^<<^<>>v<^><>^v<vv^^<<>v<><v<<v>>>><v^<^^<>^>>^<^v^^<>v^v>^<<v>><v^<v<^v>>>^^^v^<>v<<vv><v>><v>v><<^v>^<^<<<^^^<^vv^<>v<<v^v><>^vvv^v^^^>v>>>v^^<^v^^^>^v^^^>v<^v<v><<^>><^v^<vv^<>>^v<v<v<>^v<<>>>>>^v^^v<<>v<<v^>^v<<><v^>vv<vvv>^vv^<^<vv><v^^>><>><<><^v^>v^>^<<>^>^^vv^^<<^>><v^v>^<v<v^^v^<>>vvvv^<>v>v<^><v<v><^^<v^^vv^<^<<<vv>>^v<vvv<v<^>>>v^><>^^^^^^v^<v^<^v<v^>>>v<v<vv<^^<><><v<^v^<^^<<>vv^^^<>^<^^<v><
>>^v<<v><<^>v><<^<^<<<vvv>^^>>v<>^<^<^^^<v>v<vv^>>v<>v^><>v>^<>vv>><^^<^<>>^vv<vv>^vvvv<<^<>><>v>>^><>v^vv<^v^>v^^vv<<>v<<vv><^^>>v<v>^<>^^^><>v^<<>vv^><<>^>>>>^<^<^^>v>><^^v>v^v<><><^^^^><>^<v^<>^<<>vv<v^>vv<v^^>^^><v>v^v>v^^>>><<^v>>><<<<><<>v>>v<<v^>vv<v^v<^v^v>^>>vv^vvvvv^>v^vv>^<><^><v^v<>^>vv>>^vv^v><^<><v<<>>^><^vv^<v<<v<^<<vv>v^<^v<<<^^v<>><^v<v^^v^<<v<>^>^>>>v<<vvvv><^v<>>><vv<<>>vv^>^^vv>^vv<<<>^v^<vv><v>^v>vvv^^^v<vv<^<<v<>v<^<vv<>>^^<v<><<>v>vvv^>^>vv><<>>v>><<>v<v<<^v^<>>v<>^^^^>><vv^><<>vv^><<<<^<<v<<<<^^v>^vv>>^<^^^<^v><v^vv^<v<<<<<<>><^vv<>v>>v<><<^<>>vv><><vv^><^v<<<^^>>v>^^^^v<<v<v^<<><<^^^vvv^^^v>><v<<<^<>vv^<^^<>v^>>^^v^vv<v^v>^><^^>>^>>vv>v<>^^>v<vv<v^>>v>v^<>v>><^^vvvv^<<<>v<v>^<<^^>^^<vv>^><^vvvv>>v^<v^>^>>>v<<<<<><v<v>v>>v>^>v^<<><^^>><v^^v<^<<<v^<><^<^>^>v<>^>v^^v<vvv>^<<^^>v<vvvvv>><<^>><<v<>^v>v>^v^>v<v^<^v>v^>vv^><<>^^<v<<^<v<>^<vv<^v<>>>>v>>^<<v>>v>v<^<<^v^<><>vvv<^<>v><v^^^^^v^vvv^^>>><<>v<v<v^v<><^^^<^><<><>^>>>>^^>><>^^v<^^^<>^^^><>>>v>^>^<v>v^<>v>^>v>v<
^>v<v^^<v<v><v>v>^<<<<^><<<v^>^>^^<^^<^<^v<^><^v>^<^vvvv><><<^^<v<v<vv>v>^^<v^><^v>>^>><^v^<^<v<>^<^vv>v^vvv^^><>>v>>^<^^^<><v<^<^^<<^vvvv^>v^^<^>^>v^<>^<<><v<v<<<><v>>>>^^v^^^<>>>>vv<v^<<<<<^><>>^^v<<><<v>>>v<>^<<^<^v><^>v<v>^<vv>^><v<^^^^v^v<<v<v<v>>vv>^^v><><<<vv>^vv^v>v<^^vv^v^^<^<^^vvv^^^^^v^^><vv<^>^^><v^v^>^>^>>>^>v^>v<v<v><^^<>v^vv^vv<>v^^v><v>^v<^^^<v>v><v^>><<^>><^>vvv^vv<^><v^^^vv<>v^^<>^<<^^>vv<<v>^>^>v><<^<v>>^>^v^^>v><>>>^^^^^v^vv<<^<^^v^v<v>vv^vvv>v^<^v^^>v^vv>^<v^<>v^v>>>v<^<v<<>>v^v^<<<v>><<v>><^vv>v>>>>^v><>><>v^vvv>v>^>v>>><<><><v<vv>v<vv^vv<>^v^>^<v>v^^>>^<<v><>><^<>>><>v^v<^v<v^>vv>^v<<^<><v>><v^>^<vv^^v>><>>^>^v>>vv>>><<<<<<v^v>>^<<<<v<><^^^^^^^>v<>^>^v<><<^>>><^>^^^^v>>^^>v^>v<^v^v>>v^<v^><><><>><v>v>^>>>^<<><^<vvv^^v<<^<<^v^<>^^>^<v^^>>v>^v<>v^<>>^><^^<vv><<^^^<^>^<<<>>^vv><>^<^^^>^<><^v><<<<^>^>v<>v^>>^^vv^<v^<v<^vv^vv^>vv>^<><^v<^^<>v<vv^vv>v>>^^<^v<<^><v>^v<^<^>v^^^v^<><^<<^<<<v>>>>^><v>^>^^vvv>v><v>^v><vv^<<><v>^>v<<v^^v^v^>vv<v>v>vv<v<v<^v><<^>^^v>^<vv>>v<v
^<<<>^^<>v<v^>v<v^v^^^<>v^^^v^^<v><v<^^^^v^<>^^>^v^<^>^<^<^><><<>^^^v<>><><>>>>>vv^v^^v>vv^<<^<<v>>^^<>>^<>^vvv^vvvv<<<<v<v^v^v<^^>v<>v>>v<>^<^<^<^v<<>v>^<vv<^v^<><<>>v^<v>vvv^>^<<<^<v<v^<v<^^<>><><<>><>>^v>vv<<vv><^^^^^v<v^>vv^><><v^>v^^^<v>v^^^^vv^^v<<^><<v^>^^<^<^vvv<vv<^v>>v>>>v<v^>v<v<<>v^v<vv><^<vvv<>><^v^v<<^^<>>><>^^<^<<v<^>vv^^>v>v^>v^^>v>v>v>^><^<><v^^<vvv^>><><^v^<v^>vv<v<>>>^<<^<^^<v^<v>>v<>^>>^^vv>>^^vv<v>>^^^<v<v<^>^>^>^<>>v<<^^v>^^^v^<>v^><<>>^><^>><v<<v><vvv^^^^v>vv^<<<^^v>>^^<^v^v<><^<^vv<<v><v^>>v<^<v>>>><^v<<^<^<vv<<^>vv<^>>><^>^<^<<^^^^<v^<v^<v^>^<^>v<>v^^>^<v^>^>^>^v<^^<<^>>^>v>v>>^<^>>vvv^>>^<<v^vvv>vv^>v<vvvv>><^v^<vv>v>^v>^^>v>^<>vv<vv<<vv^^>>^v<^^v><>v<^<>v^>><v><^><>><v>><^^v<v<<v^v<>v<^^<<^^<<<<^<><<>v><>>>>>v><>>^^><v<^^v<<v<>v<vvv<>><>>^<v^v>>><v^^>><v<>>v<>^<>><>vvv^>>v>^>v^>v><^<v^>>><^^v>^<<v<^v^^v><v^^v>^v^<>^v>v^><^<v>^vv<><>^vv>vv<vvv><v^<>><^<<><vvv>v><<vv^><<<>><><^^v^vv<v>>>^>>>v>^<<<<^>v^>>v<^>v><<v^^>^>^>v>^<v>v^v>v>>><^>>v<v<<^v<v<<v>vvvvv<v^^^<
<^><<^>v^v>>^>^vv<v^v><>v<v<>>^<^^<>^>vv<^v<^^v>^<^^<<<>^>vv>^v^^vv><<>^vv>v^>>v<^<<<^><>v><^><<vvv^<<^vv>v<><><^v>v^v<v^<<>^<^>>vv^v^v^<^^vv^^v^v^v<^<>>v<<><v^v<^^v^^<^<>v<>>>>>>v^>>^v^<^>^>v>^^v<<^<>>><vv^>^>><<>>^><v<>vv<><vv>v^><><>^>^<^<^v^^>>v<>vv^>>>>^<v^^><><<<v^^>><><^^<^><><^>v>v>v^vv<<v><v>^^<^^>><^><<<v>>^^^^>>v<v>>v<><>v<^v>v<v>>v<v<<^vv>^v>>^<>>><v>v^^v^>^<v<>>><vvv<<^>>v^v^>^>>^<><>>^<<>^vv^^>^v<>>^^^vv<^>^<v^v^vvv^v>^vv^^^<^^><v<^><vvv<>v>^^>>v^<v^<^>>>>>v^><>>>^^<<<^v^v^^<v<^v><^v><>^^vvvv^<<<v^vv<^v^v<v^<v<<^vv^^v<<<<>>^<>>>v^<>^>^<>>>>^<<>^^^>v^<>v><<>>>^v^vvv^v>v><v<>v><<vv<^<^>^>vv>^>>^v^<^><<>^v^v>>>^<v>^v^<>>^<>v>^><><v>>^<^v<v^vv^><^<<<^vv^v^<>^><v<v>>v>>^<>^v^>vv^^^^v>>^>>vv>>^v<<<^>^^>^<v>vv^<<<^^>>^<><^<<^<vvv^<>v<>^^^<vv<vv^>v^>><vv^<^^><<>v^vv<><<v^<<v^>>^>><<v>>^^v><<^^<^<<<><v<v<^<<vv^<vv^^>>v<^>^>>v<^<^<<>^^^^^<v<^>^^v>>v^^>^><><^v<<<^>>>^^^<v^vv^^<v>^>v<v^<^^<<vv<>^>>^>>^><^<>vv>^>v<><^<<>v<<^>vv>^^v>^>^v^>^>^>^^><^>v^>><^<<v^>^vv^<<<>^^v<vv<^>v>^<>vv><
^^<v>><v^vv^>^vvv<v^vv<vv^<v^<><v<>v>^<<>^<vvvvv<vv>^<>>^vv^^^><^<<<v<><vv^<<<^^>>v>><^v>v^>^v<^v^>><v>^<^v<v^v>^^^>v><v^<<^^<^^^^^<v>^<>>^vv>v<^v><>^v<><v^v>^><<>><v^<>>v>>v>vvv^v><v^^<<>vv^><<><><vv^v><v>vv>>^v^<<^v>><><><>>><v<v<<<v<>><<^^<>>vv<>v^><^>>^^^v<>v>v>^^vv^v<>^>v^<>^<^>><>>><<>v>><>^v^v><>v>>^>><^^<<^v^>^>^<^<>>v<<^^^vv><<<^v>^^<v>v<vv^<^<>v^^^>>v>v>v<>vv<^<>vv><><>><^>>vv^vv^^^<><>^<v^vvv>^<>vv<<v>v^<>>v^^^v><>><><v^>^v^<<^^v>vv<^>>v^<vv>vv^^>>><><v^v^<v<<>v^^>^v^^v^<<>>v>^^v<>v>>v^v<v^>v^><v^v>^<^<^<^vvv>v<^<^<<^<<>^<v<^>v>>>>^^>v<^v<^>v^<>>v><vv<>>><^^<^v<^^^vv>>>>v<v^^v<<>^^>^>^<><<>v^v>^^vv^>><>>^vv^<v<<<^v>^<>v>v>>>^v<><v^^^<<><v<><v^v<^<<vv^><>^>^>^<>>v^><<><^^<^><<^vv<>^>>^^^v^^<^<><^v<v>>^<^^v^v<<v^v^<vvvv^<<>><<v>v^>v<v<<>^^>vv^<><v<v><^<><^<^>v>>v<v<vv^^<<^^<>^<v^<^^v^^>^vv<^<^>^>><vv<vv>v>^<>>v^><v<^>v>^><vv>^^<><>v<v>v<>^<^v^<><v<vvv<^^><v>^^>v><^<>>vv>v^<>^<^v><<<^^>^v^^><v^<vv>^^^v>^v>v>>^^v<^v^<>>><>v<>vv^>>^vv>v^v<v>^vvv><^><>v^><<<<^<v^v><v<<^^><vv>v^<^>
^>>^^^vv>>^^<<><<^v>>><^>^v^^v^v<<vv^<^>><v^>vv^><^<^^v^>><<^>><>v^v<v>^^vvv<<<vv>^^^><^^v<v<<<><<<^>><^><^^><<>^><>>^<vvvv^^<^>v><v>><>>^><^^^^^vv>v<<><vv<^^^v><^>>^<v>^vv^>>^vv<vvvvv<^><^vv^^>vv<^><v^>^^v><><<<v<^>>v>>>^v>^vv>>>v^<>><v>>vv^<^v>v>v><>vv^>>>^v<>v^<vv^^vv>v<v<<^^vv><v>^^>v<><<v><>><>^v^vv^<^<^>^>><>^<>^<vv^v<><v>^<>v<>><v<>><<v>vv^>v<vv><<v>^<><^<><^>>^v<vv^^v^>^><^vvvv^<>^vv<><<^^^v^<>^vv>v^<v<>v>v>^^<<^^>^vv<v><v<v<<^<><<<><^v^^>^<<><<^<v^<^><^>^<^<>^^>><^^<v>vv<v^v>v>><<^<^^<v^>^^<^<^^<v^<<><>v^>v^^v><<^><^^^^<>^><>v>^v<vv>^vv^^>>^^>>v^<<<^vv^>vvv^^^^<v<>>v<<>>><^v<><<v>v^v^^^v^<>>v^v>^>><^^<<v>>><<^^>>v^^<^>>^>vv^^v<<v^<v<^>^<v><<<v^v^^><<v>^^^v<v>>^>>^><^^vvv^^>>>^v<v<^>^v>>v^>><^v^v^><>v><>v>vv^>>><^<^vv<><<^<<><<^^^^>v<^>v<v<><vvv>^>>vvv>v>^<^v>^vv<<^<^v<>v<<v^^v<>>^^<>>^><<vv<><<v^v>>^^v^<><^v>^>^>>>^^<^^>vvvv^vv<v^^<<><>^>v^v>><v^<<<v<^v>vvv>>v<<>^vv<v>^vv><>^^<<^<<<<<<<>^^<>v<<<^<<<<<<><>^>^vvvv<<^>><^^^vv^>v^v<<>^><v^<><v>>^<vv^vv>^>v^<<<<vv><<<<^<<>^<>v^v^^v
v^v^<<v>vv^^><>v><^^^<v<>^^>>>>>^<^<>^^<^<<>>vv<>>v^>^^><<^^<v>^^>v>>><v<v><<><>v^^v>^vv<v<vv<v<><>>v^><<vv^<<<^>v<<v>>>>>v<^vv<>>>v>^<^>^>>^>^^><>^^^v<^v^<vv>v><^<>v^<>>^<<^<>>^^vv^v^<<<^>v<<<<^<v<<<<>^><v>>v><<<>vv^<^>^^<>>v<v^<v^><^^v<<^>^^v^^>><^vv<><<>>^^<vv<<^v<^><>>vv^^^<>>^v>v^v^v^>^v<><>^vvv>><<^>v<v>^^<<^v<<v<^<>v^<^>>vv>v^v<vvv<>vv^^>^<v><<<><^><<<v><v^>v^v>v>><^>^><<v<><vv><v<^vv<^><vv>>^v<v><<v^^>^^><vv<v>><v>v<^vv^^v^<v>^vv><vv^^^>^><>^^<v>><>vv>>^v>>>>v>><>v^v^^<^>v<^>>^>vvvv>^^><^<v^^vv^v^<^><vv^^^>^^><><^vv<^<^vv^^<<vv<v<^>vv^^><v<>v><><<v>^><v^><v>^<^vvvv<^<v<v^v<v><>><><>v<^>><<^<<^v<v><v<>>v><><<<vv^^><vv^<v<vv>><^><>v^v^v>^v>>^^vv<><v>>><><>v^v>^^<^<v>^^>vvv<v><^^>>v^>>v^^v<><<^v>><^>>^<v<>v^><>^>v><^><<^v^^v>^><>>>vvv<v^^<><^<<<<^^vv><<>vv^v>v<>vv>v^^v<^><vvv>>vvv<v<^^<<<<<><v^>>^>>v><^v^<^<><<<v<v<^v^^v<^^^><v^^vv^^<<^v^^^^<>^><>^v^v^v<^<<v<^>>^>v^v^<>>>>v<<><vv<v<^>^^>><v^vv>^^vv<>vvvv^<<<<vv<>^^vv>>v>v<^v^v>v^^v<>v>v>v<vv^vv<><^<>^>^>>^>^<vv<<vv^<><<<vv^v>vv^<>
<v<^<v<^>>^vv^>^v^<<^><^<v^<^^^<^<<>>>^^<<^<vv^v<v<<v<vv<<v^><^<<>>^<^^v><^v>>^>^^<<^^v^vv<v<<>^^<^>v>v^<vvv<><^^<<vv^<>>^^^>>v>><^<vv<^><>^<^v^>vv>v^^v^^>^^<>^>^>^<v^v><^><^><>^^><<v^v<<<v^v<><<<v^<><>v^vv^v<>v>v^<^>^<<>><v<vv<^^<<>>^>^^<^<vv^v<><^v<vvvv>>><vv<><v>vv><v^^>^vv>>vvv>^^<>vv>v><<v>>^<>v>^^>^v^^vv^^v>>^<>>^^<><vv<<v<^<v<^v>vv^<>v><^>^<<v^>v>^v^<<vv<<^^<v^<<>v>>^v><<^>^^<<><<<^^v^<>>vv<>v^v^>v<<v^v<^^<>vv<v>><>v<^^^<>>v>v<^<v^>v>>>v><<>>>vv><>^<^>><v<>>v^><^^<v<^^<>>>^>v<<>>^^<><^vv<vvv<^>><^vvv<^<<v>v>^v<>^<v<>>^<v<^<<v<^v<v<<<vv<^>><<>v>vv><>v^>^<>v^vv<<>^^^v>v^>>^<>^>v^^^^<v>>^^>^<<v^vv>^v^^v^v^<^v^><>^v<^^^<v^^>>^><<^^<v><v>^^v>v>>>v^>v<vv<vv^^><vv^v<<<<<><<v^<<>>v<<v<vvv>v>>>^>>>^<>>>>v^>vv<<>^><<v>^v^v><<vv<vv<>v<<><>v^vv>^>>^^><^<vv^<<>^v^vvvv<<^>v<>vvv^<><<<<>vv^^>>><>v>v<^^<v<v<<v>v^^v<<<<^>^<v^vv<v>v>>>^vv>^v<<^><v>vv<^v<v^<><v>>>^<>>><>^^<>^v^>vvv^v^^v^<^^v<^>v^^<>^<^><v^<<v<<v<<^^>^v^^>><<v>>v>^<v^<>^^><<<v^<>v>^v^vv>vv<<>^^<^>>^<<>><>^v^<<<v^><<^^^<^v<<v^>^^vv>
+342
View File
@@ -0,0 +1,342 @@
ROBOT_SPEED: int = 1
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Coord(self.x * other, self.y * other)
def __rmul__(self, other):
return Coord(self.x * other, self.y * other)
def copy(self):
return Coord(self.x, self.y)
class Warehouse:
robot: Coord
walls: list[Coord] = []
boxes: list[Coord] = []
width: int
height: int
def __init__(self, warehouse_map: list[str]):
for y, line in enumerate(warehouse_map):
for x, c in enumerate(line):
match c:
case "#":
self.walls.append(Coord(x, y))
case "@":
self.robot = Coord(x, y)
case "O":
self.boxes.append(Coord(x, y))
self.width = len(warehouse_map[0])
self.height = len(warehouse_map)
def __str__(self) -> str:
w = [['.'] * self.width for _ in range(self.height)]
for box in self.boxes:
w[box.y][box.x] = 'O'
for wall in self.walls:
w[wall.y][wall.x] = '#'
w[self.robot.y][self.robot.x] = '@'
s = ''
for row in w:
for c in row:
s += c
s += '\n'
return s
def move_robot(self, command: str) -> None:
dx, dy = 0, 0
match command:
case '>':
dx += 1
case '<':
dx -= 1
case 'v':
dy += 1
case '^':
dy -= 1
movement = Coord(dx, dy)
new_pos = self.robot + movement
if new_pos in self.walls:
return None
if new_pos in self.boxes:
if self.push_box(new_pos, movement):
self.robot = new_pos
return None
self.robot = new_pos
def push_box(self, box: Coord, movement: Coord) -> bool:
new_pos: Coord = box + movement
if new_pos in self.walls:
return False
if new_pos in self.boxes:
if not self.push_box(new_pos, movement):
return False
self.boxes.remove(box)
self.boxes.append(new_pos)
return True
def score(self) -> int:
total = 0
for box in self.boxes:
total += 100 * box.y + box.x
return total
class BigBox:
right: Coord
left: Coord
def __init__(self, left: Coord):
self.left = left
self.right = Coord(left.x + 1, left.y)
def __add__(self, other: Coord):
return BigBox(self.left + other)
def __eq__(self, other) -> bool:
return self.left == other.left and self.right == other.right
def __str__(self) -> str:
return '[]'
class SecondWarehouse:
robot: Coord
walls: list[Coord] = []
boxes: list[BigBox] = []
width: int
height: int
def __init__(self, warehouse_map: list[str]):
for y, line in enumerate(warehouse_map):
offset = 0
for x, c in enumerate(line):
match c:
case "#":
self.walls.append(Coord(x + offset, y))
self.walls.append(Coord(x + 1 + offset, y))
case "@":
self.robot = Coord(x + offset, y)
case "O":
self.boxes.append(BigBox(Coord(x + offset, y)))
offset += 1
self.width = len(warehouse_map[0]) * 2
self.height = len(warehouse_map)
def __str__(self) -> str:
w = [['.'] * self.width for _ in range(self.height)]
for box in self.boxes:
w[box.left.y][box.left.x] = '['
w[box.right.y][box.right.x] = ']'
for wall in self.walls:
w[wall.y][wall.x] = '#'
w[self.robot.y][self.robot.x] = '@'
s = ''
for row in w:
for c in row:
s += c
s += '\n'
return s
def move_robot(self, command: str) -> None:
dx, dy = 0, 0
match command:
case '>':
dx += 1
case '<':
dx -= 1
case 'v':
dy += 1
case '^':
dy -= 1
movement = Coord(dx, dy)
new_pos = self.robot + movement
if new_pos in self.walls:
return
if box := self.is_box(new_pos):
if self.push_box(box, movement):
self.robot = new_pos
return
self.robot = new_pos
def is_box(self, pos: Coord) -> BigBox | None:
for box in self.boxes:
if pos == box.left or pos == box.right:
return box
return None
def push_box(self, box: BigBox, movement: Coord) -> bool:
new_box: BigBox = box + movement
# def push_box(self, box: Coord, movement: Coord) -> bool:
# if movement.y != 0:
# return self.vertical_push(box, movement)
# new_pos: Coord = box + movement
# new_pos2 = new_pos.copy()
# if movement.x > 0:
# new_pos2.x += 1
# else:
# new_pos.x -= 1
# if new_pos in self.walls:
# return False
# if new_pos2 in self.boxes:
# if not self.push_box(new_pos2, movement):
# return False
# self.boxes.remove(box)
# self.boxes.append(new_pos)
# return True
def vertical_push(self, box: Coord, movement: Coord) -> bool:
pass
new_pos: Coord = box + movement
# other_new_pos: Coord = new_pos
# if box in self.left_boxes:
# other_new_pos.x += 1
# else:
# other_new_pos.x -= 1
# if new_pos in self.walls or other_new_pos in self.walls:
# return False
# if new_pos in self.left_boxes or new_pos in self.right_boxes:
# if not self.vertical_push(new_pos, movement):
# return False
# if other_new_pos in self.left_boxes or other_new_pos in self.right_boxes:
# if not self.vertical_push(other_new_pos, movement):
# return False
# if box in self.left_boxes:
# self.left_boxes.remove(box)
# self.left_boxes.append(new_pos)
# self.right_boxes.remove(Coord(box.x + 1, box.y))
# self.right_boxes.append(other_new_pos)
# else:
# self.right_boxes.remove(box)
# self.right_boxes.append(new_pos)
# self.left_boxes.remove(Coord(box.x - 1, box.y))
# self.left_boxes.append(other_new_pos)
# return True
# def can_push(self, box: Coord, movement: Coord) -> bool:
# new_pos: Coord = box + movement
# if new_pos in self.right_boxes or new_pos in self.left_boxes:
# return self.can_push(new_pos, movement)
# return new_pos in self.walls
# def score(self) -> int:
# total = 0
# for box in self.left_boxes:
# total += 100 * box.y + box.x
# return total
def main() -> None:
with open('test.txt', 'r') as file:
data: str = file.read()
warehouse_map, movements = [s.split("\n") for s in data.split("\n\n")]
movements = ''.join(movements)
# Part 1
print('<', '=' * 25, ' PART 1 ', '=' * 25, '>')
warehouse = Warehouse(warehouse_map)
print(warehouse)
for command in movements:
warehouse.move_robot(command)
print(warehouse)
print('Score: ', warehouse.score())
# Part 2
print('<', '=' * 25, ' PART 2 ', '=' * 25, '>')
warehouse = SecondWarehouse(warehouse_map)
print(warehouse)
# for command in movements:
# warehouse.move_robot(command)
# print('Movement: ', command)
# print(warehouse)
# input()
if __name__ == '__main__':
main()
+9
View File
@@ -0,0 +1,9 @@
#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^
+91
View File
@@ -0,0 +1,91 @@
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Coord(self.x * other, self.y * other)
def __rmul__(self, other):
return Coord(self.x * other, self.y * other)
def copy(self):
return Coord(self.x, self.y)
UP = Coord(1, 0)
DOWN = Coord(-1, 0)
EAST = Coord(0, 1)
WEST = Coord(0, -1)
class Maze:
map: list[str]
start: Coord
end: Coord
def __init__(self, file_path: str):
with open(file_path, 'r') as file:
self.map = file.readlines()
for y, row in enumerate(self.map):
for x, char in enumerate(row):
if char == 'E':
self.end = Coord(x, y)
elif char == 'S':
self.start = Coord(x, y)
def get_pos(self, pos: Coord) -> str:
return self.map[pos.y][pos.x]
def is_wall(self, pos: Coord) -> bool:
return self.get_pos(pos) == '#'
def is_end(self, pos: Coord) -> bool:
return self.end == pos
def lowest_score(self, pos: Coord, score: int | None = 0, dir: Coord | None = None, facing: Coord | None = EAST) -> int:
print(pos)
if self.is_end(pos):
return score
if self.is_wall(pos):
return float('inf')
if dir:
if dir != facing:
score += 1000
facing = dir
score += 1
pos += facing
return min([self.lowest_score(pos, score, dir, facing) for dir in [UP, DOWN, EAST, WEST]])
def main():
maze = Maze('test.text')
print(maze.lowest_score(maze.start))
if __name__ == '__main__':
main()
+15
View File
@@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############
+5
View File
@@ -0,0 +1,5 @@
Register A: 62769524
Register B: 0
Register C: 0
Program: 2,4,1,7,7,5,0,3,4,0,1,7,5,5,3,0
+167
View File
@@ -0,0 +1,167 @@
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class Machine:
register_a: int
register_b: int
register_c: int
ic: int = 0 # Instruction Counter
program: list[int] = []
def __init__(self, program: str):
self.register_a = 0
self.register_b = 0
self.register_c = 0
self.program = [int(x) for x in program.split(',')]
def interpret_combo_operand(self, operand: int) -> int:
match operand:
case operand if operand in range(0, 4):
return operand
case 4:
return self.register_a
case 5:
return self.register_b
case 6:
return self.register_c
def adv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_a = int(self.register_a / (2 ** operand))
def bxl(self, operand: int) -> None:
self.ic += 2
self.register_b = self.register_b ^ operand
def bst(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_b = operand % 8
def jnz(self, operand: int) -> None:
if self.register_a == 0:
self.ic += 2
return
self.ic = operand
def bxc(self, operand: int) -> None:
self.ic += 2
self.register_b = self.register_b ^ self.register_c
def out(self, operand: int) -> int:
operand = self.interpret_combo_operand(operand)
self.ic += 2
return operand % 8
def bdv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_b = int(self.register_a / (2 ** operand))
def cdv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_c = int(self.register_a / (2 ** operand))
def run(self) -> str:
output = []
while self.ic < len(self.program):
opcode = self.program[self.ic]
operand = self.program[self.ic + 1]
logging.debug(f"IC: {self.ic}, A: {self.register_a}, B: {self.register_b}, C: {self.register_c}, Opcode: {opcode}, Operand: {operand}")
opcode_out: None | int = None
match opcode:
case 0:
opcode_out = self.adv(operand)
case 1:
opcode_out = self.bxl(operand)
case 2:
opcode_out = self.bst(operand)
case 3:
self.jnz(operand)
case 4:
opcode_out = self.bxc(operand)
case 5:
opcode_out = self.out(operand)
case 6:
self.bdv(operand)
case 7:
self.cdv(operand)
if opcode_out is not None:
output.append(opcode_out)
return ','.join([str(x) for x in output])
def part1():
INPUT_FILE = "input.txt"
with open(INPUT_FILE, 'r') as file:
data = file.readlines()
reg_a = int(data[0].split(':')[1].strip())
reg_b = int(data[1].split(':')[1].strip())
reg_c = int(data[2].split(':')[1].strip())
program = data[4].split(':')[1].strip()
machine = Machine(program)
machine.register_a = reg_a
machine.register_b = reg_b
machine.register_c = reg_c
print(f'Output: {machine.run()}')
logging.debug(f'Final Registers: A={machine.register_a}, B={machine.register_b}, C={machine.register_c}')
def part2():
INPUT_FILE = "input.txt"
with open(INPUT_FILE, 'r') as file:
data = file.readlines()
reg_b = int(data[1].split(':')[1].strip())
reg_c = int(data[2].split(':')[1].strip())
program = data[4].split(':')[1].strip()
program_len: int = len(program.split(','))
reg_a = 8 ** program_len - 1
# machine = Machine(program)
# machine.register_a = reg_a
# machine.register_b = reg_b
# machine.register_c = reg_c
# print(machine.run())
# print(program)
# exit()
# Naive solution but it works (in time)
while True:
logging.info(f'Testing Reg A: {reg_a}')
machine = Machine(program)
machine.register_a = reg_a
machine.register_b = reg_b
machine.register_c = reg_c
output = machine.run()
logging.info(f'Output: {output}')
if output == program:
print(f'Correct Reg A: {reg_a}')
break
reg_a += 1
if __name__ == "__main__":
part2()
+5
View File
@@ -0,0 +1,5 @@
Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0
+5
View File
@@ -0,0 +1,5 @@
Register A: 0
Register B: 0
Register C: 9
Program: 2,6
+5
View File
@@ -0,0 +1,5 @@
Register A: 10
Register B: 0
Register C: 0
Program: 5,0,5,1,5,4
+5
View File
@@ -0,0 +1,5 @@
Register A: 2024
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0
+5
View File
@@ -0,0 +1,5 @@
Register A: 0
Register B: 29
Register C: 0
Program: 1,7
+5
View File
@@ -0,0 +1,5 @@
Register A: 0
Register B: 2024
Register C: 43690
Program: 4,0
+5
View File
@@ -0,0 +1,5 @@
Register A: 2024
Register B: 0
Register C: 0
Program: 0,3,5,4,3,0
+402
View File
@@ -0,0 +1,402 @@
grbb, burb, wrwbrwg, uwwb, bwbbw, ubgrbu, gguu, uru, gwr, wrw, gubwb, g, gwbu, rbw, bbuu, rwgbr, urrr, rwww, wrrb, ug, rubbwuuu, gbrbr, brb, wrubb, gwrgbbgu, wggwbrww, rwwb, br, buuwr, rgrbb, wgubb, gbb, gbrb, rubw, ubr, guu, wrugbg, gubwru, bww, rbu, burr, ugu, bbggguw, bguw, ubu, uuuw, uugww, urugr, uwgur, gugrgggw, b, gugu, wgb, rwgwuu, guw, brg, ubur, wbwwb, ggbg, wr, urw, wur, brwgrw, uuur, rwwg, rrbrbggw, gwrurwg, rurru, r, bug, ruwrww, brgwu, bwgurbu, rwuu, guub, rrbwb, rbgwbr, grbrugbu, bwugwugb, guwww, ugwggg, buggrug, urb, bbbwuur, ururgur, wu, bbbru, ruuw, grr, buw, bub, gbwwug, rwrbw, wrbg, wubr, u, wgrb, wbuub, ugrugwg, wggbrr, gr, uur, ugb, wbg, uub, bbbrww, uwbr, buwguww, wbwgw, ubuuwr, wuuwgr, wggw, gwurgub, rwwu, bruwg, bgbrbwb, rbgg, rbg, bubggwu, gubgrur, gwb, rgu, wrr, uug, bgw, ruuugu, uwbg, rgurgwwb, wrwgb, brbbr, wgrgu, brgbwb, gub, uugw, wrrbb, wwruuru, grrw, urgg, gbwg, ubbur, bggwwgw, ubggw, uwgw, ruu, wwuu, bwuu, uggw, gwu, urg, rwbb, uwwub, ruug, bwbbu, wbb, bwwwu, rbwrruu, gg, ugrbbwgb, wbbwwr, bbwrrrb, rgwwu, bbr, wbuwb, grub, ubwwgu, ubb, brrbuu, grw, bwugg, wurbu, uwrb, rwgg, rurbuu, gbrug, brwgr, gru, bgrub, uuwr, gbwww, bbrw, rbr, bwrg, ruur, gbbgr, brgwug, ugg, bwgubu, rrg, ub, gbuwu, ubuwuw, ggw, wrgww, uuwb, bwr, bb, ruwu, bwugrw, buu, wug, gggwbwu, brurg, rrur, gb, wg, ggruwbu, gbg, bruur, gug, rgr, gwuuu, uwwurr, ubw, uugbuw, ruugwu, bu, ubrbw, ggu, rug, wgurwurr, ugrrbr, brgrb, rrbrgwww, rrgg, grb, brbw, bruwgw, uwbw, rgg, wrg, rrruwr, gguw, bugbbrw, bbg, rwg, wbuwg, uuu, wruwur, ugwb, bur, urgb, bg, uwubrwu, rwbwwg, rub, wwwwbw, rbbugbr, wgg, bwbb, brw, ggugb, guggw, bgg, wwr, gwrbb, rbb, bgb, brrubwb, wwu, bggrrwu, bugb, gwugw, grg, wrb, wuub, bru, gggrr, wuw, uwg, gbgurg, wguwug, gbwgw, bgrb, wguuw, rwr, ubuww, wruuw, wurur, wuu, bbw, brbgubb, bubg, wgw, wwuwrw, bbwu, bbrgubw, uwu, bw, wbr, bbu, bgr, ubg, rwrgg, uggu, wugggb, wwbgguur, wrwuwb, rgrr, wgbu, ggb, ubuw, rgugg, gwuru, guuubbw, bgbrrw, rrgwg, gbw, wbu, wuwg, gugb, uww, ruugb, rubu, ugwbw, bbrgrg, grbrr, guwgruwr, wwbr, wgruw, grwg, wgr, ururwr, gbbg, gbuub, uwr, grwgrwr, ruw, wru, ggr, guwuu, uwuuwu, gbu, rwbbgg, ruruww, wwwur, rgrug, rbbwg, rgwugwg, wbw, bbru, ggg, bbuugrrg, uugb, rw, gburwww, rububugg, gguubbg, rrrurwwg, buruwrb, bbwrggwb, gbrbwr, uruwwu, wwwurbu, rrwb, bbb, bwg, wurggubb, wgu, gwwg, wururruu, bbbu, ur, rwb, uwww, wgwr, rr, rru, uuw, uu, bwgw, brr, wub, bwgbrrw, gwrgrw, uw, ggguwbg, bubbur, ubbggu, ugr, rrrw, ru, rb, gwwbgw, rrr, rrw, gruw, rwrrbb, rugr, uubw, ruwb, uubbbu, gur, wb, rrrrwww, bbub, bgurwg, ubbugw, gwbw, gggbru, ugru, brru, ggwg, wwg, ugubr, urggbu, ggwuww, gbr, guwubu, rwu, gwg, rrbur, gwrg, wwubr, uwb, gbrr, rurburb, brrg, ggur, rurbw, uwbu, grbbu, wgur, urr, rgggg, rrb, ww, rww, bwwwr, wubwubgw, ggubw, wwb, uurb, wbrggwu, ugw, rggwwr, urwu, gwwggg, uwuubwr, gwuubww, uwbwu, www, gwgwr, bwu, gu, rur, wwwg, uwruub
rrwuwuurrrguggbrrrrgwwururguggwuwrwwurwuuwbw
wrrugrgbuuuurgubbbbbggrrwgrbgggbwuwwbuubwrbgwwgbww
uurwwrgbuuburbgbrrgugrgwugbwrwguruugwwgguwugrgwggrur
rgruurwubbgggwwuwwgurrwuugggbrbuwgwrubrgw
gugwbgbwbbgurrbrurwbwwgwwgbrgwuwruubwuwuggrrrgbgb
urwguwuggwbbwgbrbbgubwbggwggwgrbrrruguruggbgruwb
grwbubrugwuuubgbgburrgbuuuwruruuugrwgrrbwwrgbwrbwrugubgu
wwrbruwrgbgubuurwrgbubbwwgbwurwrrbwwurrgugggrbwurrrb
bwugbgrugbuwbuurrgurwbrggrggrbrgurgwwbbgrrbgbubrgrrbwgrbwu
grggrbwrwbuwrgwrbggwrrggugugggrwbwwrguuuuwgrrgbgwuurug
gbugrrruubgbgwrggbwgrwwubrrbubrgbbgubbbuurwbb
bgrrbbrwbrguurggwrrrgrrgwururbggururgwwgrwgbuugbg
uwwubbuwgwuggrruuuwbgwrrgwrbbrgggubwugubuuubwwbbwuwru
ruwgguggbgbbwwrbbrubrrruugbwwgrguwubwgbbgburu
wrbubwugwgurrrrrbwwwuubbubgrbbgwrurrrrbugggw
rbwbbrbrrwbugurbbbrubbgbbgbuwbrbbwrggwbrwbguguubggwgbruww
gggwrrgubuurrrrrurwubgwgbuuggrrwrurbbgugruruwrrgurugu
gurrbwbrbubguwbbrgwggruwuwrrrwwrggggrwuwubgubugwwgbgwrwgurgw
grbgrgguwrwrububbrburbgrubuwrwwbbwwgbbuwwwbubgrbgbr
ubbuwuguwbwwbubbbbburbuububwrwwbwgubrubuwwwuwrrwrwwggubggg
buwrgrrbuuwbbrgggbbwuruugbwwgwggwwgrrbbggrbuwuu
gguguwbwrrggguurrrwuwbrwwwwrruwuwguuggrrrbgwwgrbbbrgrbrgb
bgbugwgwwgwwwgrbwuwugwbgbururwugwuwwurwwbuubrw
gwggguurbubwbgwgrwwrgrubuurrrugrbbuugrrgbuurggbgwbwwwur
gwruwwbrwwgwrbgbguwwugrwruwrgubwbbwbbugrwbgguwurguwu
gwbruubwwrbbbbbgruwgwgwgbrwgururrrwugwgrubbggbuwuwwbb
buuuwwguwbwgwbbuwgubbrggwgggburwbgbwwrbuguwgwbwugrggr
ubwrubuwgbgbwgggwrwgrwrrggrgbgrbbuwwggbwgbwbbgurbrguguwrrgw
wrrubggwruurbbbrgbwguwbwgggbrrwrwgubwuguwbrgw
rgbwwuurgwbwrrwwgruurbruubwurggugbuubgrrrwbgrggrggrgwbr
grurgwbgbggbwbwwuuubugbuuugbbwrwuugbbubbuw
ubggwwbgwwrruuwwuwbrrbbwugwruurrugrbbwgbwwwgbwbwbwbubbrr
wgbwubuugwrrgwrwbbwwgrrgwuggrubgrrubwrubrwuurgruwwwgrwr
uggwguwruuwugbwbuwwgwugwrbbwrubrburgrgbuuburw
grbbrgbwbbubwrwrurgugbggrwbuugbubbgugbwrgrwwgbbbguuwg
rwurubwguwuububwrurwgrrwuubbubrwwbrgugrbgubu
grrbrgrbbuguwgrwugurrbbwrggwbguguugrurgw
gurrwrwgruubrubgrgbrwbrgwwrbrgbugrbwgwgbbgw
wubrubbuwrubrrrrwgbgugbrrbrgwbwgrwbuugugbgrbuur
bbrgbbgrbrbwgruwrgwgrgugrrwgruwwgwwbwwwguurbuwbwruwbubr
wugrwrggbwbwrbwrwbbggrgburuggwurbubruugbwgruwbrguwb
buwrbwruwrbgrrruugbruugrrwbgrwgwugrbwgbrwwuuwbwgurgw
wwggrrwwbgrbwguwwuwwurbgwburwggrwugwguubugwgugggbwb
ubwrguuwrgbgugurgguuwwggbuuubwgwwrwuguubgwbwgrwuwwb
rgurubgwubguggbgguwwwwwuuwugrwgubrrurgubrrgw
uggggbwwgbbrbwururggrwugggurgugubrbrgrurbgb
rwrrgbbbbrwggbrgguwubrgwwuugugwwwbuburugubguwguubuguwrrug
rggguuwuuburuwubgbuwwrububgwrrbwwrubbrgw
ggrbrbbrgrwuggwubrbbwwbgruubrbgggguuggrgw
rwgwubgrruggwruurwwuubgbrwggwbrwwbggbrgw
gbrrrggwbrrbwwuugwgbugrrgggwubgruwburburrbbrggwbbgww
wruwbbuwubbwwrrubbbrurwrbggwwgguurrruwubruuwwuwubgbwug
rbuwguwbugbrrrrbubbwubgwuwbuwwrwuugbubrggrbrwrwwbrwbrgrwbb
gwbuububgrwuuwbwbwbguwggubgrgubgwrrrbwgrrwwwbugb
wwrbugruuwrgwubgbwrwugwwrgrrubggubuwurwgurwubruu
ubgwwuburrwrgrbgurbgubgwwwbwurgbbbwwrgwrbgguguwbbuug
wwwburwwguwrbugwgwwrbwbruugbggburrgrbruwggrrgw
wubuwruubgwubrwwbrrrgwruwgbuugburrbgurbwrruugwbgrwu
brugwggbbgbbgggwbwuuwbuuggwrbuguurwubrggbrggbw
uuurbrwbbbbwggwbrruggwbwwurbbbbubbwwuwuurrgruububwrgrrwubb
gbwugbgbrurrbrggguwuwrgburwbwbuwuurwubwbwguugurrwrgguwgubg
bwrrrrbgwuubggbrbguuuuwwbwbgggbwbguuwbrgwggbuug
rrwwwubwurguurrggbbgrbrrbbrrbrrwurwwgrrbugugbb
wwbwrurrwrgbgggguruurwbrwbbrbwubwubgwgruruuuwrubbgwwrgw
wuburburbbrbbwrugbbrbbbuwbrwrbuwgugrugbgwrrgrwguggbg
gugrggwurbuuwgrwguwbrwubrbrwuwugbuwgbwbwrwrrwwrgbuurg
wwbwbwrwrruuwbbrrggbugwbrwbbbubugbrwruuwbg
urbwgrrgbbgbrgwbwwrrrbrgubrwrrwrwwgurgubuguwwuurgw
gwwrwbuurrbgbwwbwwwurburrgrwggwrrwwwrbbrwgrrgw
rwruurbbbwrbrgrwbbuwrwbbuurrgurrrwggbubwwwguwgbwgggruuugrr
uwbbuwbggbrrbwrrrrgbrbwwgbbruguwubwbwuwuggb
uburbbwbruuwugwrgwwuwrbrrrbgrbwrwrurrbubrgugurgbrgbgb
wbuwrwwruwguggbwrwwrbburgguwgruubuwgurugbgugbubbgbrrguwbg
rbguwgburgwgrwubggbbggwwguwuuuwgbbuwbrbrwrrbgguwr
guwbgwwwgbrrbuwbwbrbbwrbbgbguuwbwrbugbbbgu
rwrbgwggubwbwuubbwruwbgrbgrbuubrurgrwbgbgwbrwbburub
gggwbrugrbbbuwbuwrwgugrugrrrrbwrgbbwwgwwgugggr
wwrrbrwrgugrugwrbuugrrgrbwwrbuggbbruuwrrwrwrugbwbgurrrrr
burwrruurbgggguuwubrrrgubgruwwwrwuggbwbwuwurg
ubbgbbrguwubrwwbrurbuuuguwggruwgrgbbrgbbgbburwrbrguwrgw
rwrgbbrbwwrwggwwbguwrgrrrurgrrgruurbuugbbgb
ggugwrrgwgrrwbwrwgrurggggwurgbgwwurwrrwrrgwubrw
rgbuwbbrrguuwwgbrugruuurbgwuwwuurbugrbrugbuwubbruuggug
rwuwbwrgrwbwugrwubrgbubuwuwbbbwwgggugrbuwrrbbgbwurgw
gubgbwuurgbwbguuubgurggwwrgrwbuwbuugwuugwubwwwwggugr
wbrbrbugwrwrwurrbrruubgbbwwuuuuwwrwwwurruwgwbgugw
wurbrruububbrgwwrwbwurgggrrbrgrwbgbbrwbbrbwbuwugwgubwur
gbwbgbgurwurguwgrgwbwubgggruuuwuuggggbguugbrwgbwburgw
ugbwbbubwrggwuwwubbguurbbrubburuwugwrurbugurbubrgbrrrrr
wrwrrwgwbwrwurggrrbbgrwgbrbguububrwrururrrrrwuwbbgrrbrgg
uuubrrrubwguurguwgruwrbruwugrubuubbrbwbugwrwwbruurwbur
wwwwwbbbggggubguuugbbbbuburrugrbbwubrgbrguuug
wwbgguguugbggrrbwwuwrubgugwuwugbgrwwrggwgwrwurburgbrb
ubrgwbwbwwuwbwggrrrrwwbwgruuurbwrruwwrgburrwurrwrr
uuwrgwbbbrggrrruurwrrrrbrwgbgugbburbuburwrrbubr
gbwubgbggwwbgbwbbwwwwwrwbbwwrgbrgwwwrrbrgwwwr
bbuubrbuwrgrbrgrrbggbuwrugrwubwwwbwbbrwggugurwgbrgbrgbb
bbuwrurgurgrbubuguwrrurwrbggwuwguwugbwbwbbwrbugrw
brrbububggbrgurwurwbwuguwuwrgubwugwrrbugrbrwgwgrgguwg
burgwuurbrgruwbrrwurwuwwgwuubwrgrgwgrguubguggbbuugrrggrgw
rgwrgwurbgguuwrbguwwgwuwubgwguwgbruwrrguuwbbwbr
brrrubwrugrggugrwgbwgugggbuugrwguuwrwwgwuruwwbrg
rggbwgwgugrrbrbwububgrwgubrwbwbubwburbubbw
uubrrwwuugwubguruggugwwrrggrrwwgugrurubrgbwurgrwug
uwrwwbguggwugwwrguuwbrugggugbburgwubruubgugbwgurgw
wbwgugrurrbgbuggwwwrrwwgrgubgbbgbwrrwrrbubuwbr
uwggguggbgwgrgrbbgruwurwggburububrgbwwwguburubrugrruugbwu
wgwgbrwurgwbrrbgwruugurbgwguurbuwubbuubrbuwwwgbuwbb
guwrrbwwgburbgggggrguwuwbbwrbuurrwururgw
rurwbgrwurugrwwwbgrrubrwwwbugurbbwbrgurbgwrwwrgwrwwgwbr
rurwbbwwbubwbrgugwbggbbbguubwrbwbwggwwbguurrub
gbuwbugrrwgwrgbbguugwuwwwubuuwugggrbbbggwrugbubu
bguubggwggrwuruubgubrrrwbwuuggwwbwwuuuurbuugbggrrwbu
uguuwugurrbgbwggwrrgwruwuwrbruruuwwuwrubrruw
rbgwbrbrwbuuwgrgrwwggwrwggrgwgbgrubbgwwuwwrgw
guwuugbwubruguwbbgrbbbwbwbrrurgrbrurrbgbbbwbubr
uubrbuubrruwwggguugrugburwrrrubbbggbbrrbuwrwrurgw
wubbgrruruuwrgubgruwubruggwrwgbwwwggwurggwgrrub
bugbbrbwruuwbrbrguwrbbbgbgwbbbwbbwwwwbwwurruuubururuwwbuw
wrubrrguurwrbwwrwrwugwuuurbgbrgrwrburbrrgwwbbugwwbgbrugb
wwrrurrwugubgbuuurrgrbbwwgwurugurbgurbuwwrguurbguu
wbugrbwggburugrbgguggwbuubbgbggbbburgbbgugurrurgguggw
buurgrruuwwggbwwrrbrbwgbgruwbwwbwrrurwwbggbwwbuggbuwrgw
ggwuwgubbuwwwurbugrbwbrburrgggubuwwururruuwgbwurwwu
uwuburwwrrwggrgwbubwrwuggurububrrubgwbwbrruubrrbrww
wurgwwggruuurwuwbburbrurburbwubuubbwwwwuubwugbrrrgw
wwubbbgbwgbgruruwbrgugubrrwwugrrwwwubrrwuubrwwrgggbwrb
rbbbrbwburbuwwwwurrrgrbwubbbubbrbubggrguuwrrggwrgr
gwwrrwuurgruwburuugrwugrbgbwgugrgggwubbrguwrrwwgrwbrgw
wwbwggbbbuuuugbgwubwurrbgwrwggwgbrwgrbrwwuuuurwwwwwwguuwbu
wuurwbwrgbrwrgrwuruwbuugurgwwwbrwwgbwuwbuwburuuwbrwbwuwuwg
rgurgwwbwrbbbuuuugbrgububwgbrbwgguuuggbbgrrrgrgw
rubgruwurburuuuwbwrrbwuggbbuggwurbburrrurwgrrgruuw
urbgbggrwgrgwwuubwrguwwgbbbrbbrgugrwuwbuwwb
ugwwrwgurrruwbrbbrurgurrubrbgrrbuwbwwubgbbguugwuguurrgw
gbugwbrwbgrguwrrwgrwbbwgrubgrggrrwwwgguurguguggbgrwurgbr
grrbruubggggbbbrbrwgbubgbgwugbrrrgrbuubgrrwbbuwrgugrbw
uuuwbbbgrwurruwrubbrgggrrgubwwbbgwuugbubrrggbgbwguwwwru
guwrwggurbrguubgrruwgggugrbwwrwwbwwbuwgwwgwwuwggwbgbwgbww
uguugggrbwgrrgruwbuwugbrrwuggrwbwggbgbburburbw
bbbwrwbwgrugbbgrwruwwwuwwrbguwbbuuurrgwrbgguruugwbbbb
gwgwugwurwrwbwggwrgwuuugwgwbbuurguugbbruwwrwwgrwrgrwb
grwrwggrrwgubrrrbbubwwwwbugwurbuuuwbuwrbbwgwbwwubugg
wgbbrbbrbgugwugbrwwuwuuurgrgwbbwwwwuwguubbubwwwbrrbuwgwgwr
rwbububrwrggubbwrbuugbugrrrggbrwrrbwbbbbrgw
uwuuuugrguwububurbrrruwwgrbubwrwurwrggrrgw
bgurrrrbwgrgbbwbwbwgrubgurgbgbgwurbgugrwrb
rwrugruugugrwruwbwrrguruuurgwuuuwurbgbwrrwrgwurburwrrugbbrgw
ggbwrurrrgurwgwwuwgwggrbbwgwwuugrgggrbguugrur
gruubgbuubuwguggrwrgguwbwgrggrrbbruubrrrbbuw
rgggbugbgrwwbwbwburrgubrgugwwwrrwburbwuubwuwrrwuu
wguwggrbgrbgwwrgwuwbggbuwwwururuurbburwwwbbrburugrwrbwrrg
urrbrgbrgbbruuwruwubgwbrbuwruwbwbuwgrwuwwwuwbwwuwgggb
guwuwwwruuuugrwgurbbwgbwrbbrwrgbubrbwgwwuubgrbrwggrwwww
buwgggwrggrbgwwwwbubrbbrgbwrrgruwrurrgrgw
gwgbubruwbbwbbwgwbbruwbbubwugwugbbgwgbwuurgw
bwwgwwuugrwwbuurgrwrrrbrbrruwrgugurururrwbrwbwwrwurwuu
wwrwgbgugwuwuuurwgbbbggbbbugubbgbwgggrbwrgw
wburrrrguggbrwuwbbrwwwuuurrwrggrbgwrrwurgw
ururggggrwwrwgrbuwbbgwbugrrbgbwbgbrrbugwgbuuwwrbrw
wbwwrbgbgwgurrrwburgrurwgrgrubrrwwuububwrrrwwggubuwwrgw
brwrwgwubrrbgrwbrwbrurbburrgurbrgwggrubuwrgb
wggbgubrggbwrguwuubguwuubbwwguwggrrggbwugbbgugrgw
ggbbugbruwwubrrggrugurbuubbbwrwurbbgubbrrwgggbg
bwbgggguuggggwurgwbggbggugwrbugubbbbwrgwwwwwbwrrrgw
wrruggrwwgwbrwbgrrrwuurwuuurubwrgwwbrbgubrgwugbwgbwgrwrgw
gwbgbwbrwbbruuwbwugrgbbrruwurbggrburrbrggggub
uwbgwuurbgbgwwrgbbbbrbuwrwruwwuuurgrbwrgrruwwrbwrgrrw
rwguugrubggguuwrgwugwbgubrrrurwwgbuwgbgggwwwrrrwrgw
uugggwurbwrrrubwggwburwuwurwwguugrwruguuruguugwgb
grwguguuwwgwbwuuruwwgwrugggugbbwwgwruguburb
rbugruwbrgrrbrugwbwrgggubguwurruwrggbggguwwubbu
uwbgbuubbgurbggubbbuwwurrwbuurwurwrrwuwrrbgwrwwb
guuwrruggrbbrbwwrubwrwbwggbwubgrwwrbwggrgwbw
rbwgggrgurgguwuguurwugwuurburbgbbgburuwbrgw
rubugrgwwggbuubrbgrwwgruwbugbbbruwgwgbgrugrrrwbrrbuwuubwu
gurggrgrrrwrwuwbbggbubgurbwuwrgbbwbgrrggwrgwrgg
urgbrbbgguugwubrgwuuwbrbgbrbuurggrrwbrgw
bguwwwbwbruwggubwguwrwugrgrubrrbuuuuubrwbrwbubububbwruuru
ububgwgbrgrwwrguuwrgugbggwubrbgurwwbgguurbgrgwwgrbuggrwbrgw
uwbuguggbgrurrgrurrwbrubrrubbwrrgguwugubrrurbrbrrgwwg
wwurrbrguuwwrbguggbuwruwgruurwwugugggurggrrrgwrruwrubbwwur
wruurbrbbbuwurrrwwrbrwwbwrbrggubwuubbbbuwbrrrwbggwwrgg
bwrwburrgwgurbrbwbrruburgrgwwubguguwwwgwbrbuggrwubbr
gbgrwuugbuwrwgrgrburwwrggrbgwrgguugrwguubrgwwrrwrrgw
rgugubugbrwuwugwbgrwugrurwwrrwguwbbruwbwrww
wrurwbbgwrrgbgwggrrgbrrwuwubrrbuuwrwgrrgrggbbwrubwrbwwgrwg
rrubrwgwuwbbbugwrbbuuwgwbubgwgwuwuwgrurrwrwwgrgu
ubrurbbwururburwrbubbuggggrrwrrrgwgbbwuuggubwbu
rggwwuubbggugwubggwuwugwwrrguuwbwrrrbwwgbgwwbrurw
bgbgguwbbrwrwburbubwrgwruuwgwrbgbrggbgbgrrrrw
uwgrrggrwbbbuwbgbbrrwgwbbburwuuggwwurguuuwruwubrburgw
uubugwbbrrwbuwggwgrwgwrrwggwwuugburgrrugbbuwg
gbbwwgubugwbubwggwbrwwrwwrgbbbwgurugwrwwbwwgggbgrwwgubg
ubgbwwburgbwuuwbrruwbwruwuugwbgwggrgrwbwurbbbwrgurwbg
wrwgbgbgrwwbbbgwrggwbbwurggggbgwuuguugrgw
bgrbwggwgbrgguwwwwbuuurgwrwuubbuwuguwbgbwggbgbrwbbrrwbu
gwubwgbrurbwwrrgugwwgbwbwuuurgwbwrurrgwurgw
rurwuwugruguggwugruburbwuuwgbrwwbrbwrgbgwgurwurrgw
uburgrbugbbubbrubbrbgwbrrbugbguguurrgrrgwwrrbgbbbu
gbwbggrbuwbrrbbrgugwwrbuwggwggwgrrwwuurgurggbww
ubwbrbwwwwwrguruuuwwwrbwurrruguubruuwbuwruub
bbwwgrbbbbbbwwugggugwgrbwrbbbbbbrrwrrwrwgwb
wuubbrbbbuubruwurrwuuruurbwbguwuugbrugwwwbugbruu
gbwwuwgbubwwrwguugwwbwrgbwuuggrwbgbuwwguggb
wrwwwwbwugbgbuwwrrwuwbbuwgrgwwwwrbrgggubbrbuburwr
uwruubbrwwrrgrururgwuguwbgbbgrwrrugbwuububrbgwuwwrbbwwr
grggbuwbbrwbgubwwuuwbggrugwgggurbbburubuurrguuuwrrw
gbbbbugruwwuuubguuugbuwwwugrggbrggurwbwubrrbwurgwggbgrgrr
uguububuwwurruuggwgrruwbwrrbwwgwwgbgrrbgrgw
rrwuwguwubggrwbwbruuwggruuwrbwgrrgugbwrugwguwugbbrb
wbwggrbrwguwwugggwwrbwrrbrgwwwgubggbrgrrrgububgwubrgw
wrrrrrwrrwrrwuwrbugbbwuubugrburgrbbrruurbuwwbwrrbubrgw
gburugrbrugbuwgbbwuwgugrbwugwwrbuuguggurrgw
rbgwwwwgwwburwbbruurggwbwggwuggwrgggwgggwwubgrbggwugbgbrww
gwurwuugrbrwgbbbuwguggwrurrurwguurgururbbrruwwgrrwgbrgw
rwuwgbuwrbbgwbbwgggugggwrgwuguwururrrbwggrwubrwgrrwwbubgb
rwrgubburrbuwurubbwrbwgbgbuwrbrrubbwuuurguwururgw
ggbguuububgggurgruwgrrggwrbwubggurugugrgggwurwbgbwr
brgwrububuwrrwrbwuuugugwururbuuwurrubrbrwwuggggruburbub
uuuggrrbgurruurrbrurgguuuuggrbgbwgbrurwwgwurrrrgrbu
wrrrbrbggwwrgrgbuurbwggrguwwurwrrrrubgrgw
wbwbrwrubwbbubgugruwrwubwguurwbwbwwgurggggrgguuug
rrrbrbggwggggrurbugbuwwrgwburgbgrwgbwgrgwb
ugggurrgrgwgrruguwwwbugrbrbuggwwubgbbgrggrbbuuwuwwbbubrgg
wrwbuwrrburbgurggbwubrwurwbgrggbwbbruggguggbrr
rbbububbrrrrwrubwrwbrugrwbgguwurbwgburrgbwwwwuug
gbgubuugubwwuwrbwwgwugrwgrggruwbugwbuwubgbwrurwrgurrgr
uubwbgubbrrbbggrgwgubwwgrwggrbuwbuwrbwwrguubwrgw
ruwuurggwwuwbbrwbwugwugbwbgugwwburbgugwrwggrbruwgwbuggg
bburgrgwuurgbrbwbgurwwrrwwgbgurwubwbbggbbrugrruugbgr
grwuugwbbugrgrbuubrgurrbubbwurgbuurrurgw
ubwggrrrrurwggwubbbrgbrubwbrgrbrwuruubrubugbr
urguggggggguwbrbbubggbrwuurrrruugwrbuwrgwbubbbrg
gbgbwggwubrgwburbuwgburgubwbwgggguwwrrwuwwuggwubwbbwbrrgw
urbwbgbuguuuwwuwbgrbuwbbuuuwugwgwbgurwbwgwugbu
urrgrrruwwwubbbbgrruuwwgrwbbgwrbrubggubrwwbubguu
rbwwuubwwbbrbubrbgbgwbrrguwrrbwruwbugwbrgw
wwggwwwbrgwwurubbggrrwgwgwbrbgbbggbrgrubgrb
brbwrrugwgrgwgugrugugwurburrbwrrrgrrbrbbguwbuburgw
wruubbbuwwuubgwrwwbuurgbrwrbuggggbwuwrbubggwruwwwbbguu
burgbbrrurburwbuuwbgwbwrgrrwwuwuugbgubgbwwggubr
uuurgwugggubbbbugrugwuurwururuguwwbgrwgrgw
ubrbbbgrgwgubuwggwrrbuuuburuwwgbguruwbuuugwguruuurgubrbrug
rwgwguwrgrwbbbruwrbbwbguburbguwbuwrgrwwuubrub
rrbbgrurrwwwbwwgbbbwwbbrbbbbwwgguggwbubuwbuuwuubuurgu
ggwgggwbwbwuburugrrbwuwuwwbgbwrubrubugruubrug
wrbbgbgbubrugrruugbuggbbwubwwrbrgbwurrrubgrrrgubw
rwuurgubwbwurbuguwwuwuguwruuwrrwbbrrrrwrrbgrgggburwgrbb
wggwruurrwbuggruwbububgwrbburwgwbgrruwruggrgbgbguugwuwuw
rurbrwgrbwwgrurwgbwbwugubwbrbgrgbgubggwbbrubugrrr
ururuubgwwrwwwrbrgguwurgbbuugguugbuwurrwrurwuwrburburuwub
uwwwbwrbgururuggburruguurrrwgrbgwbwbrbgwburbw
ruwggwubwbwggruggbgubrubuuwuurugwrwuuwgbubrrurwuwu
wwrubrbwrbwwuwgurbrwrurrubbwrbwwbrbrbubwwubbgbubwruwgwuw
bwwbuggruwwurgbuwgurubuwugbgwuruurruwuurgrgrrr
urbuwrbwgwurwrggugrbruwbgwggwggrubwwuubwbbububg
rwbgwgbwwuggruubguubugbuggrrwbwrrbwbwruububw
rgbrrburwugurwrrrubwwgwrwuwwurbwbuugurbrbuuggrrwrrw
bgbrugurrrgrubrbrwwrbwurggubbuwrrgwrrgbrgw
ugrgbbbrwgrbguurwbburuurwwrggurgggrrubrrbrbrugwurubbw
rrwbgburwrwgwurwrwbrgrwgbuuurwuguubgguggwbbuwuubguwrrb
rguuurbruwgwrugwwguuuwwwrgruwururgwrruwbbbuuwggurbu
wuwguurrgwubruurruwbwbgwgrrbuwgrwbubwuwrbbubu
wbbggubrgbgggbrwbwwruwwruwwgwrbgrgbwbbuburb
guburbrwbgwubwwwubbggggwbwrguguwwbrbbgwuwguwrwgwg
gwgwggwuubuggrburwwrrgggubuurubbgbwbrgbwwwrbgwbbbubru
wbbwrbgbugbugwrgrwuguwrrrwgrugrbbuwbrwubuu
gwgrrgwrgwwbgbbrububbgwggrbgwrrwubgwbguggggurgw
bwbbgrwuwuugbbugbwwwgwwbrburggbbubrwuggurrbwwbrrgb
gbrrbgwwrrgubbgggrgbubrgubguwrugrrguwgruwubuwbgbwguwgruwrgw
bwwgwgrwbgrrgwrugrbwwwurwwrguubuwgwgrugrrgrgw
rwuubggrgubbwuwgrrwurwwwbrruwrububuggbrggrggwrgwrgw
rbuubuwrbbruwbuwgubguwrurwrgbwugbwwrgbrwwwggwbuubgw
ubrrbwwgrbrrubuwbrubbugwbugwrrbrrubrwrurubggrgrgbgburu
buwrwggubrbrrgrwwugwwburgburrgbuugrwruuuwuuwggubwbgwurw
bugbwrrrwbbbubwgrrwrrbruurgruugbbwbwwurgwwrgw
ugwgwrgbbguwubrrbugguruggbrwwgrwgrgwgrbrubuwwrwguwrwurgw
rubwgbrgguwrgbwurugburwwwrbrgwugbbgburubwrrgrgbggu
bwuubbuurbuwburwwuubuuwgggbbbgrwrgbwwwrbbrrubruuw
wbbwggbbwbrgwrrbgwwwwuburwuwwrgubgububwwuuwrbrrgw
rbgwrwuwuugrwwbwgrgbgruugruwrbwgwugrwbrggbgrgbrrrwuru
ubgwbwwrugggrwgurrwbwwrbwgrgwggwbrubwwwuggrwgbb
rgwubwbrgrbggbwuwuwugruggbrrgbbwrgruwuwrgw
urwrwrurubwwgbwgguruwbuugrugwggrwurgbrwbbrgbwbgbugrrg
bbrwgbuwubwubgwgrwrwuruwrrbubrwrgggugwruwwubw
rrbuwbwrrwgburbwguugwbwgwuwrwwrbwgwrgubbbugbrbggbbgbruu
ugwgubrbbwrbbgrgrubbwrubrbgwuuruwgugwbwgwwwrrggwgbrwuwbwb
bbrbrbwrggbbuwgwburwuwuggrbgrrugwgwurrgrwuubwguuwrgw
rbbuwwwbbgwurwbgbgrbguuwrrwggwguwggbuwbwbggwbb
uruurrrrbrrgwbrgbuuubugggrwwgrbugrgbruwbggwuugrugububgugw
wwuwwruuwwgrgwbuwruuwrbuubgrrububuggubwuuru
ubwbggggwubruguwwgbwbubwwubgwbuwbwbwggrgw
wurrbrbbubbbwguwbuugbwbrbwguwurwrrwgwwwugurrguuwuubbrugrwu
wrrgugrwwgugrwgwgwbwrwwrrbwubwwrguuruggrugbwgrwrrbgbrwwrb
uuwuggggwuuwbuubgbwrrrugwuuwbbwgrrbbrwbuururgbruwr
rwbubbgwugbgbgurgggugwggbwrwubuwbwwgggbwrwrgrwubrwgwg
wbwrwwurgrgrrrwwuwgbwbugbwgbwbbrggwbgwbgrggbgrrwgwrbrb
gugbguwbwrwbrgbgggrrwrgbuuuggbugbwubugbbgbrrbrruburgbu
rururwrrugubugububbubgwugurwgwwbrbgrwbrwbbwgu
wrbggguruwgwgbrwrgguburbgwburggrbrwwuwuggru
rbbbwbrbwbgbwrbbwuggrbgwbrgugggbwburwubgbrgwuuwrbguurwrg
gugrrggbbwrbwrwbubuurrbrbruuwwuuugurwrrrrggwuwgrruruw
uruurwbwbuwrbubbgrwwgbwurbguubbuwgrrwrbrrwrggbwrr
wrbwuuwgwrgrubrurruubburgbrbbubuguurugwurbgubuuwrwrbwr
wrugbwrugwggwrubguwguggbwrwwgbgwuubbubuurbubwbuuuwu
uuuwurgwgubuwrwwgrwuguwggrwgggrwruugbbugggbrwrbugw
bbbuuubwrwbwrwwurugrwwbrwrrrubrwwwggrurbgggbg
wbgguwwwbgbrwrrruurubggrwbwwrurgurwrgrrgbuwwggg
wuwwurugwugbuwgbuggwrbrugbgrgrruwwbwugbrwwbwrwgwgguubuurb
bubwubbggruggwububwuwrwgbugrwgbrwgruurbgrrrwbbrgrwurrgwuwb
rgrgrgubbwgwbrgrbururbwwwruwwwbrbwbbuuwbbwgbwrgg
wwgbbuwgubbubrbgrbwrggggbgrbwgwurrrggugwbgbgrrurruwrb
rgruruwrggwrrggbugwgguuggbgwbrwwguuuugbbbwruuugrugubbgwg
rrrrurrubwrrugbgbubrbgrgbwwbbrurrrrurwwgbggr
bwwrgguubgwgruuuwrwgubbgubuurrurbrgurgbwrbuwbgrruuuubugwb
rrwrubugggguwbuugrbubwwwrwbbrgggruwggbwubuubrurgw
bbgubbwrubguuubrwuggbwggggggbgubuguuwrwrggbwubgwrwuu
rugruwrbgrgguwwrwrbggruwrbwrrrurrgggubuggugubrww
bwwgrgwgwgbgggguurrwgwuugbwwrwbbuurrgwguubg
wgwgwuburrwbgbuurggugbburwubwuwgwuubwwrgbrrrw
wgggugwwwggbggbbgbwurwwwurbgrwugugggguubbbw
grburguwbwrrgwubbbuburgburrgubbruwrwggugrgrbrubg
uruurubuwgurgrubuwuwgbbrgguwubuurgwrwwbwbbuu
wgurrrgwuugburwrrwwbrugwbwwrgrgwwwugbwggbgruubwurgw
bggwrwggrgrwgrrbburubrbwwbrubbbbbuuuuubrwbbbwrbwubgbwrgr
uwuguuwbruurwgugbggrrgrruugrrbrwrurrgrrrgbbbgwurbubrgw
grwbwruwwbwrugubwrwguguwwrwgruwrgbguugwwwbuw
brbggwbruwggrguruuurrgrwgugwgurbrurrburwrbubuggbguwurrgw
rgubuguruuwuggurbuuuwwrrbbuburwruuwuggruggwrwwrgwrrubrrur
rgbwrggwrrgurrgrrbrgrggrbbbgwubbrbgubrguwuurbwggbgwwwu
grubgrwgrgrurrgrggubgugbgwrbbuwgbgruwwwbbrwruu
grgwrwrugggubwgwwgwwwgrgruurbrrwuurgubbbbgrbbwrwuubgrwwb
gwbuuubbwgwrbubuwbbbgrwgrwgwuubgwwrwbbbbwugugrrwwuuruuggu
bgwubrgwuwwuruwbbgugbgruwwuuuggbrgbggbwgwubbbrrbggu
rruuuburggwbrbwwbwrurgubburggbggwrugururbugwgwbgggu
buwubugbwrgwbrrwuuurubwuubgrwrwrbubwrbwrugrwrbgrur
rwbbwbrbrgwggwwubgbbbguubwwgbrwbwbguburrwbg
uwwbubbbbgugrrgbrwbgwuwwwgwuwwrwurwrgwwuugrbbwgbburrbgrgw
wbbgwrbrwbrubbrgbgwrrwggwubbbgbgbwwbggwrbguwwggurggurb
bwrbuwwgubwubggwgrwwgbgbgwguwuuguuuuggbugwgrwgwwgbr
ugruwubuwurwbgbwubuwggrbbbbburgbggrbrwrwrgrbugwwgubgguuwrgw
wuwgggggbrwugbrguwururruugwwgugggwbwbbruubgbbrwwrgw
rbbgggubgbburgbrrgubwubrburwggbrugbgbuwgbuwbubggugrrubuw
rgurugguguwwrgbbrwbggwrggbwbrwgruwuburbwbggrgwwwuwwgur
ubbbwurwuugrubwrurrrggwggbugbbwwurggubbwrrggwwbrbwbbbgrbub
bwgrgbugggbgrrwwbuwuwwwbrubwuugrurrwuwugbggbubrbgubrbbgww
brrggurwgwuuwburuwruugbwbuuuwuwrbugurubugbwwu
uubrbgguggbbbwgwubwgrrbgbwggrrubrrrwubugbbgwrrrbg
uwuruwrrwwgbwwbgbruuuggrguwbrubgbuugggrbgbugubbgwwrwrrgwbgw
wgrbwurwbubwggugrgwubuggrrurwwrwuuuuggbgrbbguuuwguwgg
wwururbgrurgwruuguwrruwuggrugwbrurruwurrbubb
urrrbggrwwwbwbbrubwrgbwwrwrwrrruuurwggrrwgurrrrgbrg
gbbugbwrggwgwrbbbgwgbuugbruguuuwuwrgbgrbwgrgw
uggbrrwwubgwbrwrwrbugurgrubwbgbuuububruurrbrbwbrgw
bubrrwuubuuugrbggrbrwgrrwwggwrurruuwguwrurg
ggggbbuwuugbubwgugurwwwrbgbrburrbwgbgrwrugrrbggbgubbwggrgb
wbrbwwwrubggwggbgubbrrubgrggbuggurgrwrrwruurubb
uwbgrbgubwguuwrbburrugugbwbrggubgrrrwbubrruwbggurrwbbrgw
ggbwbruwubggburubuuuuggbbburwgbwuwrwbwggwb
ggwwuwwuuwruwgurbuwbgguwurbuububrwbubgwububuggb
gbgbbbbrwwwgwbgrbbuwuggwrugbugbuwuuruwgwruguwuwgrrbggr
rruburbbrrguwwgguguwrruwgwrrbrwbbuuuwwgurbwuwbg
gwwwbwwrrgwwgurwruwbwbrgubwgbgbwurrrgwugbbugwrbrg
urgrwgbbwrbgwbwggbugguwwrgggugbbbrggubbgbrugwgrgw
uwgrwwbbbwwrgbbwrwrubuurbugwbwugrbbgrruururuuurbuurw
uggrwwbrurgbwrggugrrbbwwwwbrwgrwbbbuwgwuuwuwbrrb
wruuwuubrwbuubbbbwgwrubugbrrbgwgrguuuwbbwggwggugr
wuubrurgwrruwguwgrguwugugwggrrgwwbruwrubwrrbg
wwrugbubuurwuubburubwrwuwuuwrgbwbrggwbuwgru
wrbggbrbgwwrgrggggwruwrwbgbuuuubwwuuurrgbbrurbgggurrrgw
rwgwbbgbbbgrbgbwbrguuwgwrwrwwwuurwrruwburbwgbgbguguwrbwurg
gwrbwguubgrubgwwuguuwwgugbwggrgwrbrgwbbugugrbrbrrw
wgwugbbbbbugrbggubrwwbgguurggbgbbbwwrwwgrrrrbggrgrbb
gggbrbuuugubgwgwuggguwbgbbugwbwrgrbrrwugrggurrwgur
wbggbwgbuwuwgwgbwwgrrwrgugggwwbrwrrrbwwrgw
gwgubwbrgurrguubburuwguwwbrggwwbbbuwuubbggbruu
gubwrbrwrwrwwrwggbgwbggbgwgwwguwubrrwguuguubrrwruuwuwurrgw
guuwrurguurguruuuwrwbgggruwrbrbbwrrrwwbuburgbwwrubwrgwwbgb
rgwwuruwrrrrrrbwrrbgrurgwwuggrrubgwurwrugrrbrwgwwwrwurgwbrgw
ggwggurwbggwwubwrbrurbuubrrubguuruuwbgrububbgrgw
gbwwggggurwggbuwrrgrwrububwggbwbwbruubrgrrrubuurwwbuwwuu
ugggbwbwbrbrgwwburbrrubbwuuugurwbbbgbuwbbwuwrbgwgwruw
gwgrwurgwgwrwgbruruwrugwwguuuugugggrbgbwgbw
bwuwwguggbwrrbgburbwbguwwuwwbwurguwwbugwrgw
bbwbwwrgburgbbuurggwrururwruwrugbubuguwwbrubuugg
gbgwwrurgbuwuwbrwubwbbgruwbbgbgrubuwwgrwgg
rruggbugrgurwuburgubwbbgburrwwbggwwrrwbbwwbrwwrw
grrbwrgwurbruwrbgurubrbugbuwwrbrugwgwuurggbwrguggbwruw
ubbguuurwwrgbuuwwgrrbububugwbuuburwwuububwbwubrwguwwwrbw
rwugwbrrwwuwwuuruubwwbwbuwuwgurwurrrrbgubwggwrwbwrgbww
brbburrgububgburgbwuubrrubgbrrgwbuwwwbgwguwuurubrubur
bwwubguwbrwbrbugwurrruguwwbuuuwrbbbbwwbuwwbbgggurgw
wbuguubruburgwguwguwwbggruwubwbuuggwuwburburbuu
brwwbwrwbgwugubuubrbwrbgbgrggbuuwwurburgbbuwruggwrrrrgb
brrbbugwbgrrwwbuurbbuwbggubuwurbgwwbubwwubruuuwbwurgw
urbbgbwbwbgurbubuwurggrubwgrgwwrgrrggubwrgg
urgwggurwburbggugwwwugwbguwuwgbbrrbwurggugugrwurgwwrb
rggwuwruugrwgbwuburuwbbwrrrgrubuugwrurggburrgw
wrurbgbbugurwugrbbbwugbwubgubgruwuuguburrrwggbuuggbrrbw
+72
View File
@@ -0,0 +1,72 @@
from functools import cache
with open('input.txt', 'r') as file:
data: list[str] = file.readlines()
parts: list[str] = data[0].strip().split(', ')
starting_letter: dict[str, str] = {}
for part in parts:
first_char = part[0]
if first_char not in starting_letter:
starting_letter[first_char] = [part]
else:
starting_letter[first_char].append(part)
designs = [design.strip() for design in data[2:]]
# this solution is pretty slow and stupid but it works, i think some variation of KMP would be faster? like a graph based search with a large amount of pre-processing
# Could maybe use memoization on substrings
@cache
def search_designs(design: str) -> bool:
if not design:
return True
first_char = design[0]
if first_char not in starting_letter:
return False
possible_matches = starting_letter[first_char]
possible = []
for possible_match in possible_matches:
if possible_match == design[:len(possible_match)]:
possible.append(design.replace(possible_match, ''))
return any([search_designs(m) for m in possible])
possible_count = 0
for i, design in enumerate(designs):
if search_designs(design):
print(f'Design {i} finished search')
possible_count += 1
print(f'Possible Designs: {possible_count}')
+10
View File
@@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb
File diff suppressed because it is too large. Load diff
+45
View File
@@ -0,0 +1,45 @@
INPUT = "input.txt"
with open(INPUT, 'r') as file:
lines: list[str] = file.readlines()
place = 50
zeroes = 0
# returns new place
# dir, 0: L, 1: R
def move_dial(place: int, move: int, direction: int) -> int:
if direction == 0:
move *= -1
temp = place + move
if temp < 0:
place = 100 + (temp)
elif temp > 99:
place = abs(100 - temp)
else:
place = place + move
return place
for line in lines:
line: str = line.strip()
direction: int = 0 if line[0] == 'L' else 1
# We only actually care about the last two numbers
if len(line) > 3:
move = int(line[-2:])
else:
move = int(line[1:])
place = move_dial(place, move, direction)
if place == 0:
zeroes += 1
print(f'Dial Zero Count: {zeroes}')
+10
View File
@@ -0,0 +1,10 @@
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82
File diff suppressed because it is too large. Load diff
+46
View File
@@ -0,0 +1,46 @@
INPUT = "input.txt"
with open(INPUT, 'r') as file:
lines: list[str] = file.readlines()
place = 50
zeroes = 0
# returns (new place, zeroes)
# dir, 0: L, 1: R
def move_dial(place: int, move: int, direction: int) -> tuple[int, int]:
if direction == 0:
move *= -1
temp = place + move
if temp < 0:
if place == 0:
return (100 + (temp), 0)
return (100 + (temp), 1)
elif temp > 99:
return (abs(100 - temp), 1)
elif temp == 0:
return (temp, 1)
else:
return (temp, 0)
for line in lines:
line: str = line.strip()
direction: int = 0 if line[0] == 'L' else 1
# We only actually care about the last two numbers
if len(line) > 3:
move = int(line[-2:])
zeroes += int(line[1])
else:
move = int(line[1:])
place, z = move_dial(place, move, direction)
zeroes += z
print(f'Dial Zero Count: {zeroes}')
+10
View File
@@ -0,0 +1,10 @@
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82
+1
View File
@@ -0,0 +1 @@
92916254-92945956,5454498003-5454580069,28-45,4615-7998,4747396917-4747534264,272993-389376,36290651-36423050,177-310,3246326-3418616,48-93,894714-949755,952007-1003147,3-16,632-1029,420-581,585519115-585673174,1041-1698,27443-39304,71589003-71823870,97-142,2790995-2837912,579556301-579617006,653443-674678,1515120817-1515176202,13504-20701,1896-3566,8359-13220,51924-98061,505196-638209,67070129-67263432,694648-751703,8892865662-8892912125
+29
View File
@@ -0,0 +1,29 @@
INPUT_FILE = "input.txt"
# Read File
with open(INPUT_FILE, 'r') as file:
groups: list[str] = file.read().strip().split(',')
# Parse Ranges
ranges: list[tuple[int, int]] = [ (int(n1), int(n2)) for n1, n2 in [group.split('-') for group in groups] ]
# Check for invalid ids
invalid_ids: list[int] = []
for (n1, n2) in ranges:
for n in range(n1, n2 + 1):
str_n: str = str(n)
if len(str_n) % 2 == 0:
mid: int = int(len(str_n) / 2)
if str_n[:mid] == str_n[mid:]:
invalid_ids.append(n)
print(f'Invalid Id: {n}')
print(f'Sum of Invalid Ids: {sum(invalid_ids)}')
+1
View File
@@ -0,0 +1 @@
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
+1
View File
@@ -0,0 +1 @@
92916254-92945956,5454498003-5454580069,28-45,4615-7998,4747396917-4747534264,272993-389376,36290651-36423050,177-310,3246326-3418616,48-93,894714-949755,952007-1003147,3-16,632-1029,420-581,585519115-585673174,1041-1698,27443-39304,71589003-71823870,97-142,2790995-2837912,579556301-579617006,653443-674678,1515120817-1515176202,13504-20701,1896-3566,8359-13220,51924-98061,505196-638209,67070129-67263432,694648-751703,8892865662-8892912125
+48
View File
@@ -0,0 +1,48 @@
import math
INPUT_FILE = "input.txt"
# Read File
with open(INPUT_FILE, 'r') as file:
groups: list[str] = file.read().strip().split(',')
# Parse Ranges
ranges: list[tuple[int, int]] = [ (int(n1), int(n2)) for n1, n2 in [group.split('-') for group in groups] ]
# Check for invalid ids
invalid_ids: set[int] = set()
for (n1, n2) in ranges:
for n in range(n1, n2 + 1):
str_n: str = str(n)
n_len: int = len(str_n)
mid: int = math.ceil(n_len / 2)
for pattern_length in range(1, mid + 1):
# If number cannot be split by pattern length it cannot be repeated at least twice
if n_len % pattern_length != 0:
continue
pattern = str_n[:pattern_length]
all_match = True
repeats = 0
for i in range(0, n_len, pattern_length):
if str_n[i:i + pattern_length] != pattern:
all_match = False
break
else:
repeats += 1
if all_match and n not in invalid_ids and repeats >= 2:
invalid_ids.add(n)
print(f'Invalid Id: {n}')
print(f'Sum of Invalid Ids: {sum(invalid_ids)}')
+1
View File
@@ -0,0 +1 @@
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
+200
View File
@@ -0,0 +1,200 @@
6739459674389333459433695375559949344734767926833587823236783998689734978783695374574455875833736627
2373132532343213331342343333323324363713834443362242454554343333223332333335533234623223382233732244
2222441333231342122121622224212212232122222112222122311332222212273223433234222423211112132353251223
2272421512212232712632222221523524213442212223262216623152226212222221225272522223212222532222422323
2217222212362341131525335321122324234324223212742131242212142527224532246323122744833459212221122131
6813346133475314448426121761834648738623643213726761185353582458174121486641462776426112246165435119
2235322222212422321231252252212322241213233213221351223222222622222545214222213222322232422213132241
7648868634667457694727389566453477683138824974478548353762562379434349956786463565646545578448865493
2232322222272322552342542212222432512231313132533323713323222121122925282112215142213222222221221422
7378621536927447566642237444326735875635564782944732267883374679374572291556321372283535258364561428
1334223114253224534122334243242124273114222224322272334943143264254333322328312323224743333223222413
5283934323221234344351874335434342554432424342322757233443633433247254423333534425541235222323429255
6122264424275543533425551322224123443423422244434233542422226242126336524322442444524234552411263232
3443433244333314444224322523243224242332342332231522315233263422237434428222432123142363223243122323
2233352333342262213333232263345434333233236442643232343223622333542433543232553723343472444343144344
1235322122234425513353323233233121313223332222322324126232232333222223222237222333233323333214223323
4325536553242521223435445232395213355134524142322535362352345232535235334532452224141422535244355336
1531221153311234144121313322135341553411453555332543414153122541252131523331312331122441352413256789
2232231112132223322312321422222224211322231122222222222312222325233322325622212332222132322222222221
2271154221775226562431222343772273735324566146362762534541555626247166372734737154373435715644351589
1322321221282223222123242423224522232222222321132212222321512722312232222244311522253532222122221222
5675373654492446328553454633465763638638344343656363366623636255464662661735553323346336465333638336
6222154822345362222322222522826252516222212162122242142222622122427422231223222223423614522215652242
6222632224242211424242122221223142223522122272314221322111422725222212233232111222111221311222122223
7733645442442732531223245525486362495334532522464225353224187425436324512624552272122562562232464133
3122212312222222223262221222241212424214221222222252222212222331144322372726213221422222122222222221
3317564633543532241232338653138233333333364324334323332543322237249336434693237335433133563657333654
2222112144232342525175554221722162744427124325232272237315162252521294737141422751612264275623365412
5233336323444433338634333933257235232354342523921453333345233233432644331633334383243645338643368232
6555744775753685565359587685688568577765366857785355475445486372239447764684674376558464546868574784
3131322312625422313233136243434323233235451234422242642422221233433241342243343332222333122346552351
5545548564544551455444547425574454555985534445454524586545294455554235363458655233939254543595655353
2359665436622224221613324821315324832636221353316524645512225232332321223262434122723638222264123246
1333332423122433422244223222413244221332222222331334124322323329146144322323222422225353223432143332
2252325526527774625423122221535454723322284746512441336421532621335835341737442224474213326432923142
5766753863736644458639676412563282136344433663331635335665536244554854252673336867536454745553535586
5139931557883857995839397424342233394134332434843834938397764484863413686484933823989527723385843673
7286354682444934529442314333841634632432443946348225224943437945312764582252426642212443354433463245
5333223424222352523443254452734543444234454442121354623444212324542542244445314223324234433224341241
2336332233323335432319231323313522133234131534443333333332433123523233523223166334633533319254346322
3333333143332223113333442323223342232243235425354354334356334432335435533321344432432242742523542442
2261454235142314252241242213243143364232222332141662222322248442436223423324264231211282313214412424
3488334264566233754443373333343622327563345364254589363855559833246336332334356352363232364353368336
1232122227141322242221232223224122312242228221224222246224222232213222212222221222222232212222422231
3236763295122212613233243222122225436251538243322312245321313565232523264723325426332723223263241226
1222222232335142362222123254322223622322422223426444223622322223434432433222525212484422336222122133
2322424323244432341252312213322335622323221422345313125352332433421222212431335222342332124312432442
3232821222332422722233212211212324153232331422222222321222323322223622272523212713232321332413272622
3422652314245672235233363232413624422433323321424244162284333425222232322256212251232238721357223148
7774837647487566658756757755755847647655586686578356759987875456786575764558968987878778565587969586
1234223452224271232352455273726233633352227221354347283132212635572422643245234445451363372373482533
5545555754466555455554847555655474545653574744655454656557557545555565555443556555756654565567525555
5553554575554637555471355555154554444754485554555554465523825542545538455434435424455955526476554764
3254522513355333222211324322242533123234124252622229333233422522362352423245261252142252422114324223
2425344423234243432242213333252242333444451414325232234342213224352224134253221152324523223532441142
2582466442443388322624223813222631742479616132436235434553312364912322732234884746223356613144486223
3636223323332312624333322113312432342431432142262253223314236396612381142232422222213122423643323362
7325293432331383666195334723512337573622433434353563239235379451235352335833733463443262233842631543
2232624222332421511175521154321232335222932322461112227222122223213224257225223228222231413222222322
4552958886759955368935997537673735734558749419267255538878465394745752594544365557345558264585655169
2226216222224424524222422122422222224543262772122116426553224212223554631621145422424122825225242116
1222335126326444352764222342426663636441411345223343625343235185633672347245263355582632531664629135
6446446722356324442432213242214223324334335245335452632255422221143347414572397313223584225324331422
5224345323222424434244363345434133334432432442422434334343444345442434433343442433454144443324346244
5336333663337324323323235333336533343334125433374634569233686933546363236465133343459236212383233315
3431212332243413441121331234133441131314434431411433224142211222213143223434341442213344211133456789
5443222683292272324125357143312453332369372333522333233932316972333341214932333824122147432321723342
2367262824212222291672572242672121223153327226222625761267322242612343213625422253225276322142114524
6974563985343496663494433344643427344996686328654636476843646347684276485993646913458343453532176484
2312521543522312123137242323132222221231426242224327114213221222242224322222552327224254122142112333
6223242624251223217243624212512223241767442131244861652377673335441221242314494224319222352132462144
2333332335532332253234215732233323322235422433832233633332422321433233353223223324633524336332332224
2222222254612122222211642121222141234242212212122224252225222222211221224421423222122222532122221124
7421232222222133463122231324223212213131262222222222262223222217223332222242112324223212223323223222
3772242534373521568445363327624535346923343253955164573325436332351227545337435465955345446335669443
5858895152574569257889189996518531539296968776753453347738719235827481499877364362498567754855232996
4342235342363223564433432224563177215352333463431323332332366346334374333222313642241822536513753653
3354323732241336324523344333384638354233345323235333356414435734334356233343815243323232355328535543
3232231323322233322232342342232424122122233213223233212332333242223333133232223335322432333233233222
4222124152125212126225265152124132222832522242612921242522725231324422291234253262251252922212222622
6212552142225252118422223212232132222212722222213122224272253114265212154222226212272212113222621332
4552534756756595545354443365654557336354364737575555533553643535547465544767455573755756641664753655
2511242562394123244232225311322431521234233122422224223242358321213352344333234233713224232844173274
5526573675275646255558956655553398735354554524555427427584565653555545563555555663555386643559595476
4232222322223212512221132222227252235212222222124221221112232212223222453212215322552222422212122213
3323424433432431244433341433443334252333344333423447143363335444343444424424333333334314334534734333
9963543266528685935319932224777827787327354466945986687988877635834976575546746666448364958368484663
6263444224532863343259522662665342226323162222857382232425236267222252462342222824722545227136623635
3613233413353333333733232333232232314323633243331463333723643352333333533333264723363332314333323323
3122425225223233212711545223521542342751432242342216624212233222124622255451462253213221324322312523
4644734133536424434624843436434362694444315342324843447433442362627451364355523726343468233665395334
4423752435257822384423397544537263283356855845353384355467172425447276333227266721254779455411724215
1232222542232223232321322222187293523223312725724724421177222422132522224332622417141822722342212252
1353462356374364544444752374433432367667363527433336443445574733653443133657644213156634465463366664
3192682326222225434218233965252711232242242236626283422252542162524165353222421222322292921262515229
3312233223612332333341332232322333242232223222131312332231232232133322132322233232332333263222412332
3234443454533643613563332542531736363323533332113364323434522333534323225213524556624642433653522553
2356547419343244352723362645244353646442345436343242314441245442452344326474324314552253321131474344
4445493462456534126735454332732865436442644324962445644548387755234434462466476473934635423425734474
3442442214253562342232334243274474423334242283443262663132232234435423322826434324322328667162354334
9222423542321221122258446212213211172721233221222221223272256232642372212224522123332524124143432326
4838673447445676256588638865556356667346668652334584256363964445648566415477386645366466656544567654
4133131233343233241633333254242345323313343244335321522133232321433234243434543352332263632372375333
5828945793549483935858838333432326954645791684532333453883537868337762597642674263434432357934531374
2462313322354323424333646243334253243223325422243531637423233322332433424542344312432533643324436543
2539348544557567255225664845627542364542463624645864444225522842247237721342534922336455362226526365
4313432313333334433332333333722734342333313336332233233233243313333312233323332333333323333334133727
1323322332333334352335343422333333313434243233132333332323433343143341333533143323443344234261233433
4223243421322262122224452325212324411352242723212223222526252232122721211223222332222242215215722252
2122243223224224122252224224652241224312121112242122848123262222222225222222222323223222224122241222
5459575645652678467695654954544755554654556689544674556527565856685345655767347655553755585395765556
4383447444642633635122355334333542442544584433334813341335344332326442333353544332353435434413446234
2423344333433353334546425355243722444635353463435554444333335333343344352563531337322284832853331384
4344441443463433342533145457735744443464345463435763434644743746347434463565745744767446646744313864
3112622325223212232232184172222122311261131225132125212532233125325352242225221233322322254266254222
2421274222332221222313121222321224121244232212223133243213421422123241222122144324214122214425232244
2252234212322333222333523311221223223332432243433311222222311337442363222222245236321222321312511423
2312212222222121212222322222224222222222122222222222221232222241122232322132132222222212232222222122
7262448448421222424318593452122252371672822885228388224822722243224431442228622226178225632277243862
2344523224412264412234421843923324224234342321232125413533424482134222423222714233232222322321642882
1232232212212212121221223233422312211227122221242222222221421521222132222141223222212212313123412222
2421555222443346242342325142532329744622464222455253942465222437421925254433254513524523242264522232
4232364222233223225422625448524281542252232522532734642617212447412431262622232224732414524822558622
2232222122231222222222222121123231223222222223221222222222212222312332222122132222222222231222231222
1693242656125335113327232727222355534235553925255524352364142322551624375266322233222122623649145923
3191622272845397635962226263372437781255371428539472315456786262324541857136172382276663246422552254
2341631463341235353222762222332132322233235534224433242533322672626235543433335824222112122563848222
4243352323393323322412422723421344531443344454133533423332252222525243363335353323442534322434624333
4122122434441322212222232241231253242212423143524122122221222217222331222922224213122242232122112222
8526423444659538534644434443534767654446388646433363374624465623394854334333835689839623378845467864
4313524326322723333653229556672243256457353312433262243536222232243437572346242312182416365263363632
3421432222332125453333232334338344233523333163632322363363515263335412227122266337233332633252733322
2275513536253364556536326359452448225266635634263644244436526674634662244266625636275259662225628464
2222136221237222222112825432222212642741375221233222222212222732324412221253641211214253222228243222
2322321212231213122111233212228222323142251222221222232222462332222222122521122351322522224222232422
7828633443736627726586266432543635144134379442252564462478743746263525583722448333372335374497538124
3222251227311241235422312222323222264311412232322233341221223122222162422212226323422221231211513222
5421435122248223255222326522521252121341244234153622222227423222224612542233443421224122174226163622
4222222222222122113235623133222212322222112232222122252221322321212222222242222332223222321224223122
4233252445312226722225223542226243322454643222228529422542432642233324322422222232232322222413121553
3615624141464526353322824153676424526435724645414624562233359465646754544546524532454445363348642541
3474387467558466355565563784234546623884345559524345534553425662362764666345824956865955463556564644
1222522123722125232431423122312221313222222242227211222212221246224221223122282113232212223221222722
4454441334924563343346322321343234496483913614877527343344493134728782224847974423844453215347431443
4224223212291233225225132212253425261931487567442622576642326112223572438512272224122415569742162525
6445335414254335336633343555235745445554554455535334535356454374324555334533853355353325455547325554
6626581624635444362364651825256666457665474336555556556644435447463645326235256526535444414733534454
5422576923223945122374796322152228884422452328642342753427334326724922222154422242222232232224147344
4223124232132333633123141122222412256142215212333232322372323321121221222222223232322233232323324532
3438133563332253313223323733342334333547565235332563234333513353132433224223733323433153334339332432
2232222222222322552222321413122332322583424323222112232222343122123221632232922421112352212242351221
2144423335464534433412253343495544445443423457247313364443722832342431533337637732644324464447454464
3322412224224232642223433412311245672241314223325221311433242222221421474234544323222122432332342424
3222332324232417422293428432253523184223543221221334231354221534223154231326547412423222932222232423
6454435364652351435243121321513136424162525615464322641241355622412655562155263545644145116561433789
5651549646656564446654548545658544637344446644764426624444646566644356545536335644427954453454845455
1131338231231236463826221222271244933251332426223213122235217233532262423233333232222523523362232232
2534465354338456343753333332343257573256325453237553435457423535435555555343364434344555542935444537
4322212242322122412222273222322242322213244222222612322222214325222212223621321232352231122232222424
5554555422343543534535553555455554872545238244655255353555555535425355545625355635545436646435534944
2423442532223524223122234133414442223441212221427223222232221222222126522422542211125452121224231354
1225222172436272232152224472436378228238344252537321232143222162232422241622442237322439142322224332
2134222222621363445321422363333314221122222223244313241224232522243214274432346243462431342212242424
2121443212224135231222223113432432222232318221222214222213222221232362211212122222447213222412414122
1566355333393336334172656442374316389732383778336895623949463733633559423424688358375253739713963278
2341254222222332212427223222222642221332224111722741226322434121222243214226221723244132622112112222
6644642354573624554464472324223453542555645455422354444343626843445234444444464232522646245432242461
3247436536134438548873464346333532755684353334675455432343435333344342364244863454955333432551323333
1235215233244313532333113423336323344236333333463553332363232223353134733242353532332532433235323331
9222226122322232272232261242721521223265414242325421722226222125122232222231213222672252242812254326
1321222223122222222232223523415321322322222244221222222232233212323122123122223221232542424214322539
3444232433344233344454133423435235333414322363245333434435335434413545373344433431434333433325353439
2212231212222123222222225221229521332221225212351322113133232211222223562322313223231212312212132342
3446665745854144677546554847575954733732467444426485447556754446464596854754334252247464584775744424
4346262565225353555549454323452344542464454435533544545555222345534465553645355534534534542354335354
1335222241344263233453344231323221127323221184223234423232221222322332323423213224332341222223121326
5344331336363574334353641632133233443333323413442443343323633245842438635472374733453364333646334433
9444334434444244644444345323745554354344344442435442435432433266524353434344383446433135455453554445
4533434334344535345534333423444431344333442423245543134433552254344459432435544425422436135444413644
2221322532223525175451345547567432822312232752333534963253638162474322348231743243225235335422414474
5254537535635118228352459323444144421232545422514324214363242754457442221353275325294663252333452344
2413222233253222363233382222333233152212233222212337331353332323322443221324233422332213312322322133
2222353561222523135513522223232521222522222242432335222215412222223212333534452236531127122125221212
2442384334158465433823365235674363435555433458234364573525766645443242362442362654345585533525374685
3333362346234532333524724934541315323533324353333233612233443433323533333394347536227433666337336345
3322344485213336532312332343343333354224833344334424424445333432633913344243324113436484424263233322
3342333423262333433223332234432223332323323233423328434732342233331733323332432433321152213332433334
3333313232317322332533333233335133721333233433822273382244353338333441233242825341253133329383633221
2322243422312132242231323224322324422135322335433593322322522123323251242522132231334321332322335223
5635623236946239558355233633854435593532134143353443243324233533164555442233345444454463345533536943
3544244193244226529332426724342221335632234551423312214452252222623354242453451522223552173531454254
8316113362363225333531324323422213323312453324252323432416222221353339564652322435137224342323323333
7342633555612222253253223233314222132543262332234425246244543534553653523375332342323242224241345132
2426443634943333523434526234444346524431545314136223423324424436344554416413323244144424537235436263
2422345222227262832125222262122535563213221362163123126225342722332424326626434424452442652213242233
2695512227221334661242722252244682332252321214131628211624213412225241322622222125224122222215272282
8352222447535225362515335225152142332257652128665342313311225323322435782254832283123285572331272623
2522423322322452621212352246423223132352222625543322132323122213622223136386123225124222253232522212
6233333553433344335534335441536333444432144432234444434333424533233441434443342335444542211343343443
4353732444512234333345235313431332543323433323223443373336442333335434932835543135333462635233343534
+21
View File
@@ -0,0 +1,21 @@
input_file = "input.txt"
banks: list[list[int]] = []
with open(input_file, 'r') as file:
banks = [ [ int(n) for n in line.strip() ] for line in file.readlines() ]
total_joltage = 0
for i, bank in enumerate(banks):
n1 = max(bank[:-1])
n2 = max(bank[bank.index(n1) + 1:])
print(f'Largest Joltage for Bank {i + 1}: {n1}{n2}')
total_joltage += 10 * n1 + n2
print(f'Total Joltage: {total_joltage}')
+4
View File
@@ -0,0 +1,4 @@
987654321111111
811111111111119
234234234234278
818181911112111
+200
View File
@@ -0,0 +1,200 @@
6739459674389333459433695375559949344734767926833587823236783998689734978783695374574455875833736627
2373132532343213331342343333323324363713834443362242454554343333223332333335533234623223382233732244
2222441333231342122121622224212212232122222112222122311332222212273223433234222423211112132353251223
2272421512212232712632222221523524213442212223262216623152226212222221225272522223212222532222422323
2217222212362341131525335321122324234324223212742131242212142527224532246323122744833459212221122131
6813346133475314448426121761834648738623643213726761185353582458174121486641462776426112246165435119
2235322222212422321231252252212322241213233213221351223222222622222545214222213222322232422213132241
7648868634667457694727389566453477683138824974478548353762562379434349956786463565646545578448865493
2232322222272322552342542212222432512231313132533323713323222121122925282112215142213222222221221422
7378621536927447566642237444326735875635564782944732267883374679374572291556321372283535258364561428
1334223114253224534122334243242124273114222224322272334943143264254333322328312323224743333223222413
5283934323221234344351874335434342554432424342322757233443633433247254423333534425541235222323429255
6122264424275543533425551322224123443423422244434233542422226242126336524322442444524234552411263232
3443433244333314444224322523243224242332342332231522315233263422237434428222432123142363223243122323
2233352333342262213333232263345434333233236442643232343223622333542433543232553723343472444343144344
1235322122234425513353323233233121313223332222322324126232232333222223222237222333233323333214223323
4325536553242521223435445232395213355134524142322535362352345232535235334532452224141422535244355336
1531221153311234144121313322135341553411453555332543414153122541252131523331312331122441352413256789
2232231112132223322312321422222224211322231122222222222312222325233322325622212332222132322222222221
2271154221775226562431222343772273735324566146362762534541555626247166372734737154373435715644351589
1322321221282223222123242423224522232222222321132212222321512722312232222244311522253532222122221222
5675373654492446328553454633465763638638344343656363366623636255464662661735553323346336465333638336
6222154822345362222322222522826252516222212162122242142222622122427422231223222223423614522215652242
6222632224242211424242122221223142223522122272314221322111422725222212233232111222111221311222122223
7733645442442732531223245525486362495334532522464225353224187425436324512624552272122562562232464133
3122212312222222223262221222241212424214221222222252222212222331144322372726213221422222122222222221
3317564633543532241232338653138233333333364324334323332543322237249336434693237335433133563657333654
2222112144232342525175554221722162744427124325232272237315162252521294737141422751612264275623365412
5233336323444433338634333933257235232354342523921453333345233233432644331633334383243645338643368232
6555744775753685565359587685688568577765366857785355475445486372239447764684674376558464546868574784
3131322312625422313233136243434323233235451234422242642422221233433241342243343332222333122346552351
5545548564544551455444547425574454555985534445454524586545294455554235363458655233939254543595655353
2359665436622224221613324821315324832636221353316524645512225232332321223262434122723638222264123246
1333332423122433422244223222413244221332222222331334124322323329146144322323222422225353223432143332
2252325526527774625423122221535454723322284746512441336421532621335835341737442224474213326432923142
5766753863736644458639676412563282136344433663331635335665536244554854252673336867536454745553535586
5139931557883857995839397424342233394134332434843834938397764484863413686484933823989527723385843673
7286354682444934529442314333841634632432443946348225224943437945312764582252426642212443354433463245
5333223424222352523443254452734543444234454442121354623444212324542542244445314223324234433224341241
2336332233323335432319231323313522133234131534443333333332433123523233523223166334633533319254346322
3333333143332223113333442323223342232243235425354354334356334432335435533321344432432242742523542442
2261454235142314252241242213243143364232222332141662222322248442436223423324264231211282313214412424
3488334264566233754443373333343622327563345364254589363855559833246336332334356352363232364353368336
1232122227141322242221232223224122312242228221224222246224222232213222212222221222222232212222422231
3236763295122212613233243222122225436251538243322312245321313565232523264723325426332723223263241226
1222222232335142362222123254322223622322422223426444223622322223434432433222525212484422336222122133
2322424323244432341252312213322335622323221422345313125352332433421222212431335222342332124312432442
3232821222332422722233212211212324153232331422222222321222323322223622272523212713232321332413272622
3422652314245672235233363232413624422433323321424244162284333425222232322256212251232238721357223148
7774837647487566658756757755755847647655586686578356759987875456786575764558968987878778565587969586
1234223452224271232352455273726233633352227221354347283132212635572422643245234445451363372373482533
5545555754466555455554847555655474545653574744655454656557557545555565555443556555756654565567525555
5553554575554637555471355555154554444754485554555554465523825542545538455434435424455955526476554764
3254522513355333222211324322242533123234124252622229333233422522362352423245261252142252422114324223
2425344423234243432242213333252242333444451414325232234342213224352224134253221152324523223532441142
2582466442443388322624223813222631742479616132436235434553312364912322732234884746223356613144486223
3636223323332312624333322113312432342431432142262253223314236396612381142232422222213122423643323362
7325293432331383666195334723512337573622433434353563239235379451235352335833733463443262233842631543
2232624222332421511175521154321232335222932322461112227222122223213224257225223228222231413222222322
4552958886759955368935997537673735734558749419267255538878465394745752594544365557345558264585655169
2226216222224424524222422122422222224543262772122116426553224212223554631621145422424122825225242116
1222335126326444352764222342426663636441411345223343625343235185633672347245263355582632531664629135
6446446722356324442432213242214223324334335245335452632255422221143347414572397313223584225324331422
5224345323222424434244363345434133334432432442422434334343444345442434433343442433454144443324346244
5336333663337324323323235333336533343334125433374634569233686933546363236465133343459236212383233315
3431212332243413441121331234133441131314434431411433224142211222213143223434341442213344211133456789
5443222683292272324125357143312453332369372333522333233932316972333341214932333824122147432321723342
2367262824212222291672572242672121223153327226222625761267322242612343213625422253225276322142114524
6974563985343496663494433344643427344996686328654636476843646347684276485993646913458343453532176484
2312521543522312123137242323132222221231426242224327114213221222242224322222552327224254122142112333
6223242624251223217243624212512223241767442131244861652377673335441221242314494224319222352132462144
2333332335532332253234215732233323322235422433832233633332422321433233353223223324633524336332332224
2222222254612122222211642121222141234242212212122224252225222222211221224421423222122222532122221124
7421232222222133463122231324223212213131262222222222262223222217223332222242112324223212223323223222
3772242534373521568445363327624535346923343253955164573325436332351227545337435465955345446335669443
5858895152574569257889189996518531539296968776753453347738719235827481499877364362498567754855232996
4342235342363223564433432224563177215352333463431323332332366346334374333222313642241822536513753653
3354323732241336324523344333384638354233345323235333356414435734334356233343815243323232355328535543
3232231323322233322232342342232424122122233213223233212332333242223333133232223335322432333233233222
4222124152125212126225265152124132222832522242612921242522725231324422291234253262251252922212222622
6212552142225252118422223212232132222212722222213122224272253114265212154222226212272212113222621332
4552534756756595545354443365654557336354364737575555533553643535547465544767455573755756641664753655
2511242562394123244232225311322431521234233122422224223242358321213352344333234233713224232844173274
5526573675275646255558956655553398735354554524555427427584565653555545563555555663555386643559595476
4232222322223212512221132222227252235212222222124221221112232212223222453212215322552222422212122213
3323424433432431244433341433443334252333344333423447143363335444343444424424333333334314334534734333
9963543266528685935319932224777827787327354466945986687988877635834976575546746666448364958368484663
6263444224532863343259522662665342226323162222857382232425236267222252462342222824722545227136623635
3613233413353333333733232333232232314323633243331463333723643352333333533333264723363332314333323323
3122425225223233212711545223521542342751432242342216624212233222124622255451462253213221324322312523
4644734133536424434624843436434362694444315342324843447433442362627451364355523726343468233665395334
4423752435257822384423397544537263283356855845353384355467172425447276333227266721254779455411724215
1232222542232223232321322222187293523223312725724724421177222422132522224332622417141822722342212252
1353462356374364544444752374433432367667363527433336443445574733653443133657644213156634465463366664
3192682326222225434218233965252711232242242236626283422252542162524165353222421222322292921262515229
3312233223612332333341332232322333242232223222131312332231232232133322132322233232332333263222412332
3234443454533643613563332542531736363323533332113364323434522333534323225213524556624642433653522553
2356547419343244352723362645244353646442345436343242314441245442452344326474324314552253321131474344
4445493462456534126735454332732865436442644324962445644548387755234434462466476473934635423425734474
3442442214253562342232334243274474423334242283443262663132232234435423322826434324322328667162354334
9222423542321221122258446212213211172721233221222221223272256232642372212224522123332524124143432326
4838673447445676256588638865556356667346668652334584256363964445648566415477386645366466656544567654
4133131233343233241633333254242345323313343244335321522133232321433234243434543352332263632372375333
5828945793549483935858838333432326954645791684532333453883537868337762597642674263434432357934531374
2462313322354323424333646243334253243223325422243531637423233322332433424542344312432533643324436543
2539348544557567255225664845627542364542463624645864444225522842247237721342534922336455362226526365
4313432313333334433332333333722734342333313336332233233233243313333312233323332333333323333334133727
1323322332333334352335343422333333313434243233132333332323433343143341333533143323443344234261233433
4223243421322262122224452325212324411352242723212223222526252232122721211223222332222242215215722252
2122243223224224122252224224652241224312121112242122848123262222222225222222222323223222224122241222
5459575645652678467695654954544755554654556689544674556527565856685345655767347655553755585395765556
4383447444642633635122355334333542442544584433334813341335344332326442333353544332353435434413446234
2423344333433353334546425355243722444635353463435554444333335333343344352563531337322284832853331384
4344441443463433342533145457735744443464345463435763434644743746347434463565745744767446646744313864
3112622325223212232232184172222122311261131225132125212532233125325352242225221233322322254266254222
2421274222332221222313121222321224121244232212223133243213421422123241222122144324214122214425232244
2252234212322333222333523311221223223332432243433311222222311337442363222222245236321222321312511423
2312212222222121212222322222224222222222122222222222221232222241122232322132132222222212232222222122
7262448448421222424318593452122252371672822885228388224822722243224431442228622226178225632277243862
2344523224412264412234421843923324224234342321232125413533424482134222423222714233232222322321642882
1232232212212212121221223233422312211227122221242222222221421521222132222141223222212212313123412222
2421555222443346242342325142532329744622464222455253942465222437421925254433254513524523242264522232
4232364222233223225422625448524281542252232522532734642617212447412431262622232224732414524822558622
2232222122231222222222222121123231223222222223221222222222212222312332222122132222222222231222231222
1693242656125335113327232727222355534235553925255524352364142322551624375266322233222122623649145923
3191622272845397635962226263372437781255371428539472315456786262324541857136172382276663246422552254
2341631463341235353222762222332132322233235534224433242533322672626235543433335824222112122563848222
4243352323393323322412422723421344531443344454133533423332252222525243363335353323442534322434624333
4122122434441322212222232241231253242212423143524122122221222217222331222922224213122242232122112222
8526423444659538534644434443534767654446388646433363374624465623394854334333835689839623378845467864
4313524326322723333653229556672243256457353312433262243536222232243437572346242312182416365263363632
3421432222332125453333232334338344233523333163632322363363515263335412227122266337233332633252733322
2275513536253364556536326359452448225266635634263644244436526674634662244266625636275259662225628464
2222136221237222222112825432222212642741375221233222222212222732324412221253641211214253222228243222
2322321212231213122111233212228222323142251222221222232222462332222222122521122351322522224222232422
7828633443736627726586266432543635144134379442252564462478743746263525583722448333372335374497538124
3222251227311241235422312222323222264311412232322233341221223122222162422212226323422221231211513222
5421435122248223255222326522521252121341244234153622222227423222224612542233443421224122174226163622
4222222222222122113235623133222212322222112232222122252221322321212222222242222332223222321224223122
4233252445312226722225223542226243322454643222228529422542432642233324322422222232232322222413121553
3615624141464526353322824153676424526435724645414624562233359465646754544546524532454445363348642541
3474387467558466355565563784234546623884345559524345534553425662362764666345824956865955463556564644
1222522123722125232431423122312221313222222242227211222212221246224221223122282113232212223221222722
4454441334924563343346322321343234496483913614877527343344493134728782224847974423844453215347431443
4224223212291233225225132212253425261931487567442622576642326112223572438512272224122415569742162525
6445335414254335336633343555235745445554554455535334535356454374324555334533853355353325455547325554
6626581624635444362364651825256666457665474336555556556644435447463645326235256526535444414733534454
5422576923223945122374796322152228884422452328642342753427334326724922222154422242222232232224147344
4223124232132333633123141122222412256142215212333232322372323321121221222222223232322233232323324532
3438133563332253313223323733342334333547565235332563234333513353132433224223733323433153334339332432
2232222222222322552222321413122332322583424323222112232222343122123221632232922421112352212242351221
2144423335464534433412253343495544445443423457247313364443722832342431533337637732644324464447454464
3322412224224232642223433412311245672241314223325221311433242222221421474234544323222122432332342424
3222332324232417422293428432253523184223543221221334231354221534223154231326547412423222932222232423
6454435364652351435243121321513136424162525615464322641241355622412655562155263545644145116561433789
5651549646656564446654548545658544637344446644764426624444646566644356545536335644427954453454845455
1131338231231236463826221222271244933251332426223213122235217233532262423233333232222523523362232232
2534465354338456343753333332343257573256325453237553435457423535435555555343364434344555542935444537
4322212242322122412222273222322242322213244222222612322222214325222212223621321232352231122232222424
5554555422343543534535553555455554872545238244655255353555555535425355545625355635545436646435534944
2423442532223524223122234133414442223441212221427223222232221222222126522422542211125452121224231354
1225222172436272232152224472436378228238344252537321232143222162232422241622442237322439142322224332
2134222222621363445321422363333314221122222223244313241224232522243214274432346243462431342212242424
2121443212224135231222223113432432222232318221222214222213222221232362211212122222447213222412414122
1566355333393336334172656442374316389732383778336895623949463733633559423424688358375253739713963278
2341254222222332212427223222222642221332224111722741226322434121222243214226221723244132622112112222
6644642354573624554464472324223453542555645455422354444343626843445234444444464232522646245432242461
3247436536134438548873464346333532755684353334675455432343435333344342364244863454955333432551323333
1235215233244313532333113423336323344236333333463553332363232223353134733242353532332532433235323331
9222226122322232272232261242721521223265414242325421722226222125122232222231213222672252242812254326
1321222223122222222232223523415321322322222244221222222232233212323122123122223221232542424214322539
3444232433344233344454133423435235333414322363245333434435335434413545373344433431434333433325353439
2212231212222123222222225221229521332221225212351322113133232211222223562322313223231212312212132342
3446665745854144677546554847575954733732467444426485447556754446464596854754334252247464584775744424
4346262565225353555549454323452344542464454435533544545555222345534465553645355534534534542354335354
1335222241344263233453344231323221127323221184223234423232221222322332323423213224332341222223121326
5344331336363574334353641632133233443333323413442443343323633245842438635472374733453364333646334433
9444334434444244644444345323745554354344344442435442435432433266524353434344383446433135455453554445
4533434334344535345534333423444431344333442423245543134433552254344459432435544425422436135444413644
2221322532223525175451345547567432822312232752333534963253638162474322348231743243225235335422414474
5254537535635118228352459323444144421232545422514324214363242754457442221353275325294663252333452344
2413222233253222363233382222333233152212233222212337331353332323322443221324233422332213312322322133
2222353561222523135513522223232521222522222242432335222215412222223212333534452236531127122125221212
2442384334158465433823365235674363435555433458234364573525766645443242362442362654345585533525374685
3333362346234532333524724934541315323533324353333233612233443433323533333394347536227433666337336345
3322344485213336532312332343343333354224833344334424424445333432633913344243324113436484424263233322
3342333423262333433223332234432223332323323233423328434732342233331733323332432433321152213332433334
3333313232317322332533333233335133721333233433822273382244353338333441233242825341253133329383633221
2322243422312132242231323224322324422135322335433593322322522123323251242522132231334321332322335223
5635623236946239558355233633854435593532134143353443243324233533164555442233345444454463345533536943
3544244193244226529332426724342221335632234551423312214452252222623354242453451522223552173531454254
8316113362363225333531324323422213323312453324252323432416222221353339564652322435137224342323323333
7342633555612222253253223233314222132543262332234425246244543534553653523375332342323242224241345132
2426443634943333523434526234444346524431545314136223423324424436344554416413323244144424537235436263
2422345222227262832125222262122535563213221362163123126225342722332424326626434424452442652213242233
2695512227221334661242722252244682332252321214131628211624213412225241322622222125224122222215272282
8352222447535225362515335225152142332257652128665342313311225323322435782254832283123285572331272623
2522423322322452621212352246423223132352222625543322132323122213622223136386123225124222253232522212
6233333553433344335534335441536333444432144432234444434333424533233441434443342335444542211343343443
4353732444512234333345235313431332543323433323223443373336442333335434932835543135333462635233343534
+39
View File
@@ -0,0 +1,39 @@
input_file = "input.txt"
banks: list[list[int]] = []
with open(input_file, 'r') as file:
banks = [ [ int(n) for n in line.strip() ] for line in file.readlines() ]
total_joltage = 0
ALLOWED_BATTERY_COUNT = 12
for i, bank in enumerate(banks):
nums: list[int] = []
last_n_index = 0
for battery in reversed(range(ALLOWED_BATTERY_COUNT)):
if battery:
n = max(bank[last_n_index:-battery])
nums.append(n)
last_n_index = bank.index(n, last_n_index) + 1
else:
n = max(bank[last_n_index:])
nums.append(n)
last_n_index = bank.index(n, last_n_index) + 1
# Convert Nums to an Int
joltage = int(''.join([ str(n) for n in nums]))
print(f'Joltage for Bank {i + 1}: {joltage}')
total_joltage += joltage
print(f'Total Joltage: {total_joltage}')
+4
View File
@@ -0,0 +1,4 @@
987654321111111
811111111111119
234234234234278
818181911112111
+140
View File
@@ -0,0 +1,140 @@
@.@.@@@@@@@@.@.@@@@@@@@@@@@@.@@@@..@@@@.@@...@@@@.@@...@@@@.@@@.@@@@@@..@.@.@@@@.@..@@..@@.@.....@@@@..@@@@@@@@@@@.@@.@.@@@@.@..@@@@..@@@.@.
.@.@@.@@@..@@@.@@..@@@@@.@.@@@@@.@@.@@.@@..@...@@@@@@@...@@..@..@@@@@@.@@@@..@..@@@@@.@.@.@.@@@@.@.@.@.@@@@@@@@...@@..@.@.@@@@@...@@..@@@@@.
.@@.@@@.@.@.@@.@@@@@@@@@@..@..@@..@@..@.@@..@@.@@.@.@@.@..@@@@@.@@@@@@@..@@@.@.@..@.@@@@@@@..@@..@@.@.@.@@.....@@@..@@.@..@@.@...@@@..@.@@@@
....@@@@@@..@@@..@@@@@.@.@.@.@@@@@@..@.@@@.@....@.@@@@@.@@.@@@@@@.@@@@@@.@@..@@@@...@@@@@@@@@@..@@.@@.@...@.@.@@@@.@.@@@@.@.@@.@@.@..@.@...@
@@.@@.@..@@@......@@.@.@@.@@.@.@..@..@@@..@..@@@@@@..@@.@@@@@@@.@.@@@..@.@.@.@.@@@@.@@...@.@@@..@@@@..@@@@@@@@@@@.@@.@@@@@@@.@@@@@..@..@..@@
@@@@@@@.@.@.@@@@@.@@@@@@@@@.@@@@@@..@@@@@@...@.@..@.@.@@@@@@@..@.@@@@@@@.@@@@@.@@@.@...@@.@..@@@@.@@@@@@..@@@@@.@@@.@....@@..@.@.@@@@@@@...@
@@.@@@@.@.@@@.@@@..@@@@@.@@@@@@@@@@.@@@@.@.@@@@@@@.@....@@@.@.@@@@.@....@@..@@@@@..@@@@..@@....@@@@.@@@..@@@@@@.@..@@.@@@@.@@@@..@@@@.@@@..@
..@@..@@@.@@..@@.@@@.@..@@@.@.@@@..@@@@@@.@.@@@@.@.@@..@@..@.@.@@@@........@@@@.@@@.@@.@@@@@.@@@.@@..@.@@.@.@@@.@@@@@.@@@.@..@@@@..@.@@.@@.@
@@.@@...@..@@@@@.@@@@.@@@.@@..@.@...@@..@@@@@..@.@@@@@@@..@@@@.@@@@@.@.@@@.@@@....@.@@@.@.@.......@@.@@@..@..@@@@@@@...@..@@.@@@@@.@@@@@..@.
...@@@@.@...@@.@.@..@@.@@@..@@.@@@..@...@@@.@..@@@@@..@@.@@..@@...@@.@..@@.@@@@@@@@.@.@.@@@@@@@@@.@...@..@@@@..@@.@..@.@@@@@@..@@.@@@@..@..@
@.@.@@@@.@.@.@.@@..@.@@@.@@@...@.@.@.@@.@@@@@@......@@.@@.@@@@@.@@.@@@@....@...@@@@.@@@@...@.@@.@.@@@@.@@@@.@....@@@.@@@@@@@@@@.@@@@.@@@@@..
@.@@@@@.@.@..@@..@...@@@.@..@.@@@@@@.@@@@@.@@.@.@.@@...@@@.@@.@.@@@...@.@.@..@.@@..@@...@@@.@.@..@@@@.@@@@..@@@@@.@.@..@..@.@.@@.@....@....@
@@@@@@@@@.@.@.....@@....@@@.@@.@@@@@.@@.@.@@@@@..@..@@.@...@.@.@@@.@.@@@@@@..@@.@@....@..@@.@.@@@@.@@.@..@.@@@@.@@.@@@..@@.@@...@@..@@.@@.@.
.@@@..@..@@.@@@.@@@@.@@@.@..@@.@@@..@@@@.@@@@.@.@@@@@@@@@.@.@@@@.@@@.....@@@@@.@@@@@@@@@@@..@@..@.@@@@...@@@@.@@@@@@@...@@@@@@@@@@@.@@@....@
@@@@@..@@..@@.@@@@.@.@@@@@.@@.@@.@..@...@@@.@@.@@@@@@.@.@@@..@@@@@@@@@@.@@.@..@.@@@..@.@.@.@...@@@@@..@@@.@@@.@@@....@@.@.@..@@.@@.@@.@@..@.
@@@@@@@@.@@@@.@@@..@..@.@@..@@.@..@@@.@.@@...@@@@@.@@@..@@@@@@@@..@@@@...@.@..@.@@@@@@..@.@....@..@@@@.@@@@@@.@@@....@@.@@@@.@@@@@..@@.@..@.
@@@@.@@@.@@..@..@@@..@@@@@@@@@@@..@.@@@..@@@@..@@@@@@@@@@@@@@..@@@..@@@@@@@@@.@..@...@@@.@@.@.@......@@.@..@@@.@...@.@.@@@.@@@@...@@.@.@..@@
@@.@.@@@@@@@@.@@@..@.....@..@.@@.@@@@....@@@...@@@@@@@@@....@.@@@@..@@.@@@@@.@.@@.@@.@.@@@@@@@@@@@.@.@.@@.@@@@..@.@.@.@@@.@@@.@@.@@...@.@@@.
@..@@.@@.@@@..@@.@@@@@@.@.@@.@.@.....@..@..@@.@@.@@@@@@@@..@@.@@@@@@@.@@@@...@@@.@@..@@..@..@@@.@.....@.@@.@@@@@...@@.@@@.@@@.@@@.@@..@.@.@@
@@@@.@@@@@.@.@@.@...@.@@.@@@@@@@@@.@@@@@@.@@..@@@.@@@..@@.@.@@.@@@@@@.@@@.@..@@.@@.@@..@.@.@@@.@@@@@.@@.@...@@@.@@.@@@@@.@@..@@@@..@.@@@.@@@
.@@@@.@....@..@@@@@@.@@@.@@@.@@@@@.@..@@@@@...@@@@.@@.@@@@@@@@.@@@@.@@@.@@..@...@@..@@.@...@@@.@@@@@@...@.@@@@@@@@@..@@.@@@.@@@.@.@@@.@..@@@
@@@..@@@@.@@..@@@@..@@@.@..@....@@.@..@@.@..@@@@....@@.@.@.@.@@.@@@@@@@..@@@.@@@@..@@...@@.@@@.@@@@@....@@@@.@@..@@@.@@.@@..@@.@@.@...@@@..@
@@@@@.@@@...@.@@..@.@@.@@..@..@.@.@@..@.....@@@@..@.@@@@.@@.@@@@@@@@@.@@..@@@@@@..@@..@..@.@@@@@@..@..@....@@@@@.@@@@@@..@@@@@@@@.@@..@@.@..
.@...@@@@@@.@@@.@@@.@@@.@.@@@.@@@@@@@....@@@@@@.@..@@@.@@@@.@@@.@..@@@@.@@@..@.@.@@@@..@.@.@@...@@@.@.@@@.@.@@@@@@@.@@..@@.@.@.@.@.@@@@.@@@@
@@@.@@.@@@@@@.@@@@@..@@@.@.@..@.@@@@.@.....@@@.@......@@@.@...@@@..@@@..@@.@...@.@@@@.@.@@.@@@@@@@@.@@.@@@.@.@...@@@@..@.@.@.@@@..@@@@@@.@@@
@..@@.@@@@@@@@@@.@@..@.@.@@@@...@@..@..@@.@@@@.@.@....@.@@.@@@.@.@@.@.@.@@.@@@@@@@@@@@...@@@.@..@@.@.@@@@@@@@@@.@@.@.@@@.@@.@@@.@.@@@...@.@.
@@@@@@.@@@..@.@@@@@@.@@.@.@@@..@@@@@@@@.@.@@@@.@@@@@@@.@@@.@@@@@@..@@@@.@.@@@@@..@@@@@@@@@@.@.@@.@...@@.@@...@@@@.@@.@.@.@@@@@.@@@.@....@@@@
.@@@@@@...@@.@.@@@.@@@..@.@@@@@@@@..@.@@@@@@@@....@@@@@@@.@@.@@@@@@@..@@....@@@@@@@...@..@.@...@@.@@@.@@@@.@.@@@.@.@@@@@@@.@@@@@@@@@@@.@@@@@
@..@@@@.@@@@@.....@@.@@.@@@@@@.@..@.@@.@@.@@@@@.@@@@@@@...@.@.@........@..@@..@.@@@.@.@@.@@@.@@@.@.@.@@@.@..@@@@@..@@..@@.@.@@..@.@@.@@@.@@@
...@.@@@.@@.@.@....@@@@@..@..@@@..@@@@@..@..@@@.@...@.@@.@@.@.@@..@.@@@...@.@@@@...@.@..@@.@@.@@@.@..@@.@@.@@.@@..@@.@.@.@.@.@@@@@@@@@...@@.
...@.@.@.@.@..@@@..@.@@...@@@@@@@@@@.@..@..@.@@.@.@@@@.@@@@@..@.@.@@@...@@..@@@@......@@@.@@@@.@@.@@...@@@@@@@@@@@@@@.@.@@.@@@@.@@..@.....@@
@.@.@.@@@...@@.@@@@@....@@.@.@.@@.@@@@.@@@@..@@.@@@@.@@.@@@@@.@@@.@@@@@@.@@@.@@.@.@...@.@.@.@@@.@@..@@@.@@..@@@.@@@..@..@@@@..@@.@..@.@@@@@.
@@.@@@...@@..@..@@@.@@@@.@@@@.@@@.@@@@..@@@@@@@@...@@..@@@@..@.@@.@@@@@@...@@@@@@@..@.@@.@@@...@@.@@...@@@@@.@..@@@.@@@.@@@@.@@@@..@.@@@@.@.
@..@@@@.@@.@@@@.@@@.@.@@@.@@@.@@@@..@@.@@..@@@.@....@.@.@@@@.@@@.@.@.@@.@@..@.@@.@@@@@@@@...@@@@@..@@@.@@@@@@.@@@@@@.@@.@@@.@@..@@@@@@@@@.@.
@@@...@@@.@@@@@@.@.@@@@@..@.@@.@@.@@.@.@.@@@@@@.@..@@.@@@.@..@.@@@@@@@@@.@@@@@.@@@.@.@.@@.....@@@@.@...@@@@@.@@...@@@@@@@@@@@..@.@@@.@@.@@@.
@@@@@.@..@.@@@@@@...@@@@..@@@@@.@...@@@@@.@.@@.@@@..@@@@@@@.@@@...@@.@@@.@@@.@@@@@@@@@@..@@.@.@@@.@@@@.@@@.@@@.@..@@@.@@@.@@@..@@@@@.@@@..@@
.@@@.@.@@@.@@.@@@@.@.@.@@.@@@@@@@@@@@.@@@@..@@.@@@@@@.@..@@@.@@@@@@@.@@.@...@@.@.@@@@@.@..@..@@@@..@..@@@@@@@@@..@.@@.@..@@..@@@..@@@.@@.@@.
@@@.@@..@@@@@.@@@.@@@....@@.@@@@.@..@@@..@@.@@@@@..@@@@@..@.@@@@.....@@@..@@@.@.@..@...@@@@@@@@..@@@.@.@@...@@.@...@@@@@@@@.@@@.@@@.@.@.@@@@
@@.@@..@@@@.@..@.@@@@.@@@..@@.@..@.@@@@....@@@.@..@@@@...@.@@.@@@@@@@.@.@.@@@@@.@@@..@@...@@@@@...@@@@@@@.@.@@.@@@.@.@@.@@@@@@.@.@@.@.@.@@@@
@.@@@.@@..@@..@@@@.@@.@@@@@@@@@@@.@.@@..@@@.@@..@@.@@@@.@..@@@@@...@@..@@.@.@.@.@@@@@@.@.@@........@@@.@@.@.@@@@.@.@...@@@@....@@.@@@@.@@.@@
.@@.@..@.@@@@@@@.@.@@@@.@@@@@@.@@@@@.@@@@.@@@..@.@@@..@@@@.@@@@@.@.@.@@@@@.@@@@@..@@@@@@@@@.@@..@@@@.@@@@..@@.@@.@@@@@@...@@@@@.@...@@@@@@@.
@@.@.@@@.@..@.@@.@.@@..@.@.@@@@..@@.@@......@.@@.@@@@@@@@..@@@@.@.@.@@@@@.@@@.@@@.@@.@@@...@....@....@@@@@@....@.@@@@@.@@..@@...@@@@@@..@@.@
@.@@.@@@@...@@@.@@.@.@.@@.@@.@@@@..@@@@.@@@.@@@@@@@@.@.@@@@@@@@@@@@@@.@.@@@.@@.@@.@@.@@@@@@@.@@@@...@@@.@@...@@@@@@.@.@.@.@@.@@@@.@@@.@.@@@@
@@.@.@@.@..@.@@..@..@@@@.@@@@@.@@.@.@@@.@@@.@@..@@@@...@@@@.@@..@.@@.@@@@.@@@.@@@..@@.@.@@.@..@@....@.@@@.@@@@@@.@@.@@@.@@@..@.@.@@...@@@@..
.@@@..@@@..@.@.@@@@@.@..@@@..@@@.@@@@@.@.@..@@...@.@@@@.@@@@@@@@@.@@@..@@@@@@@@@@@@.@@@@..@@@..@..@@@@@@@@..@@@@@..@@..@@..@@@@..@@@@.@@.@@.
@@.@....@@@@@@@@..@.@@@@@@@.@@.@@@@..@@@@.@@..@..@@.@@@@..@@@@..@@...@@@@@.@@@@@@@@@..@@@@@.@@@.@@@.@..@@.@.....@@@@@.@@@@@.@@@.@@.@@@@@@@@.
.@@@.@.@..@@.@@...@.@.@.@.@.@@@@@@.@@@@@.@@@.....@@@@.@.@..@@@.@@@@@@@@.@@@@@@..@.@..@@@.@@@@@..@@@@@...@@@@@.@@@.@...@@..@@@@@@@@@@.@@@.@.@
@..@@@@..@@..@.@@..@@@@@@@@@.@.@@.@@.@@@@@.@@@@@@@@@..@@.@@@@@@.@@@@@@..@@@.@..@@@@@@@@...@@@..@@..@@@@.@.@@@@@@....@....@@@...@@.@@@@@@@@.@
@@@.@@@@@@.@@@.@@.@.@@.@.@..@@@@..@@@@..@@@.@.@.@@@@@@.@.@.@@@@.@...@.@@@.@.@@@@.@@.@@@@@@.@@@.@@.@@@@.@@.@@@@@@@@@@....@@.@@.@.@@.@@@@@@@..
@@.@@.@@@....@@.@@.@@@@@@..@@@..@@@...@..@@@@@..@.@.@.@@@@@@@.@@.@@@.@@..@@@@.@..@@@.@@@@@.@.....@..@@@@@.@..@@.@@..@..@@@..@@@@@@@...@@@@@@
@@@....@@@@@@@.@@@@@@@@@...@@.@..@.@@@@@..@..@@@@.@@@@@@.@@.@.@.@.@.@@@@.@@.@.@@@@@.@@@..@@@....@..@.@.@@.@.@.....@@@@@.@@@@.@.@@@@.@.@.@...
@@@.@.@@.@@@@....@@@@.....@.@@@..@@.@.@.@...@@@@.@@@@@@@.@@@@@.@..@.@.@.@@@.@@@@@..@@@@@.@@.@.@.@.@.@@..@.@.@@@@@@@..@...@..@@.@@@@@...@.@@@
@@@@@@@@.@@@@@@@.@@@@@@@@@@@@.@@@@@@.@..@.@.@@..@@.@@.....@@@.@.@@@.@.@@.@..@@@.@.@@.@@@@..@@.@@@....@@@@.@@..@@@.@@@@@@@.@@@@...@@@@...@.@@
.@@@@@@@@@.@@@@@@@..@@@@@@@@.@@@@@@@.@@@@@@@...@@@.@@@.@@.@@@.@..@@@..@@@.@..@@@@@@.@@@..@@@@@.@@@@@@@@.@@..@@@@@.@@@.@.@.@@@....@.@..@..@@@
@@...@@@@@..@..@@.@@..@@.@@..@@.@.@@@@@@.@@@@.@@@...@@..@@@@@@@@@@@..@@@.@@@@..@@..@@@@@@@@.@@.@.@@..@@@@@@.@@..@@.@.@@@@@..@@@@@@..@@..@@.@
@.@@@@@.@.@@@@@.@@.....@@@.@.@@@.@@@..@@@@.....@.@..@@@...@..@@.@@..@@@....@@.@.@@@@@@@@@@@@@@@..@@.@..@.@@@@@@@.@@..@.@.@@@@@@@@@@@.@@@@.@.
...@.@.@@@@@@.@@@..@@..@@@...@@..@.@..@@@@@@@@@.@@..@@..@@@@@.@.@@.@@@@@@@.@@@@@@@@.@..@.@..@@@@@@.@@@@@@.@.@@.@..@@@.@@@@@@@@@@@@@@@@.@@@@@
.@@@..@@.@..@@@..@..@@@@..@..@@@@@@@@@@@@@@.@@@.@@@@.@@@@@.@@@....@.@@@@.@.@@@@.@.@.@.@@.@@@@.@@..@..@@@@@@...@@..@.@..@@@@.@.@@@@..@..@@@@.
@@..@..@..@@@@@.@@@....@@.@..@.@.@...@.@@.@@.@@@.@@.@@@@...@@..@@@.@@@@@@@@..@@@.@@@@@@.@@.@@.@@@@@@@.@@@@@.@@...@@@@@..@@@@@@@.@@@@...@@@@.
.@@.@@..@@@@@@..@@@@@@@@@..@...@.@@..@.@....@.@@@@.@@@....@..@...@@@@@.@..@.@.@@@.@@@@@..@@.@@@@@...@..@.@@...@@.@@@@@@@@.@@.@@@@.@.@..@....
..@@.@..@@@.@@.@.@@..@.@@..@...@..@@.@@@@@@@@@@@@.@.....@.@@@.@@@@@...@@.@@@.@.@@@@@@.@@.@......@@.@@@..@....@@@@..@..@...@.@@@.@....@@@@@@.
@@@@.@@.@.@@...@@.@..@@@@.@@...@.@@@@@.@@@..@.@.@....@@@@.@@@@@.@@@@@@@@@..@@@.@.@..@@.@@@@@@.@.@.@.@.@.@.@@.@@@.@@@@@@.@@.@.@@.@@...@@@@.@@
@@@@.@.@.@@@.@@..@.@@@.@@..@@@@.@.@@@@@@.@..@.@.@...@@.@@@.@.@@@@@@.@@.@.@.@.@@@@.@@@....@@@@@.@@.@@@@@.@@@@.@@@@@..@.@..@.@@@@..@@@..@@@.@@
...@.@.@@.@@.@@.@@@.@@@..@@@@@@@@@.@@@@@@@@..@...@..@@..@.@@@@..@@@@@@.@@@@@@@@@@@@...@@.@..@@@...@..@@@@..@..@@@@@@@@..@.@@@.@@@.@@@@@@@@@@
@.@.@@@.@@.@.@@@@@.@@@@@@@@@@@..@.@@@@@.@.@.@@@@@@@@..@.@.@@...@@.@@.@@.@@@.@@@@@.@@@.@.@@.@..@.@@@@.@@...@.@.@@.@..@....@..@@@@@@.@@.@@@@@@
..@.@@.@@@.@@..@@.@@.@@..@@.@@@@@@.@@...@@..@@@@...@.@@@.@@@@@@@@@...@@@.@@@@@...@@.@@..@@..@..@.@.@.@@@@.@@.@..@@@@@@..@@@@@@@@@@@@@@@@@@@@
.@@.@@.@...@@....@@.@.@@..@.@.@@.@@@@..@@@@@@...@@@@@.@....@@.@..@@@..@@.@....@@.@@@.@....@@@.@.@@@@.@..@.@.@@@@.@@...@.@.@@@@....@@.@@.@.@@
...@@@@.@@@@.@@@.@...@..@@.@@@@.@@@@@..@.@@@@@@@....@....@.....@.@@.@.@@@@@.@@..@@@...@@@@.@@..@@..@.@@.@.@@.@.@@.@..@@@@@.@..@@.@@@.@@@@@@@
@@.@@@..@@@.@@@..@@@.@..@@@@@@.@@@@.@@@@@@..@.@.@.@@..@@@@.@@@.@@.@@@@.@@@@@@@..@@@@@@@@..@...@@@@@@.@@@....@@@@.@@@@@.@@@.@@@@@@@@.@@...@@@
..@.@@@@..@@....@@@.@@.....@@@@@@@@.@..@.@..@@...@.@..@@@.@@@.@...@@...@@@@.@.@@.@@@...@..@@@.@..@.@@@@@.@@...@@@..@..@@@..@@.@@@@@@..@@@@@@
.@...@.@@..@@@.@.@@.@@...@.@@@@.@@@@@@..@@.@@@@....@..@.@@.@@.@@.@@@.@.@@@@.@.@@..@@@@@..@.@@.@.@@.@@@@...@@...@.@.@@@.@@@.@@.@@@@@@@.@@@@@.
@@..@@@@@.@...@..@..@@@..@@@.@@@@..@.@@.@@@@.@@.@@@@...@..@@@@@@@@@@.@@@@@@.....@@....@@...@@@@@..@@@.@@@@@@@@.@@@...@.@@.@@..@.@..@.@@@@@@@
.@..@@..@...@@.@@@.@.@..@@..@.@.@.@..@@@@@@..@..@..@@@@@@.@@.....@.@@@@@@@.@.@.@@.@@@@...@@@@@@.@.@@.@@@@@.@..@@.@.@@@@@@@@@@@@..@@@@.@.@.@.
@...@@@@@...@@@@@@.@@.@...@.@@@@@@@@@@..@.@@@..@@.@@@..@@@@@@..@@@@@.@@..@@@@@@@@.@@@@@@@.@.@@@@.@@@@@@@...@@@@@@.@.@.@@@@..@@..@.@.@@@@@@.@
.@..@@.@@.@@@.@@.@@...@@@.@..@.@@.@@@..@@..@@@.@..@@@@@.@.@@..@.@..@...@...@...@@.@.@.@.@@.@@.@@.@@@@..@@@..@@.@@.....@@@@.@...@@.@...@.@@..
@@.@@.@@.@@@@@@@.@@.@..@@@@@@@.@...@.@@@..@@..@@.@@@@..@@@@@@.@@@@@.@@@@@@@.@.@.@.@.@.@.@.@@@@@@@..@@@.@@@.@@.@.@@@..@@@.@@@.@@@@.@@@@.@.@..
@@.@..@@@..@..@.@@@.@@@@@@.@.@@@@@@@@@..@@.@@@@.@.@.@@.@@.@@@@@@..@...@.@@@@@@@@@@@@.......@@@..@...@@@@@@@..@.@@@@@@@@@....@@@@@@@@@@.@@...
..@.@@@.@@..@@...@.@@@@...@.@@@@..@@@.@..@.@...@@@.@@.@@@@@.@.@@.@@@.@@.@@@@@.@@@.@@.@@@..@.@..@@@@@@@..@@@@@...@....@.@@.@@@..@@@@.@@.@@@@@
@@@.@.@.@@@@@@@@@@@...@..@@@@...@@@@@.@...@@@@@@.@@@..@@@@..@@@@@@@@@@@@@@@@.@@@..@@.@@@@...@..@......@.....@@@.@@@@@@@@@.@@@..@@@@@.@@@.@.@
@.@.@@.@@.@.@..@.@@.@@@@@..@..@@@@@@.@@@@.@@@@@.@@@@@@..@@@..@@@@@@.@.@@....@..@@@.@@@..@@@@...@@.@@@@@@@@.@@.@.@.@.@@.@.@.@.@@@@@@@..@@@..@
@@@@@@@..@.@@@.@@.@..@@....@.@@.@@.@@@.....@@@@@@@.@@.@.@@..@@@@@@@...@...@.@@@@@..@@@@@@.@@@@.@@...@@@...@@@@@@.@@@@.@.@@.@....@@@.@@@@@...
@....@@.@.@.@...@@@..@.@@@.@@@@@.@@@.@...@@.@@.@@..@.@....@.@@.@.@.@.@.@@.@@@@.@@.@@..@@@@@@@@@..@.@@@.@@.@.@@@@@@@@@@@@.@.@...@..@.@@@..@@@
.@@.@@....@@@.@@@..@.@.@..@.@@..@..@@.@@..@.@@@@@@.@@.@@@@@.@...@@@@@.....@@@....@.@@.@@@@@@.@@@@...@@.@@.@@.@@@@@@@@@.@@@@...@@.@.@@.@@@.@@
..@@@.@@@.@@@..@@...@@@@@@@@@@.@.@@@@@...@@.@@@@@.@@@..@.@...@@.@@.@@.@@.@@@@@.@.@@@..@@@..@@.@.@..@@@..@@@@.@@@@@@...@@.@@.@.@..@@.@@@.@@@.
.@@@.@@@@@@.@@@@@@.@@.@..@.@@@..@@.@@@@.@@@.....@@.@@.@.@.@@@.@@..@@@@@@.@@.@@...@.@@@@@@@.@@@..@.@@..@@@@..@.@@@.@@@@@@@@@.@@@@.@@@@.@@@@@.
@@.@@@.@@@@.@@.@@@@.@@@..@@@@@@@.@...@@.@@..@@@@@.@@@@@@.@...@@.@@.@@@@@.@@@.@@@@@@..@.@@@@@@@@@.@@@.@@.@.@.@@@.....@..@@.@@.@@...@.@..@..@@
.@@...@@@@.@@.@@@@@@@.....@@@@@@.@.@.@.@@@@@@@@...@.@.@.@@.@@.@.@.@@.@@@@.@@.@.@@@@@..@@@@...@@@@@.@@@@@.@..@@@.@@@@@..@@@@@@.@@@..@.@@...@.
@@@@@@@@@.@@@@@.@@@@..@.@@@@@@@....@@@@......@.@.@.@@@.@.@.@@@.@.@@.@@.@@@@.@@..@..@@@@@@.@@@.@@@@@@@@@@@@..@@@.@@...@..@.@.@.@..@@.@@.@@.@@
@@....@@@...@@@@..@.@.@.@@@...@@@.....@@......@.@@.@@@..@@@@@@.@@...@.@@@@@@@@.@....@@..@...@.@@...@@@@@@..@@.@@.@@@.@.@@.@.@.@....@..@@.@@.
@.@...@@@..@@@@@@@@...@...@@@@.@@@@...@..@.@.@@.@@@@@.@@@@@.@@.@@.@..@@.@@..@@....@@.@@@@@.@@@@@@@..@@@@@..@.@@.@@@.@@.....@@@@.@.@.@@.@@@@@
@@@@.@@..@.@.@....@@@@.@@.@@...@@..@@@@@@.@@.@..@@@@@.@@@..@@@.@@@..@@@@@@..@@..@@...@@@..@@@.@@.@@..@@.@@@@....@......@.@@@.@@@@@.@@.@@..@@
@@@@@.@@.@@@@.@..@@..@...@@@@.@@..@@@@@.@@.@@@@@.......@@..@@@@@@@..@.@.@@.@@@@@@@.....@.@@@.@@@@@.@...@@.@@@@@.@@@.@@@@@@@.@@@.@...@.@.@...
.@@..@@.@@..@@@.@@..@@.@@@.@.@.@@@..@..@@@.@@@@@.@.@.@.@.@.@@@..@@..@@.@...@@@..@...@@@.@@@@.@@@@@...@@@..@.@@.@.@.@@.@@@@@@.@@@.@.@@.@.@.@@
.@@...@@....@@@@@@.@....@@@@@.@.@.@@.@@@@.@.@@@@@.@@@@@@@@....@@@.@.@@...@@@@@.@@@@@@.@..@@.@@.@@@@@@@@..@@.@.@@@..@@@@@@@@.@@..@@@.@@@.@@.@
.@.@@@.@@@.@.@@...@..@@@@@@...@@@@..@@@@@@@@.@.@@.@@@.@.@@@@..@.@@.@@@@@.@@@@@.@@@@..@@@@@@@@.@@.@@@.@..@@@@@.@@..@@..@.@@@@.@..@.@..@@.....
...@@..@@.@@@.@.@@@@@@@@@..@@@@@@..@.@@@@......@...@.@...@.@@@.@@....@@.....@@.@@..@..@@@@...@..@@..@@..@@.@.@@@.@.@.@@.@.@@.@..@@..@@..@@@@
.@@@@@@@.@.@@@@@@@@.@@@@@@..@@....@.@@@@@...@@@@@.@.@.@@..@@@@@..@@@@@@@.@@.@@.@@@...@@.@.@@@@.@@@@@.....@..@.@@.@@.@.@..@@@.@.@.@..@@..@@@.
@@@@@@@@..@@.@@.@.@@@@@@.@@.@@@@@.@...@@@@...@.....@@@....@@.@@@@@@@..@@@.@@@@@....@@..@@.@@@@.@@.@@@@@@@.@...@@.@@@.@.@@@@@@.@...@...@@.@@.
@@.@.@@@..@@@.@.@@.@@@.@...@@..@@@.@.@.@@@.@.@...@@.@@@@@@@.@@.@@@@@..@@@@.@@@.@@@.@@@@@@@..@.@@.@@.@..@@@@@.@..@.@..@@@....@..@..@@@@.@@..@
@.@@@.@@@.@...@@@.@@@@@@@.@@@.@...@.@@@@...@@@@@.@@@@@@@@@@..@@@@@.@@@@.@@@.@@.@@.@..@@.@@@@@.@@@.@@@@@.@@.@@@.@.@.@.@.@.@@@@...@..@@@@@..@@
...@@@@@.@.@.@@@@......@..@.@@@@@@@.@@@@@@.@@@.@..@@@..@.@@@.@.@@@@@@@.@.@@@@..@@.@@@@@@@@@@..@@@@@@@@..@..@..@@@@...@@@..@..@.@@.@@.@.@.@@.
@...@.@@@.@@.@@..@@.@@...@@@.@.@@.@@@@.@..@@@@@@@@@.@.@@.@@@@@@.@@.@.@@..@@@..@@@@..@@....@.@@@.@@@..@@@.@..@@@@@@@@@@.@.@@@.@....@@@@.@@@.@
@@@.@.@@@@@..@.@.@.@@.@..@@...@@@@..@@.@....@@.@.@@@@.@@.@@@.@@.@.@@.@.@.@.@@..@@..@@@@@@@@@.@@@@@@.@@@@@..@@.@@.@@@.@@.@.@@@@.@..@@.@@.....
.....@@@@@@..@@..@....@@@@@@@..@@@@..@.@.@.@@.@....@@@@@.@@...@..@@.@.@..@@@..@.@@@@...@@@.@@@@@@@@@@@@.@.@@@.@.@@@..@@@@.@.@@.@@@@....@@@@.
....@@.@.@.@@@..@@@.@@@@@@@@@.@..@.@.@@@.@...@@@@.@@.@.@@.@..@..@@@@@@@...@@@...@.@@.@@@@@@@..@@@@@@@.@@.@@@@@@.@....@.@@.@.@@.@@@@.@@@@...@
.@@@.@@@@@@..@.@@@@.@@.@.@@@.@@@@@@@@.@@@@@@@@@@@.@@..@@@@@...@@@@@@@@@.@@@@@@@.@..@@@@@.@@@@@@@@@@@....@@@.@@@.@@@@@@.@@@.@@@.....@@@.@@@.@
.....@@@@.@@.@..@@@@@@@@.@@@@.@@@@..@@@@.@@@..@.@@@.@@.@.@@.@@@@..@@@..@@@@@@...@@@.@..@@...@@@.@@@@@.@@..@..@.@@@@@.@@.@@.@..@....@@.@..@.@
.@.@.@@.@@@.@@.@.@@@@@......@@@....@...@.@@@@..@@@..@.@.@@@.@.@@.@@@.@..@.@@@.@@...@.@@.@.@.@@@@@@..@@@@@@@.@@.@@@.@.@..@@@@..@@@.@@.@..@.@.
@.@.@@@@.@.....@@..@.@@@.@.@..@@@.@.@..@.@@@@@@@.@@@@@..@@..@@@@@.@@...@@.@@@.@@.@.@@@@@@@@@@@@...@@@.@@@@@.@@@@@@.@@.@@@@@@..@.@@@...@@@@..
@@@@@.@.@.@.@@@@@@@.@.@@@@..@@@@.@@.@@...@@.@@...@@@.@@.@.@@@@@.@@@@@@@..@@@@@@..@@.@@.@.@@.@.@@@@@@@@.@@@@...@@..@@@.@..@..@@.@..@@@..@@@@.
.@.@.@.@@@@@@@@@.@@.@@.@@@.@@@@@..@.@..@@@.@@@..@@.@@.@@@....@@@@@....@@@@@.@@@@@@@@.@@.@..@@.@...@.@.@.@@..@@.@.@.@@@.@@.@@@@@..@@@.@@@@@..
@@@.@@.@@@.@@@@@..@@@@.@@@.@@@@@.@@..@@.@.@..@@.@@.@@.@@..@@@@@@.@@@@@.@.@.@..@@@.@@@....@@.@@..@@@@@@@@@@.@.@@@@@@...@.@@..@@@@..@@@@.@.@@@
.@@@..@@@.@.@@@@@@.@.@@@@.@@@@@@.@@@@@.@@@@@@.@@@@.@@.@@@@@@@@@@@@@@@@@@@.@@@..@@@@@@..@..@@.@@@@@@@..@....@@..@.@@.@@.@@..@@@.@.@@..@@..@@.
@@@.@.@@@@.@@@@@@.@@.@.@@..@@@..@@@..@.@.@.@@@@@@@@@@@@..@@@@@@@@@@@.@@@@@@..@.@@@@....@@@@@@...@@.@@@.@.@@@@.@.@.@@.@@@@@....@@@@..@@.@@@@@
.@@@@@@@@@.@.@@.@.@.@@..@@@.@..@@@.@@@@@.@@@..@@@..@@@@@@@@@@@@.@@@.@@@@@@...@@.@@...@@@@.@....@..@@..@@.@@@.@@@.@..@.@@@@.@.@@@@.@....@@@@@
@.@@.@@@@@.@@.@@@@@@@@@@..@@@@@@@@..@.@..@@@@.@.@.@@@@@@.@@@@@..@.@@@..@@@@.@@.@.@@@@.@.@@@@@@@@.@@@.@@@@@.@@@...@@@@....@.@@.@.@...@..@.@@@
..@@...@@@@@@@.@.@@..@@@@@@@....@@.@@..@..@@@.@..@@.@.@@@@@@@@@@...@...@@@@@@@.@.@@@@@@.@....@@@@......@@@.@@...@@@@@@..@@@@@@@@@@.@@@@@@@..
@@.@@..@@@@@@@@.@.@@.@@@.@.@@@@@@@.@@@@@@@.@@.@..@@@.@...@.@@@@...@..@@...@@@@@@.@@@@@.@@@..@@@@.@@@@@@...@@@.@.@..@..@@@@@.@.@.@.@@..@@@...
@@.@@@@.@.@.@@.@.@.@...@@@..@..@@@@@.@...@@@@.@.@@.@@..@@@..@@...@@@..@@@..@@@.@@.@.@.@.@.@@@@@..@@@@..@@@@@@..@@@@@@@@@@.@.@..@@@.@@@..@.@.
...@@@@@@@@@@@.@..@@...@@@@@@@@.@@@.@@@.@.@@@@.@@...@.@@..@@@@@..@.@@@..@.@@@@@.@..@@.@@@@@@@.@@@@@@@..@@@@.@...@.@@@@@@..@.@@@@@@@.@..@.@@.
..@@.@@@.@.@.@@@.@@.@.@.@@@.@@@@@@@.@@..@..@@@@@@@@.@@.@@@..@@..@@@@@.@@@@.@.@.@@@..@..@@...@...@@@@.....@@@.@.@.@..@.@@@@@@@@@@...@..@@@@@@
@@...@@@@@@@@.@@@@.@.....@@@@@@@@.@@...@@@@@.@@@..@....@@....@.@@.@@@.@.@@@@@@..@...@..@@.@@@@@@@@@@@@@@...@@@@@@.@@@@@@@.@@.@.@@@.@@@@.@@@@
@@@@...@@@@.@@.@...@@.@@@@..@@.@@.@@@@.@.@@..@@.@.@.@.@.@@@@....@..@@@@.@@@@@@@@@@@...@@.@.@.@@@@@@.....@@@@@@.@@@@@@.@.@..@@@@@.@...@@..@@@
@..@.@@@...@@@@.@@@@@@.@@@.@.@@@..@...@.@@@@@.@.@@@@@@@@@@..@@@@..@@@.@@@@@@@@@@@@@@.@@@@@@@@@@@@..@@.@...@@.@@@..@@@@.@@@@@...@.@@@.@@..@@.
.@..@@..@..@@@@.@.@@.@@@@@.@@...@@@.@..@@@@@@@@..@..@@@@@@@.@@@@@@@@@@@.@@@@@@.@@..@@@@.@.@@.@@..@.@@@@.@@@.@@@@...@@@.@.@@@....@@@.@.@@@@@@
@@@@.@.@.@@@@@@@@.@@@@@.@@...@@@@@.@@.@@...@@@@@@..@@@@@@@.@..@...@@@.@.@.@@@...@@@.@..@@.@@@@...@@@@@..@@..@@@.@@@.@.@.@@@@@@@@.@.@@@@@@@..
.@@..@@..@@@@@@@@@@.@.@@@..@@@@@..@@.@@.@.@.@.@@@@.@@@@@@......@.@@@.@..@@....@.@.@@@@..@.@.@@@@@@@..@@@@..@@@@@.@@..@@.@.@@@.@..@.@@@@...@@
.@.@@.@@@@@....@@@@...@@@@@.@@@.@.@@@@@@@...@.@@@@@@.@@@@@@.@@@@@.@..@.@@.@@..@.@...@@@.@..@@@..@..@.@...@@......@.@.@@@@@@..@@@@@@@.@@..@.@
.@@.@@..@@@.....@.@@..@.@@@@.@.@@@@@.@@@@...@@@@.@.@...@.@@.@@.@......@.@@.@.@@..@@..@.@@@@.@@@.@..@.@@@@.@@@@.@@@@@@@@@.@@.@@.@@@@@@@@@@@.@
@@@@.@@.@@@@.@@@..@@@@@@@@.@@@.@@@@@@@@@@....@@.@.@@.@@.@.@.@@@@.@@.@.@@@@..@@.@....@@@@@.@@.@@.@@.@.@@@@@@.@@@@@@@@..@.@...@@..@@@@..@@@@@@
@.@.@..@@.@.@@@@.@@@.@@.@@...@@@@.@@.@.@@..@@..@@.@@.@.@.@@@@.@@.@..@@@@@@.....@@@.@.@@@@@@.@@@.@.@..@.@@@.@....@@@@@.@@@@.@@.@@@.@....@.@@.
@@.@.@@@.@@@.@@.@.@@@@@@@.@@.@@.@@.@.@.@..@@@@@@.@@@.@.@@@.@...@@@@@.@.@@.@.@...@@@@.@@.@@.@.....@.@@....@@.@..@@@@@@@@@.@.@@@@....@@@@.@.@@
@@@@@.@.@.@..@.....@@@@@@.@.@..@.@.@@@..@@@@@@@@@@.@@.@@..@.@@@@@.@@@@@@@@@@..@@.@@@@.@@.@@.@@@.@@.@@@.@@@@.@@@.@@@.@.@@@@..@@@.@.@@@.@..@@@
..@..@@@@@@@@....@@@...@@@@..@@...@@.@@@@@@....@.@@@@@@@..@@@@..@@@@@@.@@@.@.@@.@@@@@@@@@@...@.@.@@...@.@@@..@..@.@.@@@@@.@@.@@.@@....@@@.@@
@@.@.@.@@@@@@..@@.@.@@.@@.@@@..@@@@@@@@.@.@@@@@@.@@.@@...@...@@..@..@@@@...@.@@@@.@@@@@.@@.@@@@@..@.@.@.@@.@@@@@.@@@.@@.@.@.@..@..@@.@@..@@@
@@@@.@@@@..@.@@@@@@@@.@.@..@..@.@...@.@@@@@@@@.@@..@@@@@.@@@@.@...@.@.@@@@..@.@@@.@@@.@@..@@@@@..@@@@..@@@@@@@...@..@.@.@@.@@.@@.@@...@@@..@
@@@.@@@@@@@@@.@@@@@.@@@@@@@@@@.@@@@.@@.@....@.@.@.@@@.@..@@.@@.@....@@.@@@...@.@..@.@@@@@.@@@@.@@.@@@@@@.@@@..@.@@..@@@.@@.@@@.@.@.@@@@.@@@@
.@@@@@....@.@@@@@@@@..@.@@.@.@.@.@@.@@@...@.@@@@@@@..@@@.....@@....@@@@@.@@.@..@@@.@@@.@@.@@@@@@@...@.@..@@@@@@@@@@@@@@.@@@@@..@@@@..@@@@.@@
@@@@@@@.@@@@.@@@@.@@.@@@.@..@@.@@@@@.@.@@@@@@.@..@.@.@...@@@..@.@...@.@@.@@@.@@...@@..@...@@@.@.@..@@@.@@@@@@@@@@.@.@..@@.@.@@@@@.@@@..@@@..
@@@.@..@@@@@...@..@@@.@@@@.@@.@.@@@@@@..@@.@.@.@@.@@@@@@.@...@@@..@.@@@.@@@@@.@@@.@@@....@.@@.@.@@@@.@.@@@@.@@..@@@.@.@@.@@..@@@@@..@@@...@@
+69
View File
@@ -0,0 +1,69 @@
INPUT_FILE = "input.txt"
# True for roll of paper
floor: list[list[bool]] = [ [ c == '@' for c in line.strip() ] for line in open(INPUT_FILE, 'r').readlines() ]
class iVec2d:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
max_y = len(floor)
max_x = len(floor[0])
min_y = 0
min_x = 0
def count_neighbors(floor: list[list[bool]], pos: iVec2d) -> int:
DIRECTIONS = [
iVec2d(-1, -1),
iVec2d(0, -1),
iVec2d(1, -1),
iVec2d(-1, 0),
iVec2d(1, 0),
iVec2d(-1, 1),
iVec2d(0, 1),
iVec2d(1, 1)
]
neighbors = 0
for direction in DIRECTIONS:
dx, dy = direction.x, direction.y
new_x = pos.x + dx
new_y = pos.y + dy
if new_x >= max_x or new_x < min_x:
continue
if new_y >= max_y or new_y < min_y:
continue
if floor[new_y][new_x]:
neighbors += 1
return neighbors
moveable_rolls = 0
for y in range(len(floor)):
for x in range(len(floor[0])):
pos = iVec2d(x, y)
if floor[pos.y][pos.x]:
if count_neighbors(floor, pos) < 4:
moveable_rolls += 1
print('x', end='')
else:
print('@', end='')
else:
print('.', end='')
print()
print(f'Moveable Rolls: {moveable_rolls}')
+10
View File
@@ -0,0 +1,10 @@
..@@.@@@@.
@@@.@.@.@@
@@@@@.@.@@
@.@@@@..@.
@@.@@@@.@@
.@@@@@@@.@
.@.@.@.@@@
@.@@@.@@@@
.@@@@@@@@.
@.@.@@@.@.
+140
View File
@@ -0,0 +1,140 @@
@.@.@@@@@@@@.@.@@@@@@@@@@@@@.@@@@..@@@@.@@...@@@@.@@...@@@@.@@@.@@@@@@..@.@.@@@@.@..@@..@@.@.....@@@@..@@@@@@@@@@@.@@.@.@@@@.@..@@@@..@@@.@.
.@.@@.@@@..@@@.@@..@@@@@.@.@@@@@.@@.@@.@@..@...@@@@@@@...@@..@..@@@@@@.@@@@..@..@@@@@.@.@.@.@@@@.@.@.@.@@@@@@@@...@@..@.@.@@@@@...@@..@@@@@.
.@@.@@@.@.@.@@.@@@@@@@@@@..@..@@..@@..@.@@..@@.@@.@.@@.@..@@@@@.@@@@@@@..@@@.@.@..@.@@@@@@@..@@..@@.@.@.@@.....@@@..@@.@..@@.@...@@@..@.@@@@
....@@@@@@..@@@..@@@@@.@.@.@.@@@@@@..@.@@@.@....@.@@@@@.@@.@@@@@@.@@@@@@.@@..@@@@...@@@@@@@@@@..@@.@@.@...@.@.@@@@.@.@@@@.@.@@.@@.@..@.@...@
@@.@@.@..@@@......@@.@.@@.@@.@.@..@..@@@..@..@@@@@@..@@.@@@@@@@.@.@@@..@.@.@.@.@@@@.@@...@.@@@..@@@@..@@@@@@@@@@@.@@.@@@@@@@.@@@@@..@..@..@@
@@@@@@@.@.@.@@@@@.@@@@@@@@@.@@@@@@..@@@@@@...@.@..@.@.@@@@@@@..@.@@@@@@@.@@@@@.@@@.@...@@.@..@@@@.@@@@@@..@@@@@.@@@.@....@@..@.@.@@@@@@@...@
@@.@@@@.@.@@@.@@@..@@@@@.@@@@@@@@@@.@@@@.@.@@@@@@@.@....@@@.@.@@@@.@....@@..@@@@@..@@@@..@@....@@@@.@@@..@@@@@@.@..@@.@@@@.@@@@..@@@@.@@@..@
..@@..@@@.@@..@@.@@@.@..@@@.@.@@@..@@@@@@.@.@@@@.@.@@..@@..@.@.@@@@........@@@@.@@@.@@.@@@@@.@@@.@@..@.@@.@.@@@.@@@@@.@@@.@..@@@@..@.@@.@@.@
@@.@@...@..@@@@@.@@@@.@@@.@@..@.@...@@..@@@@@..@.@@@@@@@..@@@@.@@@@@.@.@@@.@@@....@.@@@.@.@.......@@.@@@..@..@@@@@@@...@..@@.@@@@@.@@@@@..@.
...@@@@.@...@@.@.@..@@.@@@..@@.@@@..@...@@@.@..@@@@@..@@.@@..@@...@@.@..@@.@@@@@@@@.@.@.@@@@@@@@@.@...@..@@@@..@@.@..@.@@@@@@..@@.@@@@..@..@
@.@.@@@@.@.@.@.@@..@.@@@.@@@...@.@.@.@@.@@@@@@......@@.@@.@@@@@.@@.@@@@....@...@@@@.@@@@...@.@@.@.@@@@.@@@@.@....@@@.@@@@@@@@@@.@@@@.@@@@@..
@.@@@@@.@.@..@@..@...@@@.@..@.@@@@@@.@@@@@.@@.@.@.@@...@@@.@@.@.@@@...@.@.@..@.@@..@@...@@@.@.@..@@@@.@@@@..@@@@@.@.@..@..@.@.@@.@....@....@
@@@@@@@@@.@.@.....@@....@@@.@@.@@@@@.@@.@.@@@@@..@..@@.@...@.@.@@@.@.@@@@@@..@@.@@....@..@@.@.@@@@.@@.@..@.@@@@.@@.@@@..@@.@@...@@..@@.@@.@.
.@@@..@..@@.@@@.@@@@.@@@.@..@@.@@@..@@@@.@@@@.@.@@@@@@@@@.@.@@@@.@@@.....@@@@@.@@@@@@@@@@@..@@..@.@@@@...@@@@.@@@@@@@...@@@@@@@@@@@.@@@....@
@@@@@..@@..@@.@@@@.@.@@@@@.@@.@@.@..@...@@@.@@.@@@@@@.@.@@@..@@@@@@@@@@.@@.@..@.@@@..@.@.@.@...@@@@@..@@@.@@@.@@@....@@.@.@..@@.@@.@@.@@..@.
@@@@@@@@.@@@@.@@@..@..@.@@..@@.@..@@@.@.@@...@@@@@.@@@..@@@@@@@@..@@@@...@.@..@.@@@@@@..@.@....@..@@@@.@@@@@@.@@@....@@.@@@@.@@@@@..@@.@..@.
@@@@.@@@.@@..@..@@@..@@@@@@@@@@@..@.@@@..@@@@..@@@@@@@@@@@@@@..@@@..@@@@@@@@@.@..@...@@@.@@.@.@......@@.@..@@@.@...@.@.@@@.@@@@...@@.@.@..@@
@@.@.@@@@@@@@.@@@..@.....@..@.@@.@@@@....@@@...@@@@@@@@@....@.@@@@..@@.@@@@@.@.@@.@@.@.@@@@@@@@@@@.@.@.@@.@@@@..@.@.@.@@@.@@@.@@.@@...@.@@@.
@..@@.@@.@@@..@@.@@@@@@.@.@@.@.@.....@..@..@@.@@.@@@@@@@@..@@.@@@@@@@.@@@@...@@@.@@..@@..@..@@@.@.....@.@@.@@@@@...@@.@@@.@@@.@@@.@@..@.@.@@
@@@@.@@@@@.@.@@.@...@.@@.@@@@@@@@@.@@@@@@.@@..@@@.@@@..@@.@.@@.@@@@@@.@@@.@..@@.@@.@@..@.@.@@@.@@@@@.@@.@...@@@.@@.@@@@@.@@..@@@@..@.@@@.@@@
.@@@@.@....@..@@@@@@.@@@.@@@.@@@@@.@..@@@@@...@@@@.@@.@@@@@@@@.@@@@.@@@.@@..@...@@..@@.@...@@@.@@@@@@...@.@@@@@@@@@..@@.@@@.@@@.@.@@@.@..@@@
@@@..@@@@.@@..@@@@..@@@.@..@....@@.@..@@.@..@@@@....@@.@.@.@.@@.@@@@@@@..@@@.@@@@..@@...@@.@@@.@@@@@....@@@@.@@..@@@.@@.@@..@@.@@.@...@@@..@
@@@@@.@@@...@.@@..@.@@.@@..@..@.@.@@..@.....@@@@..@.@@@@.@@.@@@@@@@@@.@@..@@@@@@..@@..@..@.@@@@@@..@..@....@@@@@.@@@@@@..@@@@@@@@.@@..@@.@..
.@...@@@@@@.@@@.@@@.@@@.@.@@@.@@@@@@@....@@@@@@.@..@@@.@@@@.@@@.@..@@@@.@@@..@.@.@@@@..@.@.@@...@@@.@.@@@.@.@@@@@@@.@@..@@.@.@.@.@.@@@@.@@@@
@@@.@@.@@@@@@.@@@@@..@@@.@.@..@.@@@@.@.....@@@.@......@@@.@...@@@..@@@..@@.@...@.@@@@.@.@@.@@@@@@@@.@@.@@@.@.@...@@@@..@.@.@.@@@..@@@@@@.@@@
@..@@.@@@@@@@@@@.@@..@.@.@@@@...@@..@..@@.@@@@.@.@....@.@@.@@@.@.@@.@.@.@@.@@@@@@@@@@@...@@@.@..@@.@.@@@@@@@@@@.@@.@.@@@.@@.@@@.@.@@@...@.@.
@@@@@@.@@@..@.@@@@@@.@@.@.@@@..@@@@@@@@.@.@@@@.@@@@@@@.@@@.@@@@@@..@@@@.@.@@@@@..@@@@@@@@@@.@.@@.@...@@.@@...@@@@.@@.@.@.@@@@@.@@@.@....@@@@
.@@@@@@...@@.@.@@@.@@@..@.@@@@@@@@..@.@@@@@@@@....@@@@@@@.@@.@@@@@@@..@@....@@@@@@@...@..@.@...@@.@@@.@@@@.@.@@@.@.@@@@@@@.@@@@@@@@@@@.@@@@@
@..@@@@.@@@@@.....@@.@@.@@@@@@.@..@.@@.@@.@@@@@.@@@@@@@...@.@.@........@..@@..@.@@@.@.@@.@@@.@@@.@.@.@@@.@..@@@@@..@@..@@.@.@@..@.@@.@@@.@@@
...@.@@@.@@.@.@....@@@@@..@..@@@..@@@@@..@..@@@.@...@.@@.@@.@.@@..@.@@@...@.@@@@...@.@..@@.@@.@@@.@..@@.@@.@@.@@..@@.@.@.@.@.@@@@@@@@@...@@.
...@.@.@.@.@..@@@..@.@@...@@@@@@@@@@.@..@..@.@@.@.@@@@.@@@@@..@.@.@@@...@@..@@@@......@@@.@@@@.@@.@@...@@@@@@@@@@@@@@.@.@@.@@@@.@@..@.....@@
@.@.@.@@@...@@.@@@@@....@@.@.@.@@.@@@@.@@@@..@@.@@@@.@@.@@@@@.@@@.@@@@@@.@@@.@@.@.@...@.@.@.@@@.@@..@@@.@@..@@@.@@@..@..@@@@..@@.@..@.@@@@@.
@@.@@@...@@..@..@@@.@@@@.@@@@.@@@.@@@@..@@@@@@@@...@@..@@@@..@.@@.@@@@@@...@@@@@@@..@.@@.@@@...@@.@@...@@@@@.@..@@@.@@@.@@@@.@@@@..@.@@@@.@.
@..@@@@.@@.@@@@.@@@.@.@@@.@@@.@@@@..@@.@@..@@@.@....@.@.@@@@.@@@.@.@.@@.@@..@.@@.@@@@@@@@...@@@@@..@@@.@@@@@@.@@@@@@.@@.@@@.@@..@@@@@@@@@.@.
@@@...@@@.@@@@@@.@.@@@@@..@.@@.@@.@@.@.@.@@@@@@.@..@@.@@@.@..@.@@@@@@@@@.@@@@@.@@@.@.@.@@.....@@@@.@...@@@@@.@@...@@@@@@@@@@@..@.@@@.@@.@@@.
@@@@@.@..@.@@@@@@...@@@@..@@@@@.@...@@@@@.@.@@.@@@..@@@@@@@.@@@...@@.@@@.@@@.@@@@@@@@@@..@@.@.@@@.@@@@.@@@.@@@.@..@@@.@@@.@@@..@@@@@.@@@..@@
.@@@.@.@@@.@@.@@@@.@.@.@@.@@@@@@@@@@@.@@@@..@@.@@@@@@.@..@@@.@@@@@@@.@@.@...@@.@.@@@@@.@..@..@@@@..@..@@@@@@@@@..@.@@.@..@@..@@@..@@@.@@.@@.
@@@.@@..@@@@@.@@@.@@@....@@.@@@@.@..@@@..@@.@@@@@..@@@@@..@.@@@@.....@@@..@@@.@.@..@...@@@@@@@@..@@@.@.@@...@@.@...@@@@@@@@.@@@.@@@.@.@.@@@@
@@.@@..@@@@.@..@.@@@@.@@@..@@.@..@.@@@@....@@@.@..@@@@...@.@@.@@@@@@@.@.@.@@@@@.@@@..@@...@@@@@...@@@@@@@.@.@@.@@@.@.@@.@@@@@@.@.@@.@.@.@@@@
@.@@@.@@..@@..@@@@.@@.@@@@@@@@@@@.@.@@..@@@.@@..@@.@@@@.@..@@@@@...@@..@@.@.@.@.@@@@@@.@.@@........@@@.@@.@.@@@@.@.@...@@@@....@@.@@@@.@@.@@
.@@.@..@.@@@@@@@.@.@@@@.@@@@@@.@@@@@.@@@@.@@@..@.@@@..@@@@.@@@@@.@.@.@@@@@.@@@@@..@@@@@@@@@.@@..@@@@.@@@@..@@.@@.@@@@@@...@@@@@.@...@@@@@@@.
@@.@.@@@.@..@.@@.@.@@..@.@.@@@@..@@.@@......@.@@.@@@@@@@@..@@@@.@.@.@@@@@.@@@.@@@.@@.@@@...@....@....@@@@@@....@.@@@@@.@@..@@...@@@@@@..@@.@
@.@@.@@@@...@@@.@@.@.@.@@.@@.@@@@..@@@@.@@@.@@@@@@@@.@.@@@@@@@@@@@@@@.@.@@@.@@.@@.@@.@@@@@@@.@@@@...@@@.@@...@@@@@@.@.@.@.@@.@@@@.@@@.@.@@@@
@@.@.@@.@..@.@@..@..@@@@.@@@@@.@@.@.@@@.@@@.@@..@@@@...@@@@.@@..@.@@.@@@@.@@@.@@@..@@.@.@@.@..@@....@.@@@.@@@@@@.@@.@@@.@@@..@.@.@@...@@@@..
.@@@..@@@..@.@.@@@@@.@..@@@..@@@.@@@@@.@.@..@@...@.@@@@.@@@@@@@@@.@@@..@@@@@@@@@@@@.@@@@..@@@..@..@@@@@@@@..@@@@@..@@..@@..@@@@..@@@@.@@.@@.
@@.@....@@@@@@@@..@.@@@@@@@.@@.@@@@..@@@@.@@..@..@@.@@@@..@@@@..@@...@@@@@.@@@@@@@@@..@@@@@.@@@.@@@.@..@@.@.....@@@@@.@@@@@.@@@.@@.@@@@@@@@.
.@@@.@.@..@@.@@...@.@.@.@.@.@@@@@@.@@@@@.@@@.....@@@@.@.@..@@@.@@@@@@@@.@@@@@@..@.@..@@@.@@@@@..@@@@@...@@@@@.@@@.@...@@..@@@@@@@@@@.@@@.@.@
@..@@@@..@@..@.@@..@@@@@@@@@.@.@@.@@.@@@@@.@@@@@@@@@..@@.@@@@@@.@@@@@@..@@@.@..@@@@@@@@...@@@..@@..@@@@.@.@@@@@@....@....@@@...@@.@@@@@@@@.@
@@@.@@@@@@.@@@.@@.@.@@.@.@..@@@@..@@@@..@@@.@.@.@@@@@@.@.@.@@@@.@...@.@@@.@.@@@@.@@.@@@@@@.@@@.@@.@@@@.@@.@@@@@@@@@@....@@.@@.@.@@.@@@@@@@..
@@.@@.@@@....@@.@@.@@@@@@..@@@..@@@...@..@@@@@..@.@.@.@@@@@@@.@@.@@@.@@..@@@@.@..@@@.@@@@@.@.....@..@@@@@.@..@@.@@..@..@@@..@@@@@@@...@@@@@@
@@@....@@@@@@@.@@@@@@@@@...@@.@..@.@@@@@..@..@@@@.@@@@@@.@@.@.@.@.@.@@@@.@@.@.@@@@@.@@@..@@@....@..@.@.@@.@.@.....@@@@@.@@@@.@.@@@@.@.@.@...
@@@.@.@@.@@@@....@@@@.....@.@@@..@@.@.@.@...@@@@.@@@@@@@.@@@@@.@..@.@.@.@@@.@@@@@..@@@@@.@@.@.@.@.@.@@..@.@.@@@@@@@..@...@..@@.@@@@@...@.@@@
@@@@@@@@.@@@@@@@.@@@@@@@@@@@@.@@@@@@.@..@.@.@@..@@.@@.....@@@.@.@@@.@.@@.@..@@@.@.@@.@@@@..@@.@@@....@@@@.@@..@@@.@@@@@@@.@@@@...@@@@...@.@@
.@@@@@@@@@.@@@@@@@..@@@@@@@@.@@@@@@@.@@@@@@@...@@@.@@@.@@.@@@.@..@@@..@@@.@..@@@@@@.@@@..@@@@@.@@@@@@@@.@@..@@@@@.@@@.@.@.@@@....@.@..@..@@@
@@...@@@@@..@..@@.@@..@@.@@..@@.@.@@@@@@.@@@@.@@@...@@..@@@@@@@@@@@..@@@.@@@@..@@..@@@@@@@@.@@.@.@@..@@@@@@.@@..@@.@.@@@@@..@@@@@@..@@..@@.@
@.@@@@@.@.@@@@@.@@.....@@@.@.@@@.@@@..@@@@.....@.@..@@@...@..@@.@@..@@@....@@.@.@@@@@@@@@@@@@@@..@@.@..@.@@@@@@@.@@..@.@.@@@@@@@@@@@.@@@@.@.
...@.@.@@@@@@.@@@..@@..@@@...@@..@.@..@@@@@@@@@.@@..@@..@@@@@.@.@@.@@@@@@@.@@@@@@@@.@..@.@..@@@@@@.@@@@@@.@.@@.@..@@@.@@@@@@@@@@@@@@@@.@@@@@
.@@@..@@.@..@@@..@..@@@@..@..@@@@@@@@@@@@@@.@@@.@@@@.@@@@@.@@@....@.@@@@.@.@@@@.@.@.@.@@.@@@@.@@..@..@@@@@@...@@..@.@..@@@@.@.@@@@..@..@@@@.
@@..@..@..@@@@@.@@@....@@.@..@.@.@...@.@@.@@.@@@.@@.@@@@...@@..@@@.@@@@@@@@..@@@.@@@@@@.@@.@@.@@@@@@@.@@@@@.@@...@@@@@..@@@@@@@.@@@@...@@@@.
.@@.@@..@@@@@@..@@@@@@@@@..@...@.@@..@.@....@.@@@@.@@@....@..@...@@@@@.@..@.@.@@@.@@@@@..@@.@@@@@...@..@.@@...@@.@@@@@@@@.@@.@@@@.@.@..@....
..@@.@..@@@.@@.@.@@..@.@@..@...@..@@.@@@@@@@@@@@@.@.....@.@@@.@@@@@...@@.@@@.@.@@@@@@.@@.@......@@.@@@..@....@@@@..@..@...@.@@@.@....@@@@@@.
@@@@.@@.@.@@...@@.@..@@@@.@@...@.@@@@@.@@@..@.@.@....@@@@.@@@@@.@@@@@@@@@..@@@.@.@..@@.@@@@@@.@.@.@.@.@.@.@@.@@@.@@@@@@.@@.@.@@.@@...@@@@.@@
@@@@.@.@.@@@.@@..@.@@@.@@..@@@@.@.@@@@@@.@..@.@.@...@@.@@@.@.@@@@@@.@@.@.@.@.@@@@.@@@....@@@@@.@@.@@@@@.@@@@.@@@@@..@.@..@.@@@@..@@@..@@@.@@
...@.@.@@.@@.@@.@@@.@@@..@@@@@@@@@.@@@@@@@@..@...@..@@..@.@@@@..@@@@@@.@@@@@@@@@@@@...@@.@..@@@...@..@@@@..@..@@@@@@@@..@.@@@.@@@.@@@@@@@@@@
@.@.@@@.@@.@.@@@@@.@@@@@@@@@@@..@.@@@@@.@.@.@@@@@@@@..@.@.@@...@@.@@.@@.@@@.@@@@@.@@@.@.@@.@..@.@@@@.@@...@.@.@@.@..@....@..@@@@@@.@@.@@@@@@
..@.@@.@@@.@@..@@.@@.@@..@@.@@@@@@.@@...@@..@@@@...@.@@@.@@@@@@@@@...@@@.@@@@@...@@.@@..@@..@..@.@.@.@@@@.@@.@..@@@@@@..@@@@@@@@@@@@@@@@@@@@
.@@.@@.@...@@....@@.@.@@..@.@.@@.@@@@..@@@@@@...@@@@@.@....@@.@..@@@..@@.@....@@.@@@.@....@@@.@.@@@@.@..@.@.@@@@.@@...@.@.@@@@....@@.@@.@.@@
...@@@@.@@@@.@@@.@...@..@@.@@@@.@@@@@..@.@@@@@@@....@....@.....@.@@.@.@@@@@.@@..@@@...@@@@.@@..@@..@.@@.@.@@.@.@@.@..@@@@@.@..@@.@@@.@@@@@@@
@@.@@@..@@@.@@@..@@@.@..@@@@@@.@@@@.@@@@@@..@.@.@.@@..@@@@.@@@.@@.@@@@.@@@@@@@..@@@@@@@@..@...@@@@@@.@@@....@@@@.@@@@@.@@@.@@@@@@@@.@@...@@@
..@.@@@@..@@....@@@.@@.....@@@@@@@@.@..@.@..@@...@.@..@@@.@@@.@...@@...@@@@.@.@@.@@@...@..@@@.@..@.@@@@@.@@...@@@..@..@@@..@@.@@@@@@..@@@@@@
.@...@.@@..@@@.@.@@.@@...@.@@@@.@@@@@@..@@.@@@@....@..@.@@.@@.@@.@@@.@.@@@@.@.@@..@@@@@..@.@@.@.@@.@@@@...@@...@.@.@@@.@@@.@@.@@@@@@@.@@@@@.
@@..@@@@@.@...@..@..@@@..@@@.@@@@..@.@@.@@@@.@@.@@@@...@..@@@@@@@@@@.@@@@@@.....@@....@@...@@@@@..@@@.@@@@@@@@.@@@...@.@@.@@..@.@..@.@@@@@@@
.@..@@..@...@@.@@@.@.@..@@..@.@.@.@..@@@@@@..@..@..@@@@@@.@@.....@.@@@@@@@.@.@.@@.@@@@...@@@@@@.@.@@.@@@@@.@..@@.@.@@@@@@@@@@@@..@@@@.@.@.@.
@...@@@@@...@@@@@@.@@.@...@.@@@@@@@@@@..@.@@@..@@.@@@..@@@@@@..@@@@@.@@..@@@@@@@@.@@@@@@@.@.@@@@.@@@@@@@...@@@@@@.@.@.@@@@..@@..@.@.@@@@@@.@
.@..@@.@@.@@@.@@.@@...@@@.@..@.@@.@@@..@@..@@@.@..@@@@@.@.@@..@.@..@...@...@...@@.@.@.@.@@.@@.@@.@@@@..@@@..@@.@@.....@@@@.@...@@.@...@.@@..
@@.@@.@@.@@@@@@@.@@.@..@@@@@@@.@...@.@@@..@@..@@.@@@@..@@@@@@.@@@@@.@@@@@@@.@.@.@.@.@.@.@.@@@@@@@..@@@.@@@.@@.@.@@@..@@@.@@@.@@@@.@@@@.@.@..
@@.@..@@@..@..@.@@@.@@@@@@.@.@@@@@@@@@..@@.@@@@.@.@.@@.@@.@@@@@@..@...@.@@@@@@@@@@@@.......@@@..@...@@@@@@@..@.@@@@@@@@@....@@@@@@@@@@.@@...
..@.@@@.@@..@@...@.@@@@...@.@@@@..@@@.@..@.@...@@@.@@.@@@@@.@.@@.@@@.@@.@@@@@.@@@.@@.@@@..@.@..@@@@@@@..@@@@@...@....@.@@.@@@..@@@@.@@.@@@@@
@@@.@.@.@@@@@@@@@@@...@..@@@@...@@@@@.@...@@@@@@.@@@..@@@@..@@@@@@@@@@@@@@@@.@@@..@@.@@@@...@..@......@.....@@@.@@@@@@@@@.@@@..@@@@@.@@@.@.@
@.@.@@.@@.@.@..@.@@.@@@@@..@..@@@@@@.@@@@.@@@@@.@@@@@@..@@@..@@@@@@.@.@@....@..@@@.@@@..@@@@...@@.@@@@@@@@.@@.@.@.@.@@.@.@.@.@@@@@@@..@@@..@
@@@@@@@..@.@@@.@@.@..@@....@.@@.@@.@@@.....@@@@@@@.@@.@.@@..@@@@@@@...@...@.@@@@@..@@@@@@.@@@@.@@...@@@...@@@@@@.@@@@.@.@@.@....@@@.@@@@@...
@....@@.@.@.@...@@@..@.@@@.@@@@@.@@@.@...@@.@@.@@..@.@....@.@@.@.@.@.@.@@.@@@@.@@.@@..@@@@@@@@@..@.@@@.@@.@.@@@@@@@@@@@@.@.@...@..@.@@@..@@@
.@@.@@....@@@.@@@..@.@.@..@.@@..@..@@.@@..@.@@@@@@.@@.@@@@@.@...@@@@@.....@@@....@.@@.@@@@@@.@@@@...@@.@@.@@.@@@@@@@@@.@@@@...@@.@.@@.@@@.@@
..@@@.@@@.@@@..@@...@@@@@@@@@@.@.@@@@@...@@.@@@@@.@@@..@.@...@@.@@.@@.@@.@@@@@.@.@@@..@@@..@@.@.@..@@@..@@@@.@@@@@@...@@.@@.@.@..@@.@@@.@@@.
.@@@.@@@@@@.@@@@@@.@@.@..@.@@@..@@.@@@@.@@@.....@@.@@.@.@.@@@.@@..@@@@@@.@@.@@...@.@@@@@@@.@@@..@.@@..@@@@..@.@@@.@@@@@@@@@.@@@@.@@@@.@@@@@.
@@.@@@.@@@@.@@.@@@@.@@@..@@@@@@@.@...@@.@@..@@@@@.@@@@@@.@...@@.@@.@@@@@.@@@.@@@@@@..@.@@@@@@@@@.@@@.@@.@.@.@@@.....@..@@.@@.@@...@.@..@..@@
.@@...@@@@.@@.@@@@@@@.....@@@@@@.@.@.@.@@@@@@@@...@.@.@.@@.@@.@.@.@@.@@@@.@@.@.@@@@@..@@@@...@@@@@.@@@@@.@..@@@.@@@@@..@@@@@@.@@@..@.@@...@.
@@@@@@@@@.@@@@@.@@@@..@.@@@@@@@....@@@@......@.@.@.@@@.@.@.@@@.@.@@.@@.@@@@.@@..@..@@@@@@.@@@.@@@@@@@@@@@@..@@@.@@...@..@.@.@.@..@@.@@.@@.@@
@@....@@@...@@@@..@.@.@.@@@...@@@.....@@......@.@@.@@@..@@@@@@.@@...@.@@@@@@@@.@....@@..@...@.@@...@@@@@@..@@.@@.@@@.@.@@.@.@.@....@..@@.@@.
@.@...@@@..@@@@@@@@...@...@@@@.@@@@...@..@.@.@@.@@@@@.@@@@@.@@.@@.@..@@.@@..@@....@@.@@@@@.@@@@@@@..@@@@@..@.@@.@@@.@@.....@@@@.@.@.@@.@@@@@
@@@@.@@..@.@.@....@@@@.@@.@@...@@..@@@@@@.@@.@..@@@@@.@@@..@@@.@@@..@@@@@@..@@..@@...@@@..@@@.@@.@@..@@.@@@@....@......@.@@@.@@@@@.@@.@@..@@
@@@@@.@@.@@@@.@..@@..@...@@@@.@@..@@@@@.@@.@@@@@.......@@..@@@@@@@..@.@.@@.@@@@@@@.....@.@@@.@@@@@.@...@@.@@@@@.@@@.@@@@@@@.@@@.@...@.@.@...
.@@..@@.@@..@@@.@@..@@.@@@.@.@.@@@..@..@@@.@@@@@.@.@.@.@.@.@@@..@@..@@.@...@@@..@...@@@.@@@@.@@@@@...@@@..@.@@.@.@.@@.@@@@@@.@@@.@.@@.@.@.@@
.@@...@@....@@@@@@.@....@@@@@.@.@.@@.@@@@.@.@@@@@.@@@@@@@@....@@@.@.@@...@@@@@.@@@@@@.@..@@.@@.@@@@@@@@..@@.@.@@@..@@@@@@@@.@@..@@@.@@@.@@.@
.@.@@@.@@@.@.@@...@..@@@@@@...@@@@..@@@@@@@@.@.@@.@@@.@.@@@@..@.@@.@@@@@.@@@@@.@@@@..@@@@@@@@.@@.@@@.@..@@@@@.@@..@@..@.@@@@.@..@.@..@@.....
...@@..@@.@@@.@.@@@@@@@@@..@@@@@@..@.@@@@......@...@.@...@.@@@.@@....@@.....@@.@@..@..@@@@...@..@@..@@..@@.@.@@@.@.@.@@.@.@@.@..@@..@@..@@@@
.@@@@@@@.@.@@@@@@@@.@@@@@@..@@....@.@@@@@...@@@@@.@.@.@@..@@@@@..@@@@@@@.@@.@@.@@@...@@.@.@@@@.@@@@@.....@..@.@@.@@.@.@..@@@.@.@.@..@@..@@@.
@@@@@@@@..@@.@@.@.@@@@@@.@@.@@@@@.@...@@@@...@.....@@@....@@.@@@@@@@..@@@.@@@@@....@@..@@.@@@@.@@.@@@@@@@.@...@@.@@@.@.@@@@@@.@...@...@@.@@.
@@.@.@@@..@@@.@.@@.@@@.@...@@..@@@.@.@.@@@.@.@...@@.@@@@@@@.@@.@@@@@..@@@@.@@@.@@@.@@@@@@@..@.@@.@@.@..@@@@@.@..@.@..@@@....@..@..@@@@.@@..@
@.@@@.@@@.@...@@@.@@@@@@@.@@@.@...@.@@@@...@@@@@.@@@@@@@@@@..@@@@@.@@@@.@@@.@@.@@.@..@@.@@@@@.@@@.@@@@@.@@.@@@.@.@.@.@.@.@@@@...@..@@@@@..@@
...@@@@@.@.@.@@@@......@..@.@@@@@@@.@@@@@@.@@@.@..@@@..@.@@@.@.@@@@@@@.@.@@@@..@@.@@@@@@@@@@..@@@@@@@@..@..@..@@@@...@@@..@..@.@@.@@.@.@.@@.
@...@.@@@.@@.@@..@@.@@...@@@.@.@@.@@@@.@..@@@@@@@@@.@.@@.@@@@@@.@@.@.@@..@@@..@@@@..@@....@.@@@.@@@..@@@.@..@@@@@@@@@@.@.@@@.@....@@@@.@@@.@
@@@.@.@@@@@..@.@.@.@@.@..@@...@@@@..@@.@....@@.@.@@@@.@@.@@@.@@.@.@@.@.@.@.@@..@@..@@@@@@@@@.@@@@@@.@@@@@..@@.@@.@@@.@@.@.@@@@.@..@@.@@.....
.....@@@@@@..@@..@....@@@@@@@..@@@@..@.@.@.@@.@....@@@@@.@@...@..@@.@.@..@@@..@.@@@@...@@@.@@@@@@@@@@@@.@.@@@.@.@@@..@@@@.@.@@.@@@@....@@@@.
....@@.@.@.@@@..@@@.@@@@@@@@@.@..@.@.@@@.@...@@@@.@@.@.@@.@..@..@@@@@@@...@@@...@.@@.@@@@@@@..@@@@@@@.@@.@@@@@@.@....@.@@.@.@@.@@@@.@@@@...@
.@@@.@@@@@@..@.@@@@.@@.@.@@@.@@@@@@@@.@@@@@@@@@@@.@@..@@@@@...@@@@@@@@@.@@@@@@@.@..@@@@@.@@@@@@@@@@@....@@@.@@@.@@@@@@.@@@.@@@.....@@@.@@@.@
.....@@@@.@@.@..@@@@@@@@.@@@@.@@@@..@@@@.@@@..@.@@@.@@.@.@@.@@@@..@@@..@@@@@@...@@@.@..@@...@@@.@@@@@.@@..@..@.@@@@@.@@.@@.@..@....@@.@..@.@
.@.@.@@.@@@.@@.@.@@@@@......@@@....@...@.@@@@..@@@..@.@.@@@.@.@@.@@@.@..@.@@@.@@...@.@@.@.@.@@@@@@..@@@@@@@.@@.@@@.@.@..@@@@..@@@.@@.@..@.@.
@.@.@@@@.@.....@@..@.@@@.@.@..@@@.@.@..@.@@@@@@@.@@@@@..@@..@@@@@.@@...@@.@@@.@@.@.@@@@@@@@@@@@...@@@.@@@@@.@@@@@@.@@.@@@@@@..@.@@@...@@@@..
@@@@@.@.@.@.@@@@@@@.@.@@@@..@@@@.@@.@@...@@.@@...@@@.@@.@.@@@@@.@@@@@@@..@@@@@@..@@.@@.@.@@.@.@@@@@@@@.@@@@...@@..@@@.@..@..@@.@..@@@..@@@@.
.@.@.@.@@@@@@@@@.@@.@@.@@@.@@@@@..@.@..@@@.@@@..@@.@@.@@@....@@@@@....@@@@@.@@@@@@@@.@@.@..@@.@...@.@.@.@@..@@.@.@.@@@.@@.@@@@@..@@@.@@@@@..
@@@.@@.@@@.@@@@@..@@@@.@@@.@@@@@.@@..@@.@.@..@@.@@.@@.@@..@@@@@@.@@@@@.@.@.@..@@@.@@@....@@.@@..@@@@@@@@@@.@.@@@@@@...@.@@..@@@@..@@@@.@.@@@
.@@@..@@@.@.@@@@@@.@.@@@@.@@@@@@.@@@@@.@@@@@@.@@@@.@@.@@@@@@@@@@@@@@@@@@@.@@@..@@@@@@..@..@@.@@@@@@@..@....@@..@.@@.@@.@@..@@@.@.@@..@@..@@.
@@@.@.@@@@.@@@@@@.@@.@.@@..@@@..@@@..@.@.@.@@@@@@@@@@@@..@@@@@@@@@@@.@@@@@@..@.@@@@....@@@@@@...@@.@@@.@.@@@@.@.@.@@.@@@@@....@@@@..@@.@@@@@
.@@@@@@@@@.@.@@.@.@.@@..@@@.@..@@@.@@@@@.@@@..@@@..@@@@@@@@@@@@.@@@.@@@@@@...@@.@@...@@@@.@....@..@@..@@.@@@.@@@.@..@.@@@@.@.@@@@.@....@@@@@
@.@@.@@@@@.@@.@@@@@@@@@@..@@@@@@@@..@.@..@@@@.@.@.@@@@@@.@@@@@..@.@@@..@@@@.@@.@.@@@@.@.@@@@@@@@.@@@.@@@@@.@@@...@@@@....@.@@.@.@...@..@.@@@
..@@...@@@@@@@.@.@@..@@@@@@@....@@.@@..@..@@@.@..@@.@.@@@@@@@@@@...@...@@@@@@@.@.@@@@@@.@....@@@@......@@@.@@...@@@@@@..@@@@@@@@@@.@@@@@@@..
@@.@@..@@@@@@@@.@.@@.@@@.@.@@@@@@@.@@@@@@@.@@.@..@@@.@...@.@@@@...@..@@...@@@@@@.@@@@@.@@@..@@@@.@@@@@@...@@@.@.@..@..@@@@@.@.@.@.@@..@@@...
@@.@@@@.@.@.@@.@.@.@...@@@..@..@@@@@.@...@@@@.@.@@.@@..@@@..@@...@@@..@@@..@@@.@@.@.@.@.@.@@@@@..@@@@..@@@@@@..@@@@@@@@@@.@.@..@@@.@@@..@.@.
...@@@@@@@@@@@.@..@@...@@@@@@@@.@@@.@@@.@.@@@@.@@...@.@@..@@@@@..@.@@@..@.@@@@@.@..@@.@@@@@@@.@@@@@@@..@@@@.@...@.@@@@@@..@.@@@@@@@.@..@.@@.
..@@.@@@.@.@.@@@.@@.@.@.@@@.@@@@@@@.@@..@..@@@@@@@@.@@.@@@..@@..@@@@@.@@@@.@.@.@@@..@..@@...@...@@@@.....@@@.@.@.@..@.@@@@@@@@@@...@..@@@@@@
@@...@@@@@@@@.@@@@.@.....@@@@@@@@.@@...@@@@@.@@@..@....@@....@.@@.@@@.@.@@@@@@..@...@..@@.@@@@@@@@@@@@@@...@@@@@@.@@@@@@@.@@.@.@@@.@@@@.@@@@
@@@@...@@@@.@@.@...@@.@@@@..@@.@@.@@@@.@.@@..@@.@.@.@.@.@@@@....@..@@@@.@@@@@@@@@@@...@@.@.@.@@@@@@.....@@@@@@.@@@@@@.@.@..@@@@@.@...@@..@@@
@..@.@@@...@@@@.@@@@@@.@@@.@.@@@..@...@.@@@@@.@.@@@@@@@@@@..@@@@..@@@.@@@@@@@@@@@@@@.@@@@@@@@@@@@..@@.@...@@.@@@..@@@@.@@@@@...@.@@@.@@..@@.
.@..@@..@..@@@@.@.@@.@@@@@.@@...@@@.@..@@@@@@@@..@..@@@@@@@.@@@@@@@@@@@.@@@@@@.@@..@@@@.@.@@.@@..@.@@@@.@@@.@@@@...@@@.@.@@@....@@@.@.@@@@@@
@@@@.@.@.@@@@@@@@.@@@@@.@@...@@@@@.@@.@@...@@@@@@..@@@@@@@.@..@...@@@.@.@.@@@...@@@.@..@@.@@@@...@@@@@..@@..@@@.@@@.@.@.@@@@@@@@.@.@@@@@@@..
.@@..@@..@@@@@@@@@@.@.@@@..@@@@@..@@.@@.@.@.@.@@@@.@@@@@@......@.@@@.@..@@....@.@.@@@@..@.@.@@@@@@@..@@@@..@@@@@.@@..@@.@.@@@.@..@.@@@@...@@
.@.@@.@@@@@....@@@@...@@@@@.@@@.@.@@@@@@@...@.@@@@@@.@@@@@@.@@@@@.@..@.@@.@@..@.@...@@@.@..@@@..@..@.@...@@......@.@.@@@@@@..@@@@@@@.@@..@.@
.@@.@@..@@@.....@.@@..@.@@@@.@.@@@@@.@@@@...@@@@.@.@...@.@@.@@.@......@.@@.@.@@..@@..@.@@@@.@@@.@..@.@@@@.@@@@.@@@@@@@@@.@@.@@.@@@@@@@@@@@.@
@@@@.@@.@@@@.@@@..@@@@@@@@.@@@.@@@@@@@@@@....@@.@.@@.@@.@.@.@@@@.@@.@.@@@@..@@.@....@@@@@.@@.@@.@@.@.@@@@@@.@@@@@@@@..@.@...@@..@@@@..@@@@@@
@.@.@..@@.@.@@@@.@@@.@@.@@...@@@@.@@.@.@@..@@..@@.@@.@.@.@@@@.@@.@..@@@@@@.....@@@.@.@@@@@@.@@@.@.@..@.@@@.@....@@@@@.@@@@.@@.@@@.@....@.@@.
@@.@.@@@.@@@.@@.@.@@@@@@@.@@.@@.@@.@.@.@..@@@@@@.@@@.@.@@@.@...@@@@@.@.@@.@.@...@@@@.@@.@@.@.....@.@@....@@.@..@@@@@@@@@.@.@@@@....@@@@.@.@@
@@@@@.@.@.@..@.....@@@@@@.@.@..@.@.@@@..@@@@@@@@@@.@@.@@..@.@@@@@.@@@@@@@@@@..@@.@@@@.@@.@@.@@@.@@.@@@.@@@@.@@@.@@@.@.@@@@..@@@.@.@@@.@..@@@
..@..@@@@@@@@....@@@...@@@@..@@...@@.@@@@@@....@.@@@@@@@..@@@@..@@@@@@.@@@.@.@@.@@@@@@@@@@...@.@.@@...@.@@@..@..@.@.@@@@@.@@.@@.@@....@@@.@@
@@.@.@.@@@@@@..@@.@.@@.@@.@@@..@@@@@@@@.@.@@@@@@.@@.@@...@...@@..@..@@@@...@.@@@@.@@@@@.@@.@@@@@..@.@.@.@@.@@@@@.@@@.@@.@.@.@..@..@@.@@..@@@
@@@@.@@@@..@.@@@@@@@@.@.@..@..@.@...@.@@@@@@@@.@@..@@@@@.@@@@.@...@.@.@@@@..@.@@@.@@@.@@..@@@@@..@@@@..@@@@@@@...@..@.@.@@.@@.@@.@@...@@@..@
@@@.@@@@@@@@@.@@@@@.@@@@@@@@@@.@@@@.@@.@....@.@.@.@@@.@..@@.@@.@....@@.@@@...@.@..@.@@@@@.@@@@.@@.@@@@@@.@@@..@.@@..@@@.@@.@@@.@.@.@@@@.@@@@
.@@@@@....@.@@@@@@@@..@.@@.@.@.@.@@.@@@...@.@@@@@@@..@@@.....@@....@@@@@.@@.@..@@@.@@@.@@.@@@@@@@...@.@..@@@@@@@@@@@@@@.@@@@@..@@@@..@@@@.@@
@@@@@@@.@@@@.@@@@.@@.@@@.@..@@.@@@@@.@.@@@@@@.@..@.@.@...@@@..@.@...@.@@.@@@.@@...@@..@...@@@.@.@..@@@.@@@@@@@@@@.@.@..@@.@.@@@@@.@@@..@@@..
@@@.@..@@@@@...@..@@@.@@@@.@@.@.@@@@@@..@@.@.@.@@.@@@@@@.@...@@@..@.@@@.@@@@@.@@@.@@@....@.@@.@.@@@@.@.@@@@.@@..@@@.@.@@.@@..@@@@@..@@@...@@
+84
View File
@@ -0,0 +1,84 @@
INPUT_FILE = "input.txt"
# True for roll of paper
floor: list[list[bool]] = [ [ c == '@' for c in line.strip() ] for line in open(INPUT_FILE, 'r').readlines() ]
buffer_floor = floor.copy()
class iVec2d:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
max_y = len(floor)
max_x = len(floor[0])
min_y = 0
min_x = 0
def count_neighbors(floor: list[list[bool]], pos: iVec2d) -> int:
DIRECTIONS = [
iVec2d(-1, -1),
iVec2d(0, -1),
iVec2d(1, -1),
iVec2d(-1, 0),
iVec2d(1, 0),
iVec2d(-1, 1),
iVec2d(0, 1),
iVec2d(1, 1)
]
neighbors = 0
for direction in DIRECTIONS:
dx, dy = direction.x, direction.y
new_x = pos.x + dx
new_y = pos.y + dy
if new_x >= max_x or new_x < min_x:
continue
if new_y >= max_y or new_y < min_y:
continue
if floor[new_y][new_x]:
neighbors += 1
return neighbors
total_moveable_rolls = 0
while True:
moveable_rolls = 0
# Count Moveable Rolls
for y in range(len(floor)):
for x in range(len(floor[0])):
pos = iVec2d(x, y)
if floor[pos.y][pos.x]:
if count_neighbors(floor, pos) < 4:
moveable_rolls += 1
print('x', end='')
buffer_floor[pos.y][pos.x] = False
else:
print('@', end='')
else:
print('.', end='')
print()
if moveable_rolls == 0:
break
total_moveable_rolls += moveable_rolls
# Swap buffers
floor = buffer_floor.copy()
print(f'Moveable Rolls: {total_moveable_rolls}')
+10
View File
@@ -0,0 +1,10 @@
..@@.@@@@.
@@@.@.@.@@
@@@@@.@.@@
@.@@@@..@.
@@.@@@@.@@
.@@@@@@@.@
.@.@.@.@@@
@.@@@.@@@@
.@@@@@@@@.
@.@.@@@.@.
File diff suppressed because it is too large. Load diff
+35
View File
@@ -0,0 +1,35 @@
class iVec2d:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
INPUT_FILE = "input.txt"
fresh_ranges: list[iVec2d] = []
available_ids: list[int] = []
# Parse data
with open(INPUT_FILE, 'r') as file:
data: str = file.read()
ranges, ids = data.split("\n\n")
for r in ranges.split("\n"):
n1, n2 = r.strip().split('-')
fresh_ranges.append(iVec2d(int(n1), int(n2)))
for ingredient_id in ids.split("\n"):
available_ids.append(int(ingredient_id.strip()))
fresh_ingredients = 0
for ingredient_id in available_ids:
for fresh_range in fresh_ranges:
if ingredient_id >= fresh_range.x and ingredient_id <= fresh_range.y:
fresh_ingredients += 1
break
print(f'Fresh Ingredients: {fresh_ingredients}')
+11
View File
@@ -0,0 +1,11 @@
3-5
10-14
16-20
12-18
1
5
8
11
17
32
File diff suppressed because it is too large. Load diff
+43
View File
@@ -0,0 +1,43 @@
INPUT_FILE = "test.txt"
fresh_ranges: list = []
fresh_ids: set[int] = set()
# Parse data
with open(INPUT_FILE, 'r') as file:
data: str = file.read()
ranges, ids = data.split("\n\n")
for r in ranges.split("\n"):
n1, n2 = r.strip().split('-')
fresh_ranges.append(range(int(n1), int(n2)))
total_fresh_ids = 0
fresh_ranges_buffer = fresh_ranges.copy()
# Filter out overlaps
for fresh_range1 in fresh_ranges:
for fresh_range2 in fresh_ranges:
if fresh_range1 == fresh_range2:
continue
if fresh_range2.start in fresh_range1 or fresh_range2.stop in fresh_range1:
print(f'{fresh_range2} in {fresh_range1}')
if fresh_range2.start in fresh_range1 and fresh_range2.stop > fresh_range1.stop:
fresh_ranges_buffer.remove(fresh_range2)
total_fresh_ids += fresh_range2.stop - fresh_range1.start
new_range = range(fresh_range1.stop, fresh_range2.stop)
fresh_ranges_buffer.append(new_range)
total = 0
# sum ranges
for r in fresh_ranges_buffer:
print(r)
total += len(fresh_ranges_buffer) + 1
print(f'Fresh Ingredients: {total}')
+13
View File
@@ -0,0 +1,13 @@
3-5
10-14
16-20
12-18
30-35
29-31
1
5
8
11
17
32
+5
View File
@@ -0,0 +1,5 @@
95 92 45 63 1 78 885 88 28 39 29 8 48 6 34 958 1 22 5 16 89 612 267 26 525 54 696 99 41 84 5 27 9 155 7 26 1 56 4 95 1 56 7 574 713 784 936 28 69 3 466 6475 165 8 9641 88 71 74 67 799 97 34 7 13 8 3 714 78 581 4 9 42 27 18 278 46 4 786 644 24 478 142 12 53 76 369 58 7117 79 9 381 918 994 54 331 731 97 72 854 757 766 157 97 6 371 58 1331 76 24 46 147 28 6 31 663 52 86 84 9116 236 821 3 9 7 639 3 65 7 627 24 42 592 35 65 139 633 25 8 3 79 69 9 76 4742 23 58 38 115 613 4485 21 1 753 2 3722 36 43 8 66 7 5 27 919 6 196 86 3 1 72 51 835 83 5715 244 94 7126 1 793 3891 673 878 57 725 69 696 49 832 28 41 5 392 868 69 25 37 9 79 19 37 4 71 7 4 29 494 351 4 63 1656 1739 37 46 65 226 54 99 8 41 14 875 392 2 3 351 239 9 1 22 7743 375 534 4 26 257 811 44 4551 66 1123 99 96 952 83 891 694 177 95 87 2 216 9 37 872 187 1 9284 57 6 895 275 494 58 822 3519 81 9 67 6 4829 8 11 741 987 17 94 867 22 72 381 89 31 147 4679 8 3 7 54 69 64 9 52 831 63 943 9 467 521 6 8 5 39 19 1 7 66 21 3 65 18 99 325 71 7 83 32 98 177 415 5 366 6434 4 7998 52 114 6 37 163 453 17 895 274 5718 47 374 581 13 488 824 456 16 2 798 92 52 12 72 289 6444 58 52 821 2 6725 63 12 745 8874 94 19 5 14 623 99 415 644 53 73 187 45 582 9677 2 348 45 77 969 24 5 798 38 5125 56 7 56 469 91 7 885 8 746 355 28 921 44 7 6 56 935 239 371 45 775 75 52 11 2954 87 581 94 7 93 74 86 87 842 959 21 5167 2641 8 84 223 72 15 74 965 72 378 4 39 8 511 4521 9 264 54 983 39 16 5171 747 693 51 616 58 263 557 8 7 661 63 63 84 631 67 863 767 9 42 8432 7 97 9 776 48 435 7888 93 2 17 78 54 493 74 6615 21 858 7 68 45 75 41 51 46 36 187 5 59 29 53 81 95 457 9974 619 8 72 6379 2 538 84 71 84 46 273 1 86 76 3 8 242 472 2 89 4 47 993 91 82 64 6 51 4 93 484 9 91 56 38 835 231 55 234 438 94 8 67 33 717 7622 85 28 6735 5 178 8189 9 31 2553 623 855 8 7213 514 23 3 382 368 6 9334 36 3 3 644 4 28 8 591 53 88 49 768 2 45 88 47 46 96 86 273 33 7 3834 17 182 21 6273 12 74 565 77 9 4 86 49 98 55 15 533 19 431 532 16 48 9 8 32 5642 52 84 38 67 95 2 522 8 51 31 46 6 34 7 8 77 439 24 4 32 2 34 324 16 56 21 183 1 412 78 5 7 67 89 4971 1 34 758 64 12 292 783 2 7 7 88 99 9824 847 442 68 6349 4 195 17 99 3 72 697 596 39 86 3 2437 8 4 215 29 578 3 2 232 317 489 51 6 44 48 6 693 71 351 97 92 2 63 66 382 11 1867 1 762 86 6721 4848 44 986 4911 883 476 1663 81 6 37 7 954 5864 1 85 5224 66 8 773 4 6 7158 67 85 9 64 187 95 7 9 32 912 5547 52 53 3 5617 79 5 763 853 188 64 6 36 45 791 18 49 41 88 5 3233 919 3 79 3 254 6 965 27 378 22 8 18 25 62 7 37 24 669 35 989 6 5468 95 457 5 32 685 42 4 7 584 86 536 98 73 63 7 354 93 631 3178 48 279 566 75 6488 2 51 33 337 189 962 24 93 98 435 75 1 39 644 172 858 88 72 926 11 2292 26 84 6 53 227 21 91 19 9 382 7 26 28 565 741 75 7 1 633 3 312 14 79 1 693 9734 2 94 6729 914 1872 4 365 559 36 154 61 1 74 639 8871 73 391 55 147 2 7 6 62 449 3975 58 868 98 474 6182 9 94 9151 41 6 758 955 42 6 5 52 713 51 45 85 8 257 46 2 2 51 12 68 56 34 79 329 559 66 3358 86 54 868 75 47 21 12 75 16 98 67 25 49 68 968 99 22 29 95 1 975 374 36 6971 13 69 127 41 1 8 998 8 4 8 4 8 9 8 63 32 5838 6291 772 666 2 5 5 9446 933 884 845 177 493 3 32 364 25 3 432 939 21 84 536 9 55 7412 9729 746 7533 654 3238 92 213 53 23 8 386 824 4 59 17 9 148 3114 39 31 85 8 729 3 5
41 29 61 65 99 57 924 77 95 69 51 265 46 1 33 326 3765 35 48 79 41 817 24 23 924 534 961 48 57 967 81 17 1 612 4 99 5125 34 73 4 4 38 5 776 686 373 651 923 283 347 113 7441 811 51 5323 14 398 79 25 8115 79 84 141 61 45 74 585 92 473 118 688 76 17 91 372 84 43 432 537 44 189 219 53 23 72 996 88 8249 33 86 941 137 69 95 721 67 53 427 366 78 133 873 16 398 693 93 2748 27 1 25 34 37 895 9358 118 15 11 88 9689 216 242 388 5 597 73 98 86 6 264 461 895 788 32 57 417 367 97 97 36 92 45 51 81 1136 52 55 28 935 13 2544 37 4 286 89 1699 81 174 44 61 6 56 62 275 49 452 48 387 86 912 79 724 53 8699 331 39 2115 978 614 9192 798 614 74 499 157 55 49 123 18 25 87 916 163 387 88 45 79 78 87 38 967 65 68 9 32 398 218 39 513 8854 6911 58 24 27 528 42 49 914 86 259 2959 87 36 58 212 823 84 2 33 3532 6219 343 8 25 925 639 85 7663 17 4651 89 661 899 93 549 58 841 233 28 43 995 241 45 2234 413 39 9368 277 13 632 344 277 81 893 4587 82 21 82 19 2835 3 47 774 371 43 91 82 734 83 194 2679 28 786 4985 145 4 77 793 85 62 8 66 531 65 845 87 811 618 776 2 53 83 642 81 2 164 23 87 52 34 88 51 71 2 69 82 42 989 664 5 8855 2139 54 5724 93 623 35 96 348 713 82 949 271 3731 22 977 812 44 218 875 19 382 96 372 12 42 47 816 534 6355 74 68 677 2 9979 21 67 874 7585 63 87 85 797 122 18 37 634 376 74 299 112 256 513 3 448 88 262 356 8187 8 413 31 8639 879 4 37 979 324 7 294 1214 322 542 74 544 96 49 1 78 494 226 73 45 147 59 15 19 1115 16 884 21 82 1 11 39 44 143 817 22 9629 1952 96 91 474 89 75 988 588 58 596 7 61 1 382 2332 27 557 244 423 513 82 2792 767 596 73 817 28 22 8538 62 9 429 764 946 89 389 35 727 428 42 28 7493 25 29 37 116 17 577 5884 629 1 31 12 672 159 49 4258 55 785 39 66 99 168 27 47 84 36 179 6 934 55 36 71 93 344 1522 792 69 17 3732 1 414 11 91 132 35 3932 76 38 86 68 29 795 579 45 68 35 26 637 68 17 97 4 43 8 236 393 9 7796 79 94 591 154 98 214 462 7325 8 43 5111 833 896 83 39 5828 66 38 173 3 51 6225 256 362 29 9114 679 61 9 433 455 23 6718 93 916 19 838 236 27 83 593 97 81 251 9865 33 23 69 29 56 58 168 443 27 3 9642 39 276 352 48 33 776 665 956 247 38 61 478 758 63 41 369 86 933 975 95 41 869 4 732 4229 44 715 59 72 34 18 584 73 895 13 478 62 52 526 2 29 288 662 65 98 719 538 296 77 22 24 422 2 3335 25 626 74 86 18 4882 58 186 282 21 325 719 33 3 86 9 33 32 1244 556 21 75 9762 37 2194 9715 14 46 119 525 913 17 72 94 4482 94 3 613 2 239 8 92 31 64 279 48 173 11 53 1 469 75 138 736 52 8 96 51 568 46 1547 67 245 88 1968 7941 41 778 9266 673 222 6481 48 4 71 4 734 857 1 18 1567 95 64 495 55 3 1995 554 95 6 36 4464 821 8 95 222 663 1984 714 51 8 1637 84 66 936 93 286 795 3 69 19 632 71 94 43 33 34 439 317 739 16 26 381 8 257 11 617 76 8 94 58 92 39 47 96 611 66 757 85 148 84 979 19 816 2143 36 77 72 146 296 43 55 44 2717 45 15 54 634 4345 21 3738 81 61 9529 1 39 46 336 243 987 25 67 88 72 73 72 12 111 963 533 68 14 81 422 6988 64 56 8 96 562 61 39 338 49 633 59 29 39 248 472 4791 5 4 815 954 119 72 84 2 258 848 84 85 8664 26 322 213 7282 437 64 296 94 4 32 695 7961 48 257 3771 881 6 24 25 78 646 9527 39 629 61 452 2436 56 245 7623 32 87 225 533 76 84 33 36 14 37 65 11 39 132 532 32 9 16 36 78 44 49 43 559 994 354 7258 892 46 777 32 8 977 6 45 24 53 36 74 56 46 453 95 63 45 41 51 56 198 685 1779 444 48 714 35 23 69 624 78 996 5 5 65 39 1 59 17 4148 8828 651 96 9 28 64 8613 117 436 873 746 147 376 982 436 797 78 742 622 638 55 686 861 97 3722 7518 293 1839 63 3728 23 38 42 27 27 952 264 1 18 36 9 849 2787 152 58 82 6 47 78 28
1 4 22 9416 987 3 134 84 9438 89 81 913 27 55 68 148 9998 867 165 59 85 639 93 7 725 873 5 4 19 257 226 28 34 99 38 7 1477 3622 81 1 655 537 75 796 323 731 75 3557 347 675 894 391 536 3835 39 93 447 6 55 2879 25 7 663 94 12 63 57 6 591 784 614 98 16 67 34 89 92 896 231 81 79 898 13 37 55 655 69 745 86 74 78 231 4 65 368 29 33 741 843 65 777 482 53 594 89 57 3886 222 9 838 2 639 571 7678 693 47 14 45 193 4 321 387 65 868 9 75 996 98 428 7924 998 46 124 73 653 678 15 54 15 519 54 42 24 456 36 55 75 7247 97 9326 41 91 513 59 5451 91 466 79 19 32 95 94 437 34 62 38 898 532 851 45 442 45 4975 132 91 8778 769 723 541 63 136 51 519 139 84 44 992 27 26 22 59 6855 264 733 53 721 26 39 74 124 28 98 52 73 725 216 432 432 2967 314 92 27 42 1 87 755 564 55 199 5378 56 839 69 78 493 818 45 41 319 2975 33 44 68 183 224 62 832 83 869 71 8384 458 68 34 44 121 841 44 46 569 1768 98 2793 31 28 447 175 12 863 293 599 22 958 9868 55 32 959 19 4591 1 76 854 365 431 91 92 427 61 552 7277 85 429 19 646 24 224 772 67 46 2 4 597 78 744 571 471 449 246 32 61 24 867 634 81 947 15 14 85 48 23 94 17 68 84 63 62 3 799 37 2611 1865 19 83 11 14 769 6 184 882 3387 12 485 8712 82 545 436 1 959 972 97 849 22 41 27 41 221 1528 96 885 89 63 62 3 7464 56 65 2 423 42 92 92 2819 567 18 77 57 734 16 362 1885 426 4 4 63 84 536 236 4924 4 998 48 7756 1395 51 89 7 987 34 114 3681 264 126 759 827 51 338 35 99 725 77 7 396 556 66 2 899 299 77 96 79 81 4 99 81 14 5 52 32 37 616 117 64 869 69 39 756 878 46 211 43 11 79 757 985 1992 125 619 662 842 41 433 114 291 22 959 94 69 4251 53 6 876 1147 412 41 35 94 838 52 66 17 1329 995 64 94 961 41 44 671 4841 45 12 83 621 32 23 2955 29 987 99 98 36 987 25 48 34 81 669 69 313 38 45 81 14 72 9235 17 721 18 583 41 953 8 46 446 9 7164 741 91 2 45 649 417 371 53 54 8956 6 759 33 7 7113 196 62 36 895 564 98 5511 47 21 18 413 71 58 649 6133 26 25 4516 544 52 7 48 8133 956 31 38 85 25 3153 847 81 11 839 332 26 623 982 761 681 6433 43 374 95 192 2892 9 115 93 22 49 692 8872 556 83 422 75 783 362 4234 44 8 74 7282 49 824 451 21 446 945 299 1334 431 55 72 272 5684 39 89 966 51 969 346 51 28 283 82 812 2818 487 681 76 82 83 54 588 699 777 47 7283 19 93 578 761 682 222 356 125 69 6136 589 69 54 75 24 744 38 9129 61 577 76 44 7 7199 17 741 436 29 7922 75 2 45 111 9 73 82 3277 655 54 15 3765 68 1214 9735 77 399 191 78 222 83 16 781 89 169 55 24 2 316 9 481 89 69 797 77 943 84 564 991 568 25 4 312 24 281 66 98 941 5 5925 787 692 781 5583 326 24 623 2679 626 832 3735 97 42 57 89 254 965 12 11 2492 94 71 74 59 39 739 443 47 36 56 2357 974 99 14 859 521 459 938 81 92 475 46 59 19 86 24 367 37 28 18 565 12 93 474 12 787 899 534 719 97 342 369 78 525 44 296 64 32 66 67 2 18 48 356 534 331 6745 131 998 594 393 17 366 5859 877 45 12 33 815 29 59 69 6966 415 32 79 119 529 45 6791 87 63 353 9 6 45 88 375 76 76 2474 45 32 55 26 66 26 272 262 75 52 32 818 7458 65 26 8 641 551 7 7 288 46 544 93 94 51 285 273 8693 65 62 778 448 236 42 97 2 97 624 11 21 2 6 511 876 7453 61 66 533 14 32 47 364 4372 275 896 9832 752 93 92 17 32 92 819 93 717 55 689 7411 757 126 2773 5 69 472 122 123 77 345 35 99 2287 46 25 245 81 879 98 24 67 33 98 26 138 14 242 944 638 756 629 37 548 17 2 781 7 39 35 3 8 23 2 94 891 679 12 262 38 89 4 7453 392 279 7371 65 52 51 67 193 374 138 952 5 33 27 2654 3 95 73 4773 9835 55 6 715 464 51 6434 712 28 934 596 318 358 395 455 3148 72 947 817 223 67 873 516 58 534 85 416 648 77 46 29 55 71 34 9763 44 7186 8 52 59 93 472 596 781 97 5 56 46 555 176
4 3 68 8629 4961 5 737 4 2221 93 77 599 7 89 5 942 6993 9558 913 7 64 156 3 6 957 537 4 7 65 121 429 81 66 37 93 2 5133 1979 1818 4 575 874 34 252 528 854 42 5372 296 736 428 8 12 5426 4 4 376 1 68 3134 672 3 229 38 62 126 21 4 89 515 345 94 31 5 3 866 94 881 671 2 9 8 64 14 26 889 18 39 31 72 55 131 6 1 27 67 28 762 979 5 164 371 48 698 2 7 7162 525 5 784 3 932 892 3926 615 2 36 89 64 8 51 412 13 912 4 75 722 15 987 2663 466 98 477 153 23 71 78 717 27 514 78 23 51 47 76 74 56 8697 81 8167 32 87 171 46 85 23 466 17 1 156 93 63 46 74 88 6 567 281 165 31 276 95 891 313 88 5969 393 549 274 56 73 2 98 773 85 69 517 6 28 85 4 8224 426 314 8 368 59 175 58 247 18 74 611 75 36 578 861 785 21 467 2 11 23 8 1 956 341 18 977 5584 1 644 28 4 272 483 517 2 7 6719 4 75 32 67 884 4 77 11 17 7 6595 43 48 77 8 9 725 83 88 47 4166 99 5624 9 34 965 739 3537 99 69 143 61 36 787 7 86 888 69 66 28 72 25 655 929 9 7 171 95 1 3928 85 234 74 937 61 692 228 6 7 45 2 67 17 965 541 394 796 212 25 79 3 639 727 93 931 83 57 42 77 54 7 77 77 66 9 8 7 615 26 4116 6346 35 68 95 2 529 7 7 974 3118 71 638 768 2 8 647 4 72 58 74 171 23 9 18 4 672 2818 7 26 4 94 18 53 5685 5 34 1 581 87 26 335 8348 25 86 2 61 565 24 78 4512 337 4 51 2 62 218 96 7811 51 22 27 21 8382 79 34 9 116 15 657 3189 7 7 598 8 33 713 96 45 88 86 9 944 46 53 3 468 58 41 98 49 36 4 11 23 93 3 2 71 3 556 223 24 665 73 59 9277 763 3 576 434 2 75 98 64 3498 459 837 66 969 16 42 174 5 3 22 7 64 9621 16 45 91 6399 633 65 14 2 235 36 13 64 83 895 6 62 883 55 11 517 2519 94 55 97 696 74 93 41 11 8 928 67 4 163 28 93 92 59 156 11 328 37 85 95 22 4 148 95 5465 57 423 97 28 2 62 554 8 3788 335 2 8 62 957 357 31 91 82 1968 3 29 44 6 1782 983 6 88 245 9 86 7243 55 499 6 838 56 93 355 9817 11 7 8295 6 7 3 1 8337 963 54 5 35 49 2887 376 25 34 889 34 84 639 95 416 876 713 38 318 62 532 9487 8 4233 2 71 88 949 7749 436 27 889 3 236 596 4655 52 7 13 543 79 421 678 11 441 153 86 2891 767 12 72 116 3142 42 96 162 71 44 22 98 882 636 84 623 7474 433 8328 63 86 37 38 41 272 492 68 2497 95 88 899 146 214 21 248 542 53 1493 265 83 27 14 475 852 64 2873 17 947 53 11 2 2263 69 524 422 66 3528 84 5 46 697 28 94 75 162 38 12 6 555 87 3388 9367 12 893 4141 18 494 1 58 138 77 441 49 9 5 47 64 747 17 81 4 82 417 41 249 381 618 4 7 588 5 874 3 66 1 3 8521 238 21 495 2646 29 682 634 2133 52 4 3844 63 49 44 92 658 83 47 84 922 57 379 25 86 24 2 536 72 42 39 8169 491 72 67 169 1 7 743 81 81 17 5 99 54 49 26 754 956 29 8 326 77 56 759 84 191 828 232 592 25 6745 214 171 536 85 458 31 61 73 82 3 669 17 714 75 232 7897 277 36 722 613 78 988 3293 563 76 58 4 343 1 23 72 4649 692 97 11 597 71 61 4796 8 11 77 31 8 89 7 262 14 75 5165 28 5 9 94 9 36 1 187 23 53 6 579 36 5 49 68 824 534 7 7 921 66 67 79 27 99 178 165 4528 12 18 596 689 55 8 24 32 22 16 494 8 3 8 444 779 8478 48 5 934 62 55 11 91 24 331 786 5854 452 77 85 871 3 78 35 87 962 8 648 346 877 766 4441 6 91 47 26 125 51 879 53 6 3937 28 54 122 76 479 44 17 7 86 73 71 357 25 31 26 481 58 484 44 713 8 8 819 9 97 34 4 6 48 5 55 559 926 6 758 14 95 1 4733 774 518 3795 68 77 7 89 143 3 594 125 12 54 36 8913 26 3 2 75 4285 2 2 188 616 85 65 67 3 539 34 634 289 369 524 4761 28 613 54 448 7 849 186 52 43 18 648 49 7 5 46 92 39 67 5531 67 2617 91 86 27 17 212 873 446 85 3 33 5 942 294
* * * + + * + + + * + + + + * * + + * * * + + + * * * + * + * + * * * + + + + * + + + + + + + + + + * + * + + * * * * + * + * * * * * * * * * + * * * + * + + + * * + * * * + + * * * + * * + * + + + * + * * * * + + * * + + + + + + * * * + + + * * * + * + + + + + * + * * * * * + * * * + + * + * + * + * + + + + * * * * * + + * * + * + + * * * + + * * + * * + + * + * * * + * + * + + + * + + + + * * + * * + * * + * * + + + + * * * + * + * + + * + * + * * + + + * * * * + * + * + + + * + + + + * + * + + * + * * + * + + + * * * + + + + * + * + + * + * * + * * + * * + + * + + * + * * * + + * + * * + * * + * * * * + * * + * * + * * + * * * + + * + * + * * + * + * * + * + * + * + * + * * * + + + * + * * * * + * * * + * + * + + * * * + * + + * + + + * + + + * + * + + * + + * + + + * * + * + + * * + * + * + * + + + * * * * * + + * * + + + + * * * + * + + * * * * * + + + + * * + * + + + * + * + + + * + + * * + * * * * + + * * + + * + + + + + * * + * + * + + + * + + + + + + + + * * * * * + * + * + + + + * * + + * * * * * * * + * + + + + * + * + * * * + + + * + * * + * + + * + * + + + + + + + * + + + * * + * + * * * + + * * * + + + + * + * * + + + * + * + + * * + + * * + + + * + + * + * * + * + * * * * + + * * + + * + + + * * * * * + + + * * * * + * + * + + + + * * * + + * * + + + + + + + * + + + * + * + * + + * * + + + + * * + + + * * * + + * * + * * + + + + + + * + * * + * * + + + * * + + * * * + + + * + * + + * + + + * + + + + * * * + * + + + + * + + + * * * + + * + + + + + * + + + * + * + + + + + + * * + + * * * + + + * + * * + + + * + + * + + * + * + + * + + * * + * + * + + + + * + + * + * * + + + * * + + * * * * + * + + * + * + * + * * + * * + + + * * * + * + * * + + * * + * * + * + + * + + + + + * + * + + + + * + * * * * * + + + * + * + + * + * + + * + * + * + + * * * + * + + * * * + * * * * + + + * + + * + + * * * * + * * * * + + * + + + * + + + + + + * * * * + * + + + * + + + + + * * + + + + + + * * * * + * + * * * * * + + + * + * + * + + * + * + * + * + * + + * + * * * +
+31
View File
@@ -0,0 +1,31 @@
import math
INPUT_FILE = "input.txt"
problems: list[list[int]] = []
with open(INPUT_FILE, 'r') as file:
lines: list[str] = file.readlines()
problems = [ [] for _ in range(len(lines[0].split())) ]
# Prepare all problems
for line in lines[:-1]:
for i, n in enumerate([ int(n.strip()) for n in line.split() ]):
problems[i].append(n)
operations: list[str] = lines[-1].split()
total = 0
for i, problem in enumerate(problems):
operation: str = operations[i]
if operation == '+':
total += sum(problem)
elif operation == '*':
total += math.prod(problem)
print(f'Total Value: {total}')
+4
View File
@@ -0,0 +1,4 @@
123 328 51 64
45 64 387 23
6 98 215 314
* + * +
+5
View File
@@ -0,0 +1,5 @@
95 92 45 63 1 78 885 88 28 39 29 8 48 6 34 958 1 22 5 16 89 612 267 26 525 54 696 99 41 84 5 27 9 155 7 26 1 56 4 95 1 56 7 574 713 784 936 28 69 3 466 6475 165 8 9641 88 71 74 67 799 97 34 7 13 8 3 714 78 581 4 9 42 27 18 278 46 4 786 644 24 478 142 12 53 76 369 58 7117 79 9 381 918 994 54 331 731 97 72 854 757 766 157 97 6 371 58 1331 76 24 46 147 28 6 31 663 52 86 84 9116 236 821 3 9 7 639 3 65 7 627 24 42 592 35 65 139 633 25 8 3 79 69 9 76 4742 23 58 38 115 613 4485 21 1 753 2 3722 36 43 8 66 7 5 27 919 6 196 86 3 1 72 51 835 83 5715 244 94 7126 1 793 3891 673 878 57 725 69 696 49 832 28 41 5 392 868 69 25 37 9 79 19 37 4 71 7 4 29 494 351 4 63 1656 1739 37 46 65 226 54 99 8 41 14 875 392 2 3 351 239 9 1 22 7743 375 534 4 26 257 811 44 4551 66 1123 99 96 952 83 891 694 177 95 87 2 216 9 37 872 187 1 9284 57 6 895 275 494 58 822 3519 81 9 67 6 4829 8 11 741 987 17 94 867 22 72 381 89 31 147 4679 8 3 7 54 69 64 9 52 831 63 943 9 467 521 6 8 5 39 19 1 7 66 21 3 65 18 99 325 71 7 83 32 98 177 415 5 366 6434 4 7998 52 114 6 37 163 453 17 895 274 5718 47 374 581 13 488 824 456 16 2 798 92 52 12 72 289 6444 58 52 821 2 6725 63 12 745 8874 94 19 5 14 623 99 415 644 53 73 187 45 582 9677 2 348 45 77 969 24 5 798 38 5125 56 7 56 469 91 7 885 8 746 355 28 921 44 7 6 56 935 239 371 45 775 75 52 11 2954 87 581 94 7 93 74 86 87 842 959 21 5167 2641 8 84 223 72 15 74 965 72 378 4 39 8 511 4521 9 264 54 983 39 16 5171 747 693 51 616 58 263 557 8 7 661 63 63 84 631 67 863 767 9 42 8432 7 97 9 776 48 435 7888 93 2 17 78 54 493 74 6615 21 858 7 68 45 75 41 51 46 36 187 5 59 29 53 81 95 457 9974 619 8 72 6379 2 538 84 71 84 46 273 1 86 76 3 8 242 472 2 89 4 47 993 91 82 64 6 51 4 93 484 9 91 56 38 835 231 55 234 438 94 8 67 33 717 7622 85 28 6735 5 178 8189 9 31 2553 623 855 8 7213 514 23 3 382 368 6 9334 36 3 3 644 4 28 8 591 53 88 49 768 2 45 88 47 46 96 86 273 33 7 3834 17 182 21 6273 12 74 565 77 9 4 86 49 98 55 15 533 19 431 532 16 48 9 8 32 5642 52 84 38 67 95 2 522 8 51 31 46 6 34 7 8 77 439 24 4 32 2 34 324 16 56 21 183 1 412 78 5 7 67 89 4971 1 34 758 64 12 292 783 2 7 7 88 99 9824 847 442 68 6349 4 195 17 99 3 72 697 596 39 86 3 2437 8 4 215 29 578 3 2 232 317 489 51 6 44 48 6 693 71 351 97 92 2 63 66 382 11 1867 1 762 86 6721 4848 44 986 4911 883 476 1663 81 6 37 7 954 5864 1 85 5224 66 8 773 4 6 7158 67 85 9 64 187 95 7 9 32 912 5547 52 53 3 5617 79 5 763 853 188 64 6 36 45 791 18 49 41 88 5 3233 919 3 79 3 254 6 965 27 378 22 8 18 25 62 7 37 24 669 35 989 6 5468 95 457 5 32 685 42 4 7 584 86 536 98 73 63 7 354 93 631 3178 48 279 566 75 6488 2 51 33 337 189 962 24 93 98 435 75 1 39 644 172 858 88 72 926 11 2292 26 84 6 53 227 21 91 19 9 382 7 26 28 565 741 75 7 1 633 3 312 14 79 1 693 9734 2 94 6729 914 1872 4 365 559 36 154 61 1 74 639 8871 73 391 55 147 2 7 6 62 449 3975 58 868 98 474 6182 9 94 9151 41 6 758 955 42 6 5 52 713 51 45 85 8 257 46 2 2 51 12 68 56 34 79 329 559 66 3358 86 54 868 75 47 21 12 75 16 98 67 25 49 68 968 99 22 29 95 1 975 374 36 6971 13 69 127 41 1 8 998 8 4 8 4 8 9 8 63 32 5838 6291 772 666 2 5 5 9446 933 884 845 177 493 3 32 364 25 3 432 939 21 84 536 9 55 7412 9729 746 7533 654 3238 92 213 53 23 8 386 824 4 59 17 9 148 3114 39 31 85 8 729 3 5
41 29 61 65 99 57 924 77 95 69 51 265 46 1 33 326 3765 35 48 79 41 817 24 23 924 534 961 48 57 967 81 17 1 612 4 99 5125 34 73 4 4 38 5 776 686 373 651 923 283 347 113 7441 811 51 5323 14 398 79 25 8115 79 84 141 61 45 74 585 92 473 118 688 76 17 91 372 84 43 432 537 44 189 219 53 23 72 996 88 8249 33 86 941 137 69 95 721 67 53 427 366 78 133 873 16 398 693 93 2748 27 1 25 34 37 895 9358 118 15 11 88 9689 216 242 388 5 597 73 98 86 6 264 461 895 788 32 57 417 367 97 97 36 92 45 51 81 1136 52 55 28 935 13 2544 37 4 286 89 1699 81 174 44 61 6 56 62 275 49 452 48 387 86 912 79 724 53 8699 331 39 2115 978 614 9192 798 614 74 499 157 55 49 123 18 25 87 916 163 387 88 45 79 78 87 38 967 65 68 9 32 398 218 39 513 8854 6911 58 24 27 528 42 49 914 86 259 2959 87 36 58 212 823 84 2 33 3532 6219 343 8 25 925 639 85 7663 17 4651 89 661 899 93 549 58 841 233 28 43 995 241 45 2234 413 39 9368 277 13 632 344 277 81 893 4587 82 21 82 19 2835 3 47 774 371 43 91 82 734 83 194 2679 28 786 4985 145 4 77 793 85 62 8 66 531 65 845 87 811 618 776 2 53 83 642 81 2 164 23 87 52 34 88 51 71 2 69 82 42 989 664 5 8855 2139 54 5724 93 623 35 96 348 713 82 949 271 3731 22 977 812 44 218 875 19 382 96 372 12 42 47 816 534 6355 74 68 677 2 9979 21 67 874 7585 63 87 85 797 122 18 37 634 376 74 299 112 256 513 3 448 88 262 356 8187 8 413 31 8639 879 4 37 979 324 7 294 1214 322 542 74 544 96 49 1 78 494 226 73 45 147 59 15 19 1115 16 884 21 82 1 11 39 44 143 817 22 9629 1952 96 91 474 89 75 988 588 58 596 7 61 1 382 2332 27 557 244 423 513 82 2792 767 596 73 817 28 22 8538 62 9 429 764 946 89 389 35 727 428 42 28 7493 25 29 37 116 17 577 5884 629 1 31 12 672 159 49 4258 55 785 39 66 99 168 27 47 84 36 179 6 934 55 36 71 93 344 1522 792 69 17 3732 1 414 11 91 132 35 3932 76 38 86 68 29 795 579 45 68 35 26 637 68 17 97 4 43 8 236 393 9 7796 79 94 591 154 98 214 462 7325 8 43 5111 833 896 83 39 5828 66 38 173 3 51 6225 256 362 29 9114 679 61 9 433 455 23 6718 93 916 19 838 236 27 83 593 97 81 251 9865 33 23 69 29 56 58 168 443 27 3 9642 39 276 352 48 33 776 665 956 247 38 61 478 758 63 41 369 86 933 975 95 41 869 4 732 4229 44 715 59 72 34 18 584 73 895 13 478 62 52 526 2 29 288 662 65 98 719 538 296 77 22 24 422 2 3335 25 626 74 86 18 4882 58 186 282 21 325 719 33 3 86 9 33 32 1244 556 21 75 9762 37 2194 9715 14 46 119 525 913 17 72 94 4482 94 3 613 2 239 8 92 31 64 279 48 173 11 53 1 469 75 138 736 52 8 96 51 568 46 1547 67 245 88 1968 7941 41 778 9266 673 222 6481 48 4 71 4 734 857 1 18 1567 95 64 495 55 3 1995 554 95 6 36 4464 821 8 95 222 663 1984 714 51 8 1637 84 66 936 93 286 795 3 69 19 632 71 94 43 33 34 439 317 739 16 26 381 8 257 11 617 76 8 94 58 92 39 47 96 611 66 757 85 148 84 979 19 816 2143 36 77 72 146 296 43 55 44 2717 45 15 54 634 4345 21 3738 81 61 9529 1 39 46 336 243 987 25 67 88 72 73 72 12 111 963 533 68 14 81 422 6988 64 56 8 96 562 61 39 338 49 633 59 29 39 248 472 4791 5 4 815 954 119 72 84 2 258 848 84 85 8664 26 322 213 7282 437 64 296 94 4 32 695 7961 48 257 3771 881 6 24 25 78 646 9527 39 629 61 452 2436 56 245 7623 32 87 225 533 76 84 33 36 14 37 65 11 39 132 532 32 9 16 36 78 44 49 43 559 994 354 7258 892 46 777 32 8 977 6 45 24 53 36 74 56 46 453 95 63 45 41 51 56 198 685 1779 444 48 714 35 23 69 624 78 996 5 5 65 39 1 59 17 4148 8828 651 96 9 28 64 8613 117 436 873 746 147 376 982 436 797 78 742 622 638 55 686 861 97 3722 7518 293 1839 63 3728 23 38 42 27 27 952 264 1 18 36 9 849 2787 152 58 82 6 47 78 28
1 4 22 9416 987 3 134 84 9438 89 81 913 27 55 68 148 9998 867 165 59 85 639 93 7 725 873 5 4 19 257 226 28 34 99 38 7 1477 3622 81 1 655 537 75 796 323 731 75 3557 347 675 894 391 536 3835 39 93 447 6 55 2879 25 7 663 94 12 63 57 6 591 784 614 98 16 67 34 89 92 896 231 81 79 898 13 37 55 655 69 745 86 74 78 231 4 65 368 29 33 741 843 65 777 482 53 594 89 57 3886 222 9 838 2 639 571 7678 693 47 14 45 193 4 321 387 65 868 9 75 996 98 428 7924 998 46 124 73 653 678 15 54 15 519 54 42 24 456 36 55 75 7247 97 9326 41 91 513 59 5451 91 466 79 19 32 95 94 437 34 62 38 898 532 851 45 442 45 4975 132 91 8778 769 723 541 63 136 51 519 139 84 44 992 27 26 22 59 6855 264 733 53 721 26 39 74 124 28 98 52 73 725 216 432 432 2967 314 92 27 42 1 87 755 564 55 199 5378 56 839 69 78 493 818 45 41 319 2975 33 44 68 183 224 62 832 83 869 71 8384 458 68 34 44 121 841 44 46 569 1768 98 2793 31 28 447 175 12 863 293 599 22 958 9868 55 32 959 19 4591 1 76 854 365 431 91 92 427 61 552 7277 85 429 19 646 24 224 772 67 46 2 4 597 78 744 571 471 449 246 32 61 24 867 634 81 947 15 14 85 48 23 94 17 68 84 63 62 3 799 37 2611 1865 19 83 11 14 769 6 184 882 3387 12 485 8712 82 545 436 1 959 972 97 849 22 41 27 41 221 1528 96 885 89 63 62 3 7464 56 65 2 423 42 92 92 2819 567 18 77 57 734 16 362 1885 426 4 4 63 84 536 236 4924 4 998 48 7756 1395 51 89 7 987 34 114 3681 264 126 759 827 51 338 35 99 725 77 7 396 556 66 2 899 299 77 96 79 81 4 99 81 14 5 52 32 37 616 117 64 869 69 39 756 878 46 211 43 11 79 757 985 1992 125 619 662 842 41 433 114 291 22 959 94 69 4251 53 6 876 1147 412 41 35 94 838 52 66 17 1329 995 64 94 961 41 44 671 4841 45 12 83 621 32 23 2955 29 987 99 98 36 987 25 48 34 81 669 69 313 38 45 81 14 72 9235 17 721 18 583 41 953 8 46 446 9 7164 741 91 2 45 649 417 371 53 54 8956 6 759 33 7 7113 196 62 36 895 564 98 5511 47 21 18 413 71 58 649 6133 26 25 4516 544 52 7 48 8133 956 31 38 85 25 3153 847 81 11 839 332 26 623 982 761 681 6433 43 374 95 192 2892 9 115 93 22 49 692 8872 556 83 422 75 783 362 4234 44 8 74 7282 49 824 451 21 446 945 299 1334 431 55 72 272 5684 39 89 966 51 969 346 51 28 283 82 812 2818 487 681 76 82 83 54 588 699 777 47 7283 19 93 578 761 682 222 356 125 69 6136 589 69 54 75 24 744 38 9129 61 577 76 44 7 7199 17 741 436 29 7922 75 2 45 111 9 73 82 3277 655 54 15 3765 68 1214 9735 77 399 191 78 222 83 16 781 89 169 55 24 2 316 9 481 89 69 797 77 943 84 564 991 568 25 4 312 24 281 66 98 941 5 5925 787 692 781 5583 326 24 623 2679 626 832 3735 97 42 57 89 254 965 12 11 2492 94 71 74 59 39 739 443 47 36 56 2357 974 99 14 859 521 459 938 81 92 475 46 59 19 86 24 367 37 28 18 565 12 93 474 12 787 899 534 719 97 342 369 78 525 44 296 64 32 66 67 2 18 48 356 534 331 6745 131 998 594 393 17 366 5859 877 45 12 33 815 29 59 69 6966 415 32 79 119 529 45 6791 87 63 353 9 6 45 88 375 76 76 2474 45 32 55 26 66 26 272 262 75 52 32 818 7458 65 26 8 641 551 7 7 288 46 544 93 94 51 285 273 8693 65 62 778 448 236 42 97 2 97 624 11 21 2 6 511 876 7453 61 66 533 14 32 47 364 4372 275 896 9832 752 93 92 17 32 92 819 93 717 55 689 7411 757 126 2773 5 69 472 122 123 77 345 35 99 2287 46 25 245 81 879 98 24 67 33 98 26 138 14 242 944 638 756 629 37 548 17 2 781 7 39 35 3 8 23 2 94 891 679 12 262 38 89 4 7453 392 279 7371 65 52 51 67 193 374 138 952 5 33 27 2654 3 95 73 4773 9835 55 6 715 464 51 6434 712 28 934 596 318 358 395 455 3148 72 947 817 223 67 873 516 58 534 85 416 648 77 46 29 55 71 34 9763 44 7186 8 52 59 93 472 596 781 97 5 56 46 555 176
4 3 68 8629 4961 5 737 4 2221 93 77 599 7 89 5 942 6993 9558 913 7 64 156 3 6 957 537 4 7 65 121 429 81 66 37 93 2 5133 1979 1818 4 575 874 34 252 528 854 42 5372 296 736 428 8 12 5426 4 4 376 1 68 3134 672 3 229 38 62 126 21 4 89 515 345 94 31 5 3 866 94 881 671 2 9 8 64 14 26 889 18 39 31 72 55 131 6 1 27 67 28 762 979 5 164 371 48 698 2 7 7162 525 5 784 3 932 892 3926 615 2 36 89 64 8 51 412 13 912 4 75 722 15 987 2663 466 98 477 153 23 71 78 717 27 514 78 23 51 47 76 74 56 8697 81 8167 32 87 171 46 85 23 466 17 1 156 93 63 46 74 88 6 567 281 165 31 276 95 891 313 88 5969 393 549 274 56 73 2 98 773 85 69 517 6 28 85 4 8224 426 314 8 368 59 175 58 247 18 74 611 75 36 578 861 785 21 467 2 11 23 8 1 956 341 18 977 5584 1 644 28 4 272 483 517 2 7 6719 4 75 32 67 884 4 77 11 17 7 6595 43 48 77 8 9 725 83 88 47 4166 99 5624 9 34 965 739 3537 99 69 143 61 36 787 7 86 888 69 66 28 72 25 655 929 9 7 171 95 1 3928 85 234 74 937 61 692 228 6 7 45 2 67 17 965 541 394 796 212 25 79 3 639 727 93 931 83 57 42 77 54 7 77 77 66 9 8 7 615 26 4116 6346 35 68 95 2 529 7 7 974 3118 71 638 768 2 8 647 4 72 58 74 171 23 9 18 4 672 2818 7 26 4 94 18 53 5685 5 34 1 581 87 26 335 8348 25 86 2 61 565 24 78 4512 337 4 51 2 62 218 96 7811 51 22 27 21 8382 79 34 9 116 15 657 3189 7 7 598 8 33 713 96 45 88 86 9 944 46 53 3 468 58 41 98 49 36 4 11 23 93 3 2 71 3 556 223 24 665 73 59 9277 763 3 576 434 2 75 98 64 3498 459 837 66 969 16 42 174 5 3 22 7 64 9621 16 45 91 6399 633 65 14 2 235 36 13 64 83 895 6 62 883 55 11 517 2519 94 55 97 696 74 93 41 11 8 928 67 4 163 28 93 92 59 156 11 328 37 85 95 22 4 148 95 5465 57 423 97 28 2 62 554 8 3788 335 2 8 62 957 357 31 91 82 1968 3 29 44 6 1782 983 6 88 245 9 86 7243 55 499 6 838 56 93 355 9817 11 7 8295 6 7 3 1 8337 963 54 5 35 49 2887 376 25 34 889 34 84 639 95 416 876 713 38 318 62 532 9487 8 4233 2 71 88 949 7749 436 27 889 3 236 596 4655 52 7 13 543 79 421 678 11 441 153 86 2891 767 12 72 116 3142 42 96 162 71 44 22 98 882 636 84 623 7474 433 8328 63 86 37 38 41 272 492 68 2497 95 88 899 146 214 21 248 542 53 1493 265 83 27 14 475 852 64 2873 17 947 53 11 2 2263 69 524 422 66 3528 84 5 46 697 28 94 75 162 38 12 6 555 87 3388 9367 12 893 4141 18 494 1 58 138 77 441 49 9 5 47 64 747 17 81 4 82 417 41 249 381 618 4 7 588 5 874 3 66 1 3 8521 238 21 495 2646 29 682 634 2133 52 4 3844 63 49 44 92 658 83 47 84 922 57 379 25 86 24 2 536 72 42 39 8169 491 72 67 169 1 7 743 81 81 17 5 99 54 49 26 754 956 29 8 326 77 56 759 84 191 828 232 592 25 6745 214 171 536 85 458 31 61 73 82 3 669 17 714 75 232 7897 277 36 722 613 78 988 3293 563 76 58 4 343 1 23 72 4649 692 97 11 597 71 61 4796 8 11 77 31 8 89 7 262 14 75 5165 28 5 9 94 9 36 1 187 23 53 6 579 36 5 49 68 824 534 7 7 921 66 67 79 27 99 178 165 4528 12 18 596 689 55 8 24 32 22 16 494 8 3 8 444 779 8478 48 5 934 62 55 11 91 24 331 786 5854 452 77 85 871 3 78 35 87 962 8 648 346 877 766 4441 6 91 47 26 125 51 879 53 6 3937 28 54 122 76 479 44 17 7 86 73 71 357 25 31 26 481 58 484 44 713 8 8 819 9 97 34 4 6 48 5 55 559 926 6 758 14 95 1 4733 774 518 3795 68 77 7 89 143 3 594 125 12 54 36 8913 26 3 2 75 4285 2 2 188 616 85 65 67 3 539 34 634 289 369 524 4761 28 613 54 448 7 849 186 52 43 18 648 49 7 5 46 92 39 67 5531 67 2617 91 86 27 17 212 873 446 85 3 33 5 942 294
* * * + + * + + + * + + + + * * + + * * * + + + * * * + * + * + * * * + + + + * + + + + + + + + + + * + * + + * * * * + * + * * * * * * * * * + * * * + * + + + * * + * * * + + * * * + * * + * + + + * + * * * * + + * * + + + + + + * * * + + + * * * + * + + + + + * + * * * * * + * * * + + * + * + * + * + + + + * * * * * + + * * + * + + * * * + + * * + * * + + * + * * * + * + * + + + * + + + + * * + * * + * * + * * + + + + * * * + * + * + + * + * + * * + + + * * * * + * + * + + + * + + + + * + * + + * + * * + * + + + * * * + + + + * + * + + * + * * + * * + * * + + * + + * + * * * + + * + * * + * * + * * * * + * * + * * + * * + * * * + + * + * + * * + * + * * + * + * + * + * + * * * + + + * + * * * * + * * * + * + * + + * * * + * + + * + + + * + + + * + * + + * + + * + + + * * + * + + * * + * + * + * + + + * * * * * + + * * + + + + * * * + * + + * * * * * + + + + * * + * + + + * + * + + + * + + * * + * * * * + + * * + + * + + + + + * * + * + * + + + * + + + + + + + + * * * * * + * + * + + + + * * + + * * * * * * * + * + + + + * + * + * * * + + + * + * * + * + + * + * + + + + + + + * + + + * * + * + * * * + + * * * + + + + * + * * + + + * + * + + * * + + * * + + + * + + * + * * + * + * * * * + + * * + + * + + + * * * * * + + + * * * * + * + * + + + + * * * + + * * + + + + + + + * + + + * + * + * + + * * + + + + * * + + + * * * + + * * + * * + + + + + + * + * * + * * + + + * * + + * * * + + + * + * + + * + + + * + + + + * * * + * + + + + * + + + * * * + + * + + + + + * + + + * + * + + + + + + * * + + * * * + + + * + * * + + + * + + * + + * + * + + * + + * * + * + * + + + + * + + * + * * + + + * * + + * * * * + * + + * + * + * + * * + * * + + + * * * + * + * * + + * * + * * + * + + * + + + + + * + * + + + + * + * * * * * + + + * + * + + * + * + + * + * + * + + * * * + * + + * * * + * * * * + + + * + + * + + * * * * + * * * * + + * + + + * + + + + + + * * * * + * + + + * + + + + + * * + + + + + + * * * * + * + * * * * * + + + * + * + * + + * + * + * + * + * + + * + * * * +
+58
View File
@@ -0,0 +1,58 @@
import math
INPUT_FILE = "input.txt"
problems: list[list[int]] = []
with open(INPUT_FILE, 'r') as file:
lines: list[str] = file.readlines()
raw: list[str] = []
for line in lines[:-1]:
raw.append(line[:-1])
problems = [ [] for _ in range(len(lines[0].split())) ]
problem_i = len(problems) - 1
# Prepare all problems
for x in range(len(raw[0])):
column_divider = True
n = ''
for y in range(len(raw)):
c = raw[y][x]
if c != ' ':
column_divider = False
n += c
if n:
problems[problem_i].append(int(n))
if column_divider:
problem_i -= 1
# for line in lines[:-1]:
# for c in reversed(line):
# for i, n in enumerate([ int(n.strip()) for n in line.split() ]):
# problems[i].append(n)
operations: list[str] = list(reversed(lines[-1].split()))
total = 0
for i, problem in enumerate(problems):
operation: str = operations[i]
if operation == '+':
print(f'{problem} {operation} = {sum(problem)}')
total += sum(problem)
elif operation == '*':
print(f'{problem} {operation} = {math.prod(problem)}')
total += math.prod(problem)
print(f'Total Value: {total}')
+4
View File
@@ -0,0 +1,4 @@
123 328 51 64
45 64 387 23
6 98 215 314
* + * +