Added day 4 solution
This commit is contained in:
parent
c1be68903e
commit
2cdc0878a2
3 changed files with 694 additions and 0 deletions
19
4/example.txt
Normal file
19
4/example.txt
Normal file
|
@ -0,0 +1,19 @@
|
|||
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
|
||||
|
||||
22 13 17 11 0
|
||||
8 2 23 4 24
|
||||
21 9 14 16 7
|
||||
6 10 3 18 5
|
||||
1 12 20 15 19
|
||||
|
||||
3 15 0 2 22
|
||||
9 18 13 17 5
|
||||
19 8 7 25 23
|
||||
20 11 10 24 4
|
||||
14 21 16 12 6
|
||||
|
||||
14 21 17 24 4
|
||||
10 16 15 9 19
|
||||
18 8 23 26 20
|
||||
22 11 13 6 5
|
||||
2 0 12 3 7
|
601
4/input.txt
Normal file
601
4/input.txt
Normal file
|
@ -0,0 +1,601 @@
|
|||
13,79,74,35,76,12,43,71,87,72,23,91,31,67,58,61,96,16,81,92,41,6,32,86,77,42,0,55,68,14,53,26,25,11,45,94,75,1,93,83,52,7,4,22,34,64,69,88,65,66,39,97,27,29,78,5,49,82,54,46,51,28,98,36,48,15,2,50,38,24,89,59,8,3,18,47,10,90,21,80,73,33,85,62,19,37,57,95,60,20,99,17,63,56,84,44,40,70,9,30
|
||||
|
||||
14 86 50 89 49
|
||||
10 85 33 46 87
|
||||
82 91 54 13 90
|
||||
63 88 75 99 79
|
||||
74 31 4 0 71
|
||||
|
||||
56 3 70 2 22
|
||||
44 63 10 95 8
|
||||
92 62 83 4 93
|
||||
74 80 5 11 68
|
||||
24 50 42 65 72
|
||||
|
||||
42 21 72 26 7
|
||||
4 78 1 49 50
|
||||
93 43 38 71 68
|
||||
62 52 40 61 82
|
||||
31 28 16 96 18
|
||||
|
||||
46 77 11 86 64
|
||||
4 14 61 94 30
|
||||
76 21 7 2 92
|
||||
55 1 66 45 23
|
||||
65 51 67 26 29
|
||||
|
||||
1 89 70 73 81
|
||||
75 40 93 15 60
|
||||
11 58 37 42 26
|
||||
62 36 20 87 47
|
||||
54 35 6 23 10
|
||||
|
||||
2 13 21 69 71
|
||||
98 59 82 7 32
|
||||
67 90 62 51 19
|
||||
84 6 23 3 17
|
||||
24 10 25 0 47
|
||||
|
||||
28 10 26 86 65
|
||||
33 18 21 6 99
|
||||
40 61 30 58 34
|
||||
29 37 78 4 83
|
||||
87 53 44 22 32
|
||||
|
||||
19 35 93 78 26
|
||||
87 99 15 75 56
|
||||
70 22 33 27 24
|
||||
58 53 83 48 8
|
||||
62 66 18 89 25
|
||||
|
||||
30 25 67 77 47
|
||||
99 0 44 40 23
|
||||
31 19 52 55 7
|
||||
65 22 12 27 71
|
||||
82 62 54 78 18
|
||||
|
||||
17 19 56 93 15
|
||||
62 30 64 68 21
|
||||
32 84 43 81 51
|
||||
61 83 52 65 58
|
||||
90 87 31 67 10
|
||||
|
||||
95 76 21 10 1
|
||||
81 30 64 51 44
|
||||
77 31 32 94 90
|
||||
58 48 11 43 37
|
||||
12 19 82 85 80
|
||||
|
||||
79 91 84 44 35
|
||||
80 6 64 0 20
|
||||
7 36 33 17 51
|
||||
71 19 24 26 2
|
||||
75 37 25 59 11
|
||||
|
||||
48 91 17 38 16
|
||||
54 46 53 33 28
|
||||
20 6 68 96 45
|
||||
70 75 35 65 59
|
||||
0 39 13 23 4
|
||||
|
||||
41 83 90 95 17
|
||||
67 4 23 62 93
|
||||
31 1 51 21 16
|
||||
34 14 92 66 89
|
||||
0 78 58 80 96
|
||||
|
||||
67 2 42 36 32
|
||||
1 62 37 65 79
|
||||
66 80 19 75 0
|
||||
17 86 94 49 54
|
||||
40 59 16 14 30
|
||||
|
||||
33 70 65 6 20
|
||||
44 22 55 81 15
|
||||
54 2 13 5 1
|
||||
93 40 97 67 78
|
||||
30 75 96 41 7
|
||||
|
||||
40 96 24 19 32
|
||||
88 58 65 34 52
|
||||
38 49 50 5 35
|
||||
4 13 2 22 26
|
||||
46 55 18 89 33
|
||||
|
||||
64 17 54 59 16
|
||||
22 97 91 83 87
|
||||
0 3 85 92 43
|
||||
99 31 19 73 4
|
||||
8 41 68 48 75
|
||||
|
||||
37 45 16 50 57
|
||||
31 14 32 77 60
|
||||
90 63 3 40 8
|
||||
96 6 56 95 2
|
||||
80 69 61 52 24
|
||||
|
||||
84 50 31 7 40
|
||||
32 58 47 51 70
|
||||
59 76 44 83 72
|
||||
87 52 77 10 81
|
||||
57 1 12 37 73
|
||||
|
||||
14 74 7 98 95
|
||||
78 47 1 22 96
|
||||
45 80 92 37 21
|
||||
15 10 33 73 63
|
||||
29 34 51 27 31
|
||||
|
||||
76 21 26 20 22
|
||||
89 58 37 91 38
|
||||
59 9 74 24 96
|
||||
80 69 30 7 0
|
||||
70 87 16 78 49
|
||||
|
||||
69 79 75 99 65
|
||||
20 48 61 29 67
|
||||
31 86 90 72 57
|
||||
62 83 94 74 1
|
||||
34 13 55 56 36
|
||||
|
||||
54 52 66 15 29
|
||||
7 16 94 62 92
|
||||
50 80 6 24 58
|
||||
96 13 93 1 0
|
||||
65 3 12 44 76
|
||||
|
||||
45 43 51 92 86
|
||||
60 70 3 23 69
|
||||
63 78 30 66 48
|
||||
17 74 81 75 37
|
||||
79 53 25 28 15
|
||||
|
||||
69 60 98 68 37
|
||||
18 39 36 48 75
|
||||
50 3 52 11 87
|
||||
57 46 63 80 41
|
||||
89 12 94 84 25
|
||||
|
||||
79 11 64 51 67
|
||||
17 47 98 57 5
|
||||
16 70 49 0 83
|
||||
32 56 84 73 86
|
||||
74 59 35 15 6
|
||||
|
||||
6 94 81 28 82
|
||||
53 58 43 46 51
|
||||
17 20 18 96 41
|
||||
66 22 27 12 44
|
||||
93 40 78 26 54
|
||||
|
||||
28 88 94 9 16
|
||||
14 66 2 98 82
|
||||
23 69 44 75 10
|
||||
38 34 18 51 1
|
||||
68 52 29 0 39
|
||||
|
||||
11 45 80 94 89
|
||||
24 44 96 71 58
|
||||
97 2 46 92 12
|
||||
47 19 99 55 7
|
||||
64 62 72 23 61
|
||||
|
||||
99 92 94 38 98
|
||||
10 97 40 57 30
|
||||
67 77 7 64 23
|
||||
88 80 58 78 59
|
||||
42 69 68 16 60
|
||||
|
||||
68 74 52 73 18
|
||||
62 57 49 91 19
|
||||
21 48 51 22 70
|
||||
45 29 53 75 8
|
||||
42 17 20 47 31
|
||||
|
||||
76 29 88 23 65
|
||||
80 2 90 75 48
|
||||
93 55 10 50 81
|
||||
74 54 6 89 18
|
||||
27 26 84 11 78
|
||||
|
||||
69 39 34 79 12
|
||||
72 96 80 68 44
|
||||
27 57 99 61 64
|
||||
81 63 6 25 95
|
||||
8 32 15 74 35
|
||||
|
||||
40 38 2 63 21
|
||||
28 57 90 19 49
|
||||
68 75 11 24 44
|
||||
45 50 15 27 9
|
||||
31 30 52 33 36
|
||||
|
||||
4 55 11 83 95
|
||||
35 0 30 25 45
|
||||
73 31 94 22 28
|
||||
91 19 50 54 47
|
||||
14 90 71 98 23
|
||||
|
||||
31 55 45 78 67
|
||||
1 24 51 25 80
|
||||
85 96 46 87 64
|
||||
37 93 22 59 90
|
||||
69 70 50 17 53
|
||||
|
||||
20 66 46 83 91
|
||||
28 57 99 63 1
|
||||
17 59 54 47 55
|
||||
50 10 41 53 34
|
||||
3 39 97 9 38
|
||||
|
||||
58 29 70 23 95
|
||||
96 67 84 59 45
|
||||
35 64 63 77 52
|
||||
31 14 33 12 78
|
||||
17 36 98 0 71
|
||||
|
||||
83 68 7 9 75
|
||||
13 39 5 99 73
|
||||
82 60 14 8 63
|
||||
49 86 67 56 91
|
||||
62 52 36 1 29
|
||||
|
||||
24 65 75 31 63
|
||||
48 72 14 70 0
|
||||
85 30 42 33 87
|
||||
26 8 29 4 96
|
||||
93 60 74 9 50
|
||||
|
||||
16 98 31 91 43
|
||||
90 76 97 18 70
|
||||
67 2 45 41 58
|
||||
7 8 26 62 61
|
||||
72 21 63 69 17
|
||||
|
||||
15 28 96 16 24
|
||||
45 41 62 89 67
|
||||
57 4 80 23 3
|
||||
29 51 99 94 68
|
||||
56 37 81 54 63
|
||||
|
||||
61 81 6 46 77
|
||||
28 43 63 10 41
|
||||
76 12 82 23 13
|
||||
32 47 94 96 92
|
||||
7 29 69 22 64
|
||||
|
||||
68 64 51 69 96
|
||||
76 18 88 43 55
|
||||
8 91 73 83 54
|
||||
0 35 94 20 97
|
||||
50 29 82 71 75
|
||||
|
||||
28 56 92 79 36
|
||||
18 85 35 25 26
|
||||
51 54 53 21 59
|
||||
64 19 17 14 30
|
||||
9 84 5 93 46
|
||||
|
||||
58 3 5 76 57
|
||||
55 64 79 16 97
|
||||
14 59 93 24 60
|
||||
84 49 44 69 15
|
||||
87 42 43 25 18
|
||||
|
||||
5 90 79 46 80
|
||||
41 56 93 15 50
|
||||
53 25 95 39 0
|
||||
77 89 40 17 92
|
||||
9 73 85 28 42
|
||||
|
||||
20 85 78 73 74
|
||||
59 12 82 24 52
|
||||
55 33 11 28 60
|
||||
15 25 61 16 45
|
||||
3 14 39 95 92
|
||||
|
||||
82 94 47 30 79
|
||||
38 87 15 31 45
|
||||
69 63 98 72 1
|
||||
77 39 96 81 92
|
||||
16 71 80 86 2
|
||||
|
||||
38 60 28 94 24
|
||||
40 46 67 22 34
|
||||
39 70 71 3 96
|
||||
27 54 41 69 18
|
||||
23 62 1 61 84
|
||||
|
||||
74 85 15 44 11
|
||||
39 92 43 79 1
|
||||
82 8 26 9 57
|
||||
20 93 18 97 31
|
||||
67 81 17 21 13
|
||||
|
||||
54 63 83 89 51
|
||||
0 8 15 25 59
|
||||
95 74 18 28 98
|
||||
50 3 34 23 77
|
||||
4 24 61 90 88
|
||||
|
||||
11 64 61 28 27
|
||||
5 35 74 75 47
|
||||
69 84 17 62 9
|
||||
40 21 32 73 67
|
||||
92 36 12 51 26
|
||||
|
||||
35 50 7 26 36
|
||||
43 56 42 41 48
|
||||
59 54 91 55 33
|
||||
37 13 19 20 88
|
||||
22 21 51 4 69
|
||||
|
||||
93 48 8 94 6
|
||||
14 34 13 10 32
|
||||
64 90 92 23 15
|
||||
63 95 85 28 87
|
||||
38 5 91 75 24
|
||||
|
||||
94 68 32 85 10
|
||||
75 33 0 52 37
|
||||
82 8 24 58 93
|
||||
49 73 63 44 61
|
||||
71 50 16 88 72
|
||||
|
||||
93 71 54 20 51
|
||||
39 92 75 79 66
|
||||
6 58 52 22 63
|
||||
74 53 99 16 61
|
||||
29 96 11 83 24
|
||||
|
||||
32 26 10 77 16
|
||||
31 92 58 44 79
|
||||
17 2 72 29 8
|
||||
93 38 9 15 3
|
||||
50 89 61 88 81
|
||||
|
||||
95 65 70 27 79
|
||||
4 19 30 86 72
|
||||
80 61 68 74 49
|
||||
7 5 77 14 53
|
||||
98 44 51 43 93
|
||||
|
||||
59 70 44 52 14
|
||||
31 82 9 55 13
|
||||
15 63 99 26 61
|
||||
34 48 23 56 41
|
||||
97 79 28 29 93
|
||||
|
||||
26 86 35 66 67
|
||||
25 39 48 45 69
|
||||
44 93 13 17 81
|
||||
70 89 54 62 68
|
||||
41 36 90 83 12
|
||||
|
||||
92 59 53 11 83
|
||||
43 70 30 8 66
|
||||
46 6 31 56 90
|
||||
62 20 65 94 34
|
||||
67 96 47 71 17
|
||||
|
||||
34 85 72 51 46
|
||||
21 6 44 64 27
|
||||
79 86 29 33 35
|
||||
7 87 47 94 84
|
||||
62 90 58 80 73
|
||||
|
||||
7 73 50 0 35
|
||||
77 6 33 89 94
|
||||
71 52 95 53 8
|
||||
22 9 46 49 75
|
||||
45 56 96 87 67
|
||||
|
||||
85 64 44 39 57
|
||||
90 30 15 35 54
|
||||
78 89 55 99 12
|
||||
80 96 20 50 45
|
||||
56 10 71 59 17
|
||||
|
||||
66 87 77 71 45
|
||||
79 65 80 11 88
|
||||
74 99 30 89 73
|
||||
58 78 64 85 20
|
||||
10 41 1 44 49
|
||||
|
||||
38 47 3 60 27
|
||||
8 10 14 4 1
|
||||
92 24 46 16 95
|
||||
55 69 77 7 36
|
||||
15 51 13 58 76
|
||||
|
||||
61 3 71 38 46
|
||||
34 93 42 90 32
|
||||
99 16 73 55 6
|
||||
48 23 56 12 39
|
||||
22 87 51 70 89
|
||||
|
||||
8 58 99 23 56
|
||||
91 62 68 57 32
|
||||
46 95 21 3 75
|
||||
35 51 33 7 74
|
||||
26 2 89 76 48
|
||||
|
||||
93 89 88 49 55
|
||||
11 29 72 27 35
|
||||
45 5 46 18 65
|
||||
23 32 30 97 42
|
||||
76 19 22 77 78
|
||||
|
||||
17 43 19 2 42
|
||||
20 26 36 68 75
|
||||
38 94 37 99 93
|
||||
62 46 1 45 89
|
||||
59 7 92 78 22
|
||||
|
||||
75 41 53 45 7
|
||||
91 55 40 31 36
|
||||
29 78 90 17 57
|
||||
63 20 77 67 42
|
||||
64 62 11 48 84
|
||||
|
||||
26 89 27 47 91
|
||||
15 9 18 62 28
|
||||
31 96 42 81 86
|
||||
11 52 20 93 38
|
||||
83 64 39 1 60
|
||||
|
||||
99 48 86 72 92
|
||||
38 32 62 18 17
|
||||
93 71 76 73 64
|
||||
26 36 74 52 68
|
||||
24 98 34 88 45
|
||||
|
||||
18 84 79 52 42
|
||||
54 10 33 90 64
|
||||
35 1 78 62 65
|
||||
22 48 87 72 50
|
||||
56 3 49 20 63
|
||||
|
||||
14 50 79 84 49
|
||||
17 46 66 80 87
|
||||
97 90 24 65 73
|
||||
25 30 94 72 99
|
||||
78 89 81 96 28
|
||||
|
||||
7 24 96 54 86
|
||||
4 56 83 32 27
|
||||
29 91 73 34 45
|
||||
16 70 1 39 3
|
||||
94 47 44 42 87
|
||||
|
||||
44 74 52 65 22
|
||||
5 46 75 27 12
|
||||
25 24 43 21 42
|
||||
19 80 60 97 3
|
||||
8 84 9 87 94
|
||||
|
||||
62 80 7 66 82
|
||||
60 79 45 1 75
|
||||
55 54 85 64 96
|
||||
65 6 16 27 38
|
||||
77 26 74 71 91
|
||||
|
||||
55 23 59 47 62
|
||||
53 92 34 96 58
|
||||
38 3 88 46 60
|
||||
50 56 83 39 80
|
||||
37 6 93 7 94
|
||||
|
||||
56 26 45 73 16
|
||||
37 30 74 44 64
|
||||
53 70 29 21 49
|
||||
4 5 27 92 22
|
||||
36 8 63 50 69
|
||||
|
||||
70 83 15 22 56
|
||||
64 98 32 39 12
|
||||
82 21 73 19 14
|
||||
44 61 78 26 99
|
||||
76 24 81 38 85
|
||||
|
||||
56 55 64 39 19
|
||||
13 70 63 32 54
|
||||
85 22 14 27 73
|
||||
25 89 15 44 21
|
||||
29 77 79 23 10
|
||||
|
||||
84 27 63 34 5
|
||||
57 81 78 90 59
|
||||
35 85 51 54 48
|
||||
92 4 89 70 30
|
||||
97 0 7 86 26
|
||||
|
||||
4 44 88 71 6
|
||||
80 23 19 55 57
|
||||
91 7 18 27 95
|
||||
85 13 66 8 34
|
||||
63 45 77 17 84
|
||||
|
||||
58 7 56 38 48
|
||||
92 97 50 80 54
|
||||
5 8 17 49 23
|
||||
96 82 20 74 4
|
||||
90 0 59 93 30
|
||||
|
||||
44 97 88 33 11
|
||||
18 69 4 0 94
|
||||
13 57 24 9 53
|
||||
49 7 68 15 42
|
||||
25 39 52 6 98
|
||||
|
||||
31 65 59 74 12
|
||||
22 39 13 2 16
|
||||
44 46 90 60 93
|
||||
82 9 71 99 89
|
||||
23 80 35 51 41
|
||||
|
||||
47 30 75 73 22
|
||||
62 87 59 42 90
|
||||
9 5 41 54 32
|
||||
71 25 46 24 12
|
||||
53 28 77 33 76
|
||||
|
||||
36 25 2 74 29
|
||||
58 34 44 94 83
|
||||
16 72 69 45 28
|
||||
88 0 86 14 49
|
||||
10 56 24 82 73
|
||||
|
||||
27 42 83 51 61
|
||||
93 77 33 49 46
|
||||
23 5 41 48 90
|
||||
81 10 3 16 1
|
||||
84 36 40 88 54
|
||||
|
||||
60 85 7 28 39
|
||||
54 11 4 18 84
|
||||
63 95 62 13 82
|
||||
93 33 40 16 55
|
||||
34 78 29 56 66
|
||||
|
||||
51 99 73 14 69
|
||||
3 65 23 60 96
|
||||
1 49 78 55 25
|
||||
15 66 11 42 87
|
||||
48 52 56 34 38
|
||||
|
||||
60 59 65 32 73
|
||||
68 76 35 75 42
|
||||
72 70 45 34 38
|
||||
29 84 28 62 43
|
||||
49 85 31 57 23
|
||||
|
||||
42 57 40 73 32
|
||||
70 79 80 11 67
|
||||
55 26 87 92 19
|
||||
63 58 78 29 77
|
||||
17 74 18 20 60
|
||||
|
||||
84 99 72 74 62
|
||||
15 14 50 57 77
|
||||
48 91 55 46 82
|
||||
85 27 33 21 54
|
||||
45 31 43 40 60
|
||||
|
||||
73 37 66 67 19
|
||||
16 79 15 45 89
|
||||
84 78 69 28 46
|
||||
17 4 12 95 87
|
||||
49 99 31 9 36
|
||||
|
||||
61 34 98 60 74
|
||||
30 95 33 46 64
|
||||
73 97 12 26 7
|
||||
2 58 49 70 54
|
||||
80 55 94 91 11
|
||||
|
||||
27 5 3 62 49
|
||||
38 88 40 9 47
|
||||
29 59 94 74 12
|
||||
48 73 85 97 35
|
||||
28 25 30 14 83
|
74
4/solution.hs
Normal file
74
4/solution.hs
Normal file
|
@ -0,0 +1,74 @@
|
|||
import Data.List
|
||||
import Debug.Trace
|
||||
|
||||
main :: IO ()
|
||||
main = readFile "4/input.txt" >>= print . solve . parse . lines
|
||||
|
||||
type Input = ([Int], [Board])
|
||||
|
||||
parse :: [String] -> Input
|
||||
parse (l : ls) = (n, b)
|
||||
where
|
||||
n = map read (words [ if c == ',' then ' ' else c | c <- l ])
|
||||
b = parseBoards (filter (/= "") ls)
|
||||
|
||||
solve :: Input -> (Int, Int)
|
||||
solve input = (f input, g input)
|
||||
where f = uncurry winBingo
|
||||
g = uncurry loseBingo
|
||||
|
||||
parseBoards :: [String] -> [Board]
|
||||
parseBoards [] = []
|
||||
parseBoards list = Board (map (map (Unmarked . read) . words) a) : parseBoards b
|
||||
where
|
||||
(a, b) = splitAt 5 list
|
||||
|
||||
newtype Board = Board [[Cell]]
|
||||
deriving
|
||||
Show
|
||||
|
||||
data Cell = Unmarked Int
|
||||
| Marked Int
|
||||
deriving
|
||||
Show
|
||||
|
||||
hasWon :: Board -> Bool
|
||||
hasWon (Board b) = completed b || completed (transpose b)
|
||||
where
|
||||
completed = any (all isMarked)
|
||||
|
||||
isMarked :: Cell -> Bool
|
||||
isMarked (Marked _) = True
|
||||
isMarked _ = False
|
||||
|
||||
winBingo :: [Int] -> [Board] -> Int
|
||||
winBingo (n : ns) (b : bs) =
|
||||
if any hasWon r
|
||||
then score n $ head (filter hasWon r)
|
||||
else winBingo ns r
|
||||
where
|
||||
r = iter n (b : bs)
|
||||
|
||||
loseBingo :: [Int] -> [Board] -> Int
|
||||
loseBingo (n : ns) [board]
|
||||
| hasWon b = score n b
|
||||
| otherwise = loseBingo ns [b]
|
||||
where
|
||||
[b] = iter n [board]
|
||||
loseBingo (n : ns) (b : bs) =
|
||||
loseBingo ns (filter (not . hasWon) r)
|
||||
where
|
||||
r = iter n (b : bs)
|
||||
|
||||
iter :: Int -> [Board] -> [Board]
|
||||
iter n (b : bs) = callNumber n b : iter n bs
|
||||
iter _ [] = []
|
||||
|
||||
callNumber :: Int -> Board -> Board
|
||||
callNumber n (Board b) = Board (map (map mark) b)
|
||||
where
|
||||
mark (Unmarked x) | x == n = Marked x
|
||||
mark v = v
|
||||
|
||||
score :: Int -> Board -> Int
|
||||
score n (Board b) = n * sum [ x | c <- b, Unmarked x <- c ]
|
Loading…
Reference in a new issue