1
+ preamb_len = 25
2
+
3
+ def find_incorrect_number (number , numbers ):
4
+ for index ,nr in enumerate (numbers ):
5
+ for nr_2 in numbers [index + 1 :]:
6
+ if nr + nr_2 == number :
7
+ return 0
8
+ return number
9
+
10
+ # Original solution
11
+ def find_summing_set (number , numbers ):
12
+ for startindex , _ in enumerate (numbers ):
13
+ for endindex in range (startindex + 1 , len (numbers )):
14
+ if sum (numbers [startindex : endindex ]) == number :
15
+ return numbers [startindex : endindex ]
16
+ return (0 )
17
+
18
+ # Molto più veloce!
19
+ # Dynamic programming solution
20
+ def find_summing_set_dynamic (number , numbers ):
21
+ size = len (numbers )
22
+ dp_matrix = [[- 1 + int (x == y ) for x in range (size )] for y in range (size )]
23
+ for startindex in range (0 ,size ):
24
+ for endindex in range (startindex + 1 ,size ):
25
+ dp_matrix [startindex ][endindex ] = dp_matrix [startindex ][endindex - 1 ] + numbers [endindex ]
26
+ if dp_matrix [startindex ][endindex ] == number :
27
+ return numbers [startindex : endindex ]
28
+ return (0 )
29
+
30
+
31
+ def main ():
32
+ f = open ("input" , "r" )
33
+ lines = [int (l .strip ()) for l in f .readlines ()]
34
+ for i , line in enumerate (lines [preamb_len :]):
35
+ incorrect_nr = find_incorrect_number (line , lines [i :i + preamb_len ])
36
+ if incorrect_nr :
37
+ print ("incorrect number found: " + str (incorrect_nr ))
38
+ summing_set = find_summing_set_dynamic (incorrect_nr , lines [0 :i + preamb_len ])
39
+ print ("weakness: " + str (max (summing_set ) + min (summing_set )))
40
+ main ()
0 commit comments