From 02370afca8bd496aa5bf8c96280633eae83b24ce Mon Sep 17 00:00:00 2001 From: red Date: Sun, 3 Dec 2023 03:57:45 -0600 Subject: [PATCH] Upload files to "/" --- day3-1.py | 119 +++++++++++++++ day3-2.py | 389 +++++++++++++++++++++++++++++++++++++++++++++++++ input_day3.txt | 140 ++++++++++++++++++ 3 files changed, 648 insertions(+) create mode 100644 day3-1.py create mode 100644 day3-2.py create mode 100644 input_day3.txt diff --git a/day3-1.py b/day3-1.py new file mode 100644 index 0000000..38a06a6 --- /dev/null +++ b/day3-1.py @@ -0,0 +1,119 @@ +import time +valid_symbols = "#$%&*+-/=@"#"/,!@#$%^&*()_-+={}[]" + +w,h = (140,140) +with open("input_day3.txt") as file: + lines = [line.rstrip() for line in file] + +matrix = [[0 for x in range(w)] for y in range(h)] +for y in range(h): + for x in range(w): + matrix[y][x] = lines[y][x] + +class number: + def __init__(self,x,y,length=1,num=0): + self.x = x + self.y = y + self.length = length + self.number = num + def append(self,num=0): + self.length+=1 + self.number = int( f"{self.number}{num}" ) + +def is_valid(num:number) -> bool: + #but first check if number is valid + result = False + for offset in range(num.length): + x = num.x+offset + y = num.y + check_upperleft = True + check_upper = True + check_upperright = True + check_midleft = True + check_midright = True + check_lowerleft = True + check_lower = True + check_lowerright = True + #if on first y dont check above + if num.y == 0: + check_upperleft,check_upper,check_upperright = (False,False,False) + #if on last y dont check below + if num.y == h-1: + check_lowerleft,check_lower,check_lowerright = (False,False,False) + # if on left or right horizontal edge + if x == 0: + check_midleft = False + if x >= w-1: + check_midright = False + check_upperright = False + check_lowerright = False + + #now do comparison + if check_upperleft: + if is_symbol(str(matrix[y-1][x-1])): + return True + if check_upper: + if is_symbol(str(matrix[y-1][x])): + return True + if check_upperright: + if is_symbol(str(matrix[y-1][x+1])): + return True + if check_midleft: + if is_symbol(str(matrix[y][x-1])): + return True + if check_midright: + if is_symbol(str(matrix[y][x+1])): + return True + if check_lowerleft: + if is_symbol(str(matrix[y+1][x-1])): + return True + if check_lower: + if is_symbol(str(matrix[y+1][x])): + return True + if check_lowerright: + if is_symbol(str(matrix[y+1][x+1])): + return True + return False + +def is_symbol(c): + if c in valid_symbols: + return True + return False + +numbers = [] +#140x140 matrix +y=-1 +#look at every element in matrix for a number +for line in lines: + #start new line + y+=1 + is_on_number = False + for x in range(w): + c = line[x] + if c.isnumeric(): + + if not is_on_number: + #start a new number record + is_on_number = True + new_num = number(x,y,num=int(c)) + elif x == w-1: + new_num.append(c) + if is_valid(new_num): + numbers.append(new_num) + print(new_num.number) + is_on_number = False + else: + #append to existing number + new_num.append(c) + else: + #not a number anymore so finish the number and add to num list if number is valid + if is_on_number: + if is_valid(new_num): + numbers.append(new_num) + #print(new_num.number) + #time.sleep(0.1) + is_on_number = False +sum = 0 +for num in numbers: + sum+=int(num.number) +print(sum) diff --git a/day3-2.py b/day3-2.py new file mode 100644 index 0000000..361d76b --- /dev/null +++ b/day3-2.py @@ -0,0 +1,389 @@ +import time +valid_symbols = "#$%&*+-/=@"#"/,!@#$%^&*()_-+={}[]" + +w,h = (140,140) +with open("input_day3.txt") as file: + lines = [line.rstrip() for line in file] + +matrix = [[0 for x in range(w)] for y in range(h)] +for y in range(h): + for x in range(w): + matrix[y][x] = lines[y][x] + +class number: + def __init__(self,x,y,length=1,num=0): + self.x = x + self.y = y + self.length = length + self.number = num + def append(self,num=0): + self.length+=1 + self.number = int( f"{self.number}{num}" ) + +def is_valid(num:number) -> bool: + #but first check if number is valid + result = False + for offset in range(num.length): + x = num.x+offset + y = num.y + check_upperleft = True + check_upper = True + check_upperright = True + check_midleft = True + check_midright = True + check_lowerleft = True + check_lower = True + check_lowerright = True + #if on first y dont check above + if num.y == 0: + check_upperleft,check_upper,check_upperright = (False,False,False) + #if on last y dont check below + if num.y == h-1: + check_lowerleft,check_lower,check_lowerright = (False,False,False) + # if on left or right horizontal edge + if x == 0: + check_midleft = False + if x >= w-1: + check_midright = False + check_upperright = False + check_lowerright = False + + #now do comparison + if check_upperleft: + if is_symbol(str(matrix[y-1][x-1])): + return True + if check_upper: + if is_symbol(str(matrix[y-1][x])): + return True + if check_upperright: + if is_symbol(str(matrix[y-1][x+1])): + return True + if check_midleft: + if is_symbol(str(matrix[y][x-1])): + return True + if check_midright: + if is_symbol(str(matrix[y][x+1])): + return True + if check_lowerleft: + if is_symbol(str(matrix[y+1][x-1])): + return True + if check_lower: + if is_symbol(str(matrix[y+1][x])): + return True + if check_lowerright: + if is_symbol(str(matrix[y+1][x+1])): + return True + return False + +def is_symbol(c): + if c in valid_symbols: + return True + return False + +numbers = [] +#140x140 matrix +y=-1 +#look at every element in matrix for a number +for line in lines: + #start new line + y+=1 + is_on_number = False + for x in range(w): + c = line[x] + if c.isnumeric(): + + if not is_on_number: + #start a new number record + is_on_number = True + new_num = number(x,y,num=int(c)) + elif x == w-1: + new_num.append(c) + if is_valid(new_num): + numbers.append(new_num) + print(new_num.number) + is_on_number = False + else: + #append to existing number + new_num.append(c) + else: + #not a number anymore so finish the number and add to num list if number is valid + if is_on_number: + if is_valid(new_num): + numbers.append(new_num) + #print(new_num.number) + #time.sleep(0.1) + is_on_number = False + +def check_gear_ratio(x,y): + check_upperleft = True + check_upper = True + check_upperright = True + check_midleft = True + check_midright = True + check_lowerleft = True + check_lower = True + check_lowerright = True + #if on first y dont check above + if y == 0: + check_upperleft,check_upper,check_upperright = (False,False,False) + #if on last y dont check below + if y == h-1: + check_lowerleft,check_lower,check_lowerright = (False,False,False) + # if on left or right horizontal edge + if x == 0: + check_midleft = False + check_upperleft = False + check_lowerleft = False + if x >= w-1: + check_midright = False + check_upperright = False + check_lowerright = False + + num_0 = False + num_1 = False + num_2 = False + num_3 = False + num_4 = False + num_5 = False + num_6 = False + num_7 = False + + total_nums = 0 + nums0=None + nums1=None + if check_upperleft: + if str(matrix[y-1][x-1]).isnumeric(): + num_0 = True + total_nums+=1 + if check_upper: + if str(matrix[y-1][x]).isnumeric(): + num_1 = True + if not num_0: + total_nums+=1 + if check_upperright: + if str(matrix[y-1][x+1]).isnumeric(): + num_2 = True + if not num_1: + total_nums+=1 + if check_midleft: + if str(matrix[y][x-1]).isnumeric(): + num_3 = True + total_nums+=1 + if check_midright: + if str(matrix[y][x+1]).isnumeric(): + num_4 = True + total_nums+=1 + if check_lowerleft: + if str(matrix[y+1][x-1]).isnumeric(): + num_5 = True + total_nums+=1 + if check_lower: + if str(matrix[y+1][x]).isnumeric(): + num_6 = True + if not num_5: + total_nums+=1 + if check_lowerright: + if str(matrix[y+1][x+1]).isnumeric(): + num_7 = True + if not num_6: + total_nums+=1 + if total_nums==2: + if num_0: + if num_1: + if num_2: + #three-digit string + nums0 = f"{matrix[y-1][x-1]}{matrix[y-1][x]}{matrix[y-1][x+1]}" + else: #if num_0, num_1, NOT num_2 + if str(matrix[y-1][x-2]).isnumeric(): + nums0 = f"{matrix[y-1][x-2]}{matrix[y-1][x-1]}{matrix[y-1][x]}" + else: #if num_0, NOT num_1 + #num_0 is true so number is ends on top-left corner + if str(matrix[y-1][x-2]).isnumeric(): + if str(matrix[y-1][x-3]).isnumeric(): + nums0 = f"{matrix[y-1][x-3]}{matrix[y-1][x-2]}{matrix[y-1][x-1]}" + else: + nums0 = f"{matrix[y-1][x-2]}{matrix[y-1][x-1]}" + else: + nums0 = f"{matrix[y-1][x-1]}" + + #check num_2 + if num_2: + if str(matrix[y-1][x+2]).isnumeric(): + if str(matrix[y-1][x+3]).isnumeric(): + nums1 = f"{matrix[y-1][x+1]}{matrix[y-1][x+2]}{matrix[y-1][x+3]}" + else: + nums1 = f"{matrix[y-1][x+1]}{matrix[y-1][x+2]}" + else: + nums1 = f"{matrix[y-1][x+1]}" + + else: #if NOT num_0 + if num_1: #NOt num_0, num_1 + if num_2: #NOT num_0, num_1, num_2 + #num 1 and num 2 are numbers so maybe the next digit is too + if str(matrix[y-1][x+2]).isnumeric(): + nums0 = f"{matrix[y-1][x]}{matrix[y-1][x+1]}{str(matrix[y-1][x+2])}" + else: + nums0 = f"{matrix[y-1][x]}{matrix[y-1][x+1]}" + else: #if NOT num 0, num 1, NOT num_2 + nums0 = f"{matrix[y-1][x]}" + else: #if NOT num0, NOT num_1 + if num_2: #if NOT num0, NOT num_1, num_2 + if str(matrix[y-1][x+2]).isnumeric(): + if str(matrix[y-1][x+3]).isnumeric(): + nums0 = f"{matrix[y-1][x+1]}{matrix[y-1][x+2]}{matrix[y-1][x+3]}" + else: + nums0 = f"{matrix[y-1][x+1]}{matrix[y-1][x+2]}" + else: + nums0 = f"{matrix[y-1][x+1]}" + else: #if NOT num0, NOT num_1, NOT num_2 + pass + if not nums1 is None: + return int(nums0)*int(nums1) + + if num_3: + if str(matrix[y][x-2]).isnumeric(): + if str(matrix[y][x-3]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y][x-3]}{matrix[y][x-2]}{matrix[y][x-1]}" + else: + nums1 = f"{matrix[y][x-3]}{matrix[y][x-2]}{matrix[y][x-1]}" + else: + if nums0 is None: + nums0 = f"{matrix[y][x-2]}{matrix[y][x-1]}" + else: + nums1 = f"{matrix[y][x-2]}{matrix[y][x-1]}" + else: + if nums0 is None: + nums0 = f"{matrix[y][x-1]}" + else: + nums1 = f"{matrix[y][x-1]}" + + if not nums1 is None: + return int(nums0)*int(nums1) + + if num_4: + if str(matrix[y][x+2]).isnumeric(): + if str(matrix[y][x+3]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y][x+1]}{matrix[y][x+2]}{matrix[y][x+3]}" + else: + nums1 = f"{matrix[y][x+1]}{matrix[y][x+2]}{matrix[y][x+3]}" + else: + if nums0 is None: + nums0 = f"{matrix[y][x+1]}{matrix[y][x+2]}" + else: + nums1 = f"{matrix[y][x+1]}{matrix[y][x+2]}" + else: + if nums0 is None: + nums0 = f"{matrix[y][x+1]}" + else: + nums1 = f"{matrix[y][x+1]}" + + if not nums1 is None: + return int(nums0)*int(nums1) + + + if num_5: + if num_6: + if num_7: + #three-digit string + if nums0 is None: + nums0 = f"{matrix[y+1][x-1]}{matrix[y+1][x]}{matrix[y+1][x+1]}" + else: + nums1 = f"{matrix[y+1][x-1]}{matrix[y+1][x]}{matrix[y+1][x+1]}" + else: #if num_0, num_1, NOT num_2 + if str(matrix[y+1][x-2]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y+1][x-2]}{matrix[y+1][x-1]}{matrix[y+1][x]}" + else: + nums1 = f"{matrix[y+1][x-2]}{matrix[y+1][x-1]}{matrix[y+1][x]}" + else: #if num_0, NOT num_1 + #num_0 is true so number is ends on top-left corner + if str(matrix[y+1][x-2]).isnumeric(): + if str(matrix[y+1][x-3]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y+1][x-3]}{matrix[y+1][x-2]}{matrix[y+1][x-1]}" + else: + nums1 = f"{matrix[y+1][x-3]}{matrix[y+1][x-2]}{matrix[y+1][x-1]}" + else: + if nums0 is None: + nums0 = f"{matrix[y+1][x-2]}{matrix[y+1][x-1]}" + else: + nums1 = f"{matrix[y+1][x-2]}{matrix[y+1][x-1]}" + else: + if nums0 is None: + nums0 = f"{matrix[y+1][x-1]}" + else: + nums1 = f"{matrix[y+1][x-1]}" + + #check num_2 + if num_7: + if str(matrix[y+1][x+2]).isnumeric(): + if str(matrix[y+1][x+3]).isnumeric(): + nums1 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}{matrix[y+1][x+3]}" + else: + nums1 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}" + else: + nums1 = f"{matrix[y+1][x+1]}" + + else: #if NOT num_0 + if num_6: #NOt num_0, num_1 + if num_7: #NOT num_0, num_1, num_2 + #num 1 and num 2 are numbers so maybe the next digit is too + if str(matrix[y+1][x+2]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y+1][x]}{matrix[y+1][x+1]}{str(matrix[y+1][x+2])}" + else: + nums1 = f"{matrix[y+1][x]}{matrix[y+1][x+1]}{str(matrix[y+1][x+2])}" + else: + if nums0 is None: + nums0 = f"{matrix[y+1][x]}{matrix[y+1][x+1]}" + else: + nums1 = f"{matrix[y+1][x]}{matrix[y+1][x+1]}" + else: #if NOT num 0, num 1, NOT num_2 + if nums0 is None: + nums0 = f"{matrix[y+1][x]}" + else: + nums1 = f"{matrix[y+1][x]}" + else: #if NOT num0, NOT num_1 + if num_7: #if NOT num0, NOT num_1, num_2 + if str(matrix[y+1][x+2]).isnumeric(): + if str(matrix[y+1][x+3]).isnumeric(): + if nums0 is None: + nums0 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}{matrix[y+1][x+3]}" + else: + nums1 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}{matrix[y+1][x+3]}" + else: + if nums0 is None: + nums0 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}" + else: + nums1 = f"{matrix[y+1][x+1]}{matrix[y+1][x+2]}" + else: + if nums0 is None: + nums0 = f"{matrix[y+1][x+1]}" + else: + nums1 = f"{matrix[y+1][x+1]}" + else: #if NOT num0, NOT num_1, NOT num_2 + pass + if not nums1 is None: + print(f"y {nums0} {nums1} {y}") + return int(nums0)*int(nums1) + return -1 + + +sum = 0 + +for y in range(h): + for x in range(w): + c = matrix[y][x] + if c == '*': + #check all 8 directions for part numbers + #since we are an asterisk, we don't have to check if numbers in range are valid since they automatically are :3 + gear_ratio = check_gear_ratio(x,y) + if not gear_ratio == -1: + sum+=int(gear_ratio) + + + + +print(sum) diff --git a/input_day3.txt b/input_day3.txt new file mode 100644 index 0000000..129fcb2 --- /dev/null +++ b/input_day3.txt @@ -0,0 +1,140 @@ +...........................................751........501...................................890.231...............829..168......143......... +......................................*.........841....*....../................+..311.......................441..........*...........202.... +.........332...60....537..697.......901.................609....678....261.....90................870....519...........272..449.......%....... +840.........*...........*....*..968......273...440.415..................*..................&......*...*......447................883...&..... +.....34....651.786...646...804.*..........*.../.....-..........=...............94......96..760.222.....637.%...&.290...55..368.....*..565... +.518*..........+................717......80.............231.....610...810*942..........*...................640...*................499....... +...................189......................772.........*........................550..626...676-......213......432...........790.......834.. +......995..=..........&..955...........391......387...825..362........481...334..*................579.*...84%.......506./................... +........*.700..............*..........*.......+..*............*...170.%..........733........658..*....832............-..777..616.915........ +......322...........977.526............852...410.14.........28.....$.........831.....%.....@.....586.........69.....................+....... +...............................30.........................*............./.....*.......505....274...........=.#....344...52.308.............. +.........123*504.................-...-..................15.968.....427.439...456..............*..935../..441......*.....*..*.....195.794.... +..729.............186...............786..476*168.653*.............*........................148...+...962...................271......*....... +............23.......................................435.491*4..40...-...26.......11..133..................*758.-....215.................... +466...656..=............957.........463.............................372..*..............................894.....661.......903.......%283.... +..................421...*.................32..946...%....668.886..........30.682......108...........................292..................189 +....759......379.*.....380.......................-..942..=....*...891......../.......*....193.......703..946/......./...................*... +.39*.........*...847............80-..........................886.*.....+.............418.@......763............432.....................873.. +...........916.......................335..369.....................651..624.445*809.........*695...*..267.......+....666.641.888.480......... +...@38...............685..149..........&.*..........312..................................27......544....*.420.........*....*..........*750.. +................&.....*..*...............208...........*...361.....&.....569................*986.....295...*..751..499.............549...... +.....@.......626...390..761....*.............$.........319....+.289..250*................189.....947......804....*......742*................ +.....660....................342.582.......24..611..................................354.*............*.............997.......595....874...... +...................................................109.........*...108.........252.*...168.@88...973................................#...$... +214.....161..............499-.......................%........497...*....419.....*...52.........................83.........*5.............739 +.......*...............................156..........................88........798..............204...............*.....444.......974........ +.108..39..................*651.395#.....*.............963.......911...............886.................532.....417...................-....... +....*..........921*82..321...........597...@321..409.....*254....../........237...*.......................&......./...................=308.. +.954..110........................................../.................478....*.....423.........990....187.429..#...506..........614*......... +........#...211.............................575.....................*....893...13.........811*................673.....85...........465...... +..................393...........782.............-166.........=.831...401........*.348....................477...........*.819..#261.......... +.....761..........*...536.....+....&.................549..427.....*...........924.@......283.50............*........795...=................. +....*....-.51....617./......954...................................248...................*........776....407................................. +.756..986..............326........516............387..342....336............142=.823..354....233.............$...........523........336..... +..........+495...856.....*....363....*188.177.4..+..............*....=512....................*...835......458..348..........*.......=....445 +................*.........638.$..............*.......214.........190......293...........&.128......*............*..167......711.........*... +...565.......842.................#.....................@...............=..#...........195.......984.....201#...530...................640.... +...*...........................289.401.......251...626..........198*..277....$..............%.......................719..........964........ +...397..910+............................$....*.....&.....936..............893../...........249.....#334.299.../503..........*....*.......... +..............................918-...420...405..............$...226.729.........910........................*.........892....76....511....... +...674=...282*418......#................................................962..........=693.....760..........499.908/..../.......$........*926 +.......................906..../......485*..........*......9....+....564*.........132.............*..........................137............. +...........................300...........960....503.572......490............608*.......*....504.979..25......230.................925...@.... +..673............787..............................................433*164.......961.956.596.........*...610...............340.......#...765. +....*....................8*............217*805..................*..................................427..*........680*....................... +....247..............699...848....................651........137.870.673............696..................660.........432...593=.........906. +..........209.........*....................327............................%..........%................3..................................... +.....%.../.....482...708...782............*..........520..................947....390...420.....%..............456.....667*544............732 +..305.......%.....*......%....%....220...419....608..*.............282............&....#........269......117-....*834.........546#.......... +............137...145.128...........%.............*.555.............*.......................=............................................... +....988.299.....................940.......978..971........437.......79..........*.........238.497...490.912.539.........85......157-........ +..........*.660....335......../...%........................*..224........@...556.368.............*...*...*..*...551......................474 +291..217..1..................321......-...................17.....*.......810............411......573.688...273.....*....$.............../... +....*.........=.......701............781...*....................761...........315........*........................895.445................... +...............467.......*...............444................................/../..........925..530+....50.....-............................. +........+..........545....970........./........767......543..............953........389.................$.....393......#....17....83........ +.668.....577...&..@............803.....931......*............829..226*.............*.......-....114................=..9.....&............298 +..../........239.......101...&...*..................419.....@.........922..17......598....704..*..................722...........768......... +.................776..*......156.163............419...@....................*...................465..+....................206=......-.*...... +....506.891-.......=.499....................@......#..........992..664....270......*395..............519.......666..............37...566.... +....&........251.................671.=.......474......429....*..../.............776.........#.............260.&....319......410*............ +............*.....46...772.........#.441.........340=..-.....393.....452..../..............219......487..*........*.....697................. +......993.507.............*.........................................&......515.231..#988........./..$...519.=...435.....*...........753..... +..177..=.......*17.........341..62.....361...820.....647+.........................*...........939...........980.......7.145....310....*..... +....*.....113.....................*17.....*..................583....585...........160..571............................*..............75..... +..937.163....*857...........322.......233..436..973................*............................678..................304.....#140........... +.........*............@................@.......@......412..521......917......+.............................................@..............32 +.........233.........5.......649.230..................*...%..................513....304.........745...85..31....799........958.............. +.....983........@...............*.....#......%.....340..........=....745...............*565........%..*..........*.....835.........../503... +.....*.......558....71.............518......546..........148..439....*.......567......................870..846$.519.......#..../17.......... +....945..381.......$........671@.....................390...........870..........+..%.........*..198..................347-...............164. +....................................................@.....-...............318......555....234.9................@..................134....... +..............489$....=608.............................&...40.*.................................................291.274...489.690*.......... +.....=485...........................633.462....+......490......370...............-......740..........416*..............*.................... +....................................*.....*.....125./.....#656.....679.....227....455.-....*.......*.................414................552. +.................227..............733.$....787.......532..............*879...-........681...148.188.426./.......547.........=.......645..... +....+..21.....75...*.....797...........73...................491...12............27......................727...@...*........912.............. +...258...*572.....955.......*..&...585.........*.......800.*...............@...-............................357.........................+... +...........................415.389.*........973.738.%..-...759.968....477..192.......553...#.......398..170......900..../..986..834$..758... +.........10......816..676..........356..............78............*..%..............*.....372......./......*..........322................... +.....122*..........*......%............590.............870..920..911............246..452................740...............199............... +...........444.....738....505...@.498...*...=..........*...................................946...................+.*......*................. +.....675.....*................180...%.957..335.295...&.222....-..........281..625....@....=.....695...........173..652......141...-......... +.......*....860........842.........................453.......809.....167....*..*..308..........*......902.101..................+...894..130. +.....834...............*....=138.........................224.....301...$..663.9.......58.....899.........*.................................. +........................948......................908............+...............#................74........384.454......69.....*724......... +...............4............84........990.949...*...................480...961..230......18........#..367......*............................. +......496.......*289..........*11............*..........139*129....@.........*........................*...255................532.....607.443 +......*................888....................812....................876..364......965....105.....446.612...*..12*............*......*...... +..374...833.........19*.......904.........432.......153.....78/...............267..........*..............800......285......890...618....... +...*......*...479..........*.*.................648.....+.........71...........*........53..216.686............3/....@..498...............346 +.739......28.....*760....112.725..145......133.../.#71.....737....$..*.....407..228......=........%....................=.............407*... +.....619............................=.........&.............../.....932........&.............................296.........348.+166........... +.......*.............22...-917......................................................-317........................=.........#........=.....111 +.......263...............................$........829......=...418-...........$..............599..304.............@..........849$..442..&... +..792%...........*880....499...........719....415*.......853................928...47...*59...@...*....679.......744......................... +.........590..589..........*...90...................*...............#282.........*..............568..$..........................736..383.321 +.........../.........481....87.*.................831.674....430.............270..393....................%65......................*......*... +....864.........809....*........922.979......................./....461.545.....@.....738........-.....................355.....646........... +.......%......@....#....539.........$.................*122............*....992...898*.....801.497.......#...&...@.................214..862.. +.............393...............................964.953..........503@......*........................764..143.17..385...........525...*....... +.......87.49......444#....................&............................108.....801..............*.....&................866.......$.334...626 +............*120.............736.971....595........715...462...=.....-........=.................754.............@.........*629.............. +.....331............620........*...*.........252.............987.=...846..........163..941.............-219...719...231*..........=......... +....../.........468*..........734...939.........+..220..934......170........745..-.................*....................635......650........ +.550.......&..........................................%.*.....................*.......&.........261.346.237..................#.............. +...*.528..303.546..........357.....878.....571..........755...619...661.....803.358.335....67.......................496...259.........25.... +.938.+....................*...........+.......*649.............*..../.....................*..........................*..........961....*.... +...........975........-....745...........312................134...........253.98...........362.......716.............94.+...620...+.-...62.. +............*.......123..............429....*26.......590............836&.@...........$..............=..................485.........821..... +....555......924...........287........../.............*............................837..........408......................................... +........265............924*.........784......382......354.............255..280.896...............+..........537....936....524...601......... +.............495........................177.....+...........148...628*......*............691.........776=..*......*......*.......&.......... +.....617....*....................832.....#........278*651...*...............767.......16.......66..........857.956.....145..............817. +.......*...560..........906..........635..........................526*.............44*...%....@......@981......................=...624.*.... +....446............-.../................*....................%........798...............796.....................448..........839...*....941. +.................523.......%.990..828-.537......22........771....251...........938..884........782....866..................@........776..... +.808...255..............527..$..............&......709*.............*....=....*........+.......*.........*..........908..659.675............ +..........=.-694.................225........603........523.......617...201.....85..............430.......982...62..=..........*...+...118... +.......=..........672............*.................713...................................120..........&.....................237..733........ +........723....77*.......765........453....296.......*...........................392.554*.......@......770.878.569..../..............757.... +........................./............*.......@.....518.................360*.................272...602........*....456....614/.............. +..............*677............593.460.51..571.................136..758.................422........+......................................... +...........265.......974....../...........=..............142..................82......+.........$......591*...........$......&.............. +....542........44.......*297.......................=.......*.......516.......$.................113.........198.......792..244......391...... +......&...$........737*.............743......741.64.....688........*...........647.986..+588..................................=......&..129. +...........4...........14..............$.397*................896..832...810*.........*.............656...........996..........618.......*... +.......765..................887....8..................226.......%...........149......884.678..........*...358....*................915....956 +........*...................*...../....514.............*................995......429.......@../969...434...*......955....../..210*.......... +.....672....@......@.......322.........*........404#...784.............../..#884....*......................506..........984..........708.... +..........757..712.195...............188.....................895...................326...501.480..&524..........998./..........996.....*.... +..972.160...............857..293..............274....-...-...........807...%............*....................+...*...128..313.........478... +...*..*...804............*...........334..110*.......974.459...........*....801........727.595..778.........699..800.........*.............. +.934..798.%...............37.....191.............*............@.......75...........486......*.................................323........... +................................*......387....477.200......360.......................*....962...47................................179....... +.....................884........985...................................67..145*.......292................191..323...213..............*....... +.....................$....860.............700.147..................$..&.......334........282..267...........*.........-.93..867........525.. +..............492.......&...*....91.......%...*....779.......-691.93.......@.........710.*....*...=...310..........97.....*./..........*.... +..........568*.......708...216..............780......*....................312........*....438.....346....$..$327...=......5........756..855. +.......................................261......807.261.............................42...................................................... \ No newline at end of file