diff --git a/2024/day10/input.text b/2024/day10/input.text new file mode 100644 index 0000000..eed89ba --- /dev/null +++ b/2024/day10/input.text @@ -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 \ No newline at end of file diff --git a/2024/day10/p1.py b/2024/day10/p1.py new file mode 100644 index 0000000..a530e14 --- /dev/null +++ b/2024/day10/p1.py @@ -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) + + + diff --git a/2024/day10/p2.py b/2024/day10/p2.py new file mode 100644 index 0000000..1acaaa1 --- /dev/null +++ b/2024/day10/p2.py @@ -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) + + + diff --git a/2024/day10/test.text b/2024/day10/test.text new file mode 100644 index 0000000..7bb1248 --- /dev/null +++ b/2024/day10/test.text @@ -0,0 +1,8 @@ +89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732 \ No newline at end of file diff --git a/2024/day12/input.text b/2024/day12/input.text new file mode 100644 index 0000000..35e21f4 --- /dev/null +++ b/2024/day12/input.text @@ -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 \ No newline at end of file diff --git a/2024/day12/main.py b/2024/day12/main.py new file mode 100644 index 0000000..c12ffd4 --- /dev/null +++ b/2024/day12/main.py @@ -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}') + + + + + + diff --git a/2024/day12/test.text b/2024/day12/test.text new file mode 100644 index 0000000..26ada03 --- /dev/null +++ b/2024/day12/test.text @@ -0,0 +1,5 @@ +EEEEE +EXXXX +EEEEE +EXXXX +EEEEE \ No newline at end of file