1
0
Fork 0

Added Day 4 Part 1

day8-work 4.1
Ishan Jain 1 year ago
parent 4d7deb7de3
commit e79094fc00

@ -0,0 +1,20 @@
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

@ -0,0 +1,602 @@
50,68,2,1,69,32,87,10,31,21,78,23,62,98,16,99,65,35,27,96,66,26,74,72,45,52,81,60,38,57,54,19,18,77,71,29,51,41,22,6,58,5,42,92,85,64,94,12,83,11,17,14,37,36,59,33,0,93,34,70,97,7,76,20,3,88,43,47,8,79,80,63,9,25,56,75,15,4,82,67,39,30,89,86,46,90,48,73,91,55,95,28,49,61,44,84,40,53,13,24
38 80 23 60 82
25 35 28 47 39
40 0 30 48 76
32 41 49 69 4
13 42 89 20 12
76 89 13 5 98
87 48 2 59 20
37 88 41 24 57
16 85 31 73 95
70 11 93 30 27
81 55 41 85 33
67 97 71 90 52
19 3 79 66 14
49 96 94 26 25
60 46 51 82 9
33 60 26 83 21
91 7 39 19 41
88 9 82 69 29
93 79 12 34 11
43 65 64 54 20
55 75 71 30 14
42 67 3 73 13
78 72 51 96 99
95 10 84 0 31
91 47 66 33 34
11 72 55 52 79
94 34 53 61 40
8 31 49 68 71
37 45 15 78 57
21 88 65 24 56
65 59 4 41 69
44 61 23 46 42
10 68 37 54 25
82 2 13 71 93
87 90 89 57 74
75 70 40 68 30
5 28 58 52 19
80 96 53 43 63
33 60 66 64 56
88 74 9 8 36
58 38 46 42 89
98 85 17 51 2
28 92 22 64 53
27 97 43 10 54
75 56 71 67 79
75 86 11 4 39
14 80 41 26 2
97 18 96 5 28
44 68 54 88 35
57 98 74 21 19
45 16 4 23 63
44 37 99 21 85
2 82 58 10 84
0 47 53 33 20
93 19 39 72 8
5 25 24 32 44
59 37 95 88 89
68 69 8 96 99
16 0 7 92 94
65 15 55 66 31
65 14 92 66 69
43 45 30 8 26
87 47 18 82 76
33 80 67 35 22
38 62 84 96 52
39 45 15 57 53
35 47 70 4 0
50 17 65 78 3
2 7 28 36 42
99 48 27 83 72
52 47 81 44 92
35 86 36 71 29
57 15 1 95 7
68 77 6 3 31
20 13 58 89 93
2 56 27 4 64
69 91 88 58 15
10 92 61 63 6
84 93 79 25 90
16 31 55 46 53
23 42 93 12 30
47 99 38 0 14
6 90 72 70 21
62 61 96 87 22
5 55 51 28 17
42 12 58 95 92
67 89 88 87 47
32 72 11 83 97
55 16 66 57 29
54 64 96 2 36
72 47 69 68 12
23 4 37 79 13
52 5 59 58 70
44 3 21 93 76
97 0 35 9 71
87 49 55 18 94
68 32 99 50 37
15 3 80 90 42
83 12 41 21 58
91 89 74 45 51
5 60 13 46 47
18 54 33 26 0
28 43 83 31 20
12 75 34 36 4
76 2 80 70 79
16 66 25 97 20
52 23 80 74 90
31 81 95 28 36
99 8 50 57 98
11 0 30 35 39
12 33 36 90 30
59 66 77 25 46
88 24 4 41 50
18 52 37 75 43
68 49 56 84 87
27 80 51 25 93
4 41 61 30 67
68 47 15 20 50
78 66 97 54 84
35 1 23 89 14
82 51 38 80 75
35 79 43 54 3
73 13 23 25 59
27 64 47 62 66
83 0 7 4 20
67 2 72 23 81
46 1 26 85 25
31 65 52 16 14
15 4 91 59 19
83 60 10 89 90
62 63 13 96 6
24 91 27 29 81
38 47 50 26 36
79 73 22 45 58
15 54 76 46 70
42 69 91 34 9
96 28 61 41 56
15 5 59 47 50
79 27 4 0 21
51 44 26 95 32
9 38 6 58 99
89 69 96 33 73
26 20 32 12 27
67 29 79 81 59
66 45 24 36 68
99 52 1 66 64
15 76 36 75 83
48 7 95 71 6
31 28 65 14 69
10 38 46 74 96
15 12 59 98 54
18 75 48 65 96
57 38 2 86 5
0 87 93 23 94
50 29 13 91 14
55 83 80 45 52
44 31 64 25 71
15 85 50 91 54
9 29 78 74 23
73 82 75 58 98
63 56 29 80 25
53 52 91 18 24
73 83 7 11 87
79 47 41 59 78
13 51 9 21 20
28 35 98 80 63
30 60 34 99 32
11 61 15 73 24
55 74 42 38 26
22 17 43 75 71
97 53 65 75 51
96 74 81 69 71
76 5 49 60 41
86 64 90 92 30
6 95 85 93 40
65 90 20 4 82
41 17 48 27 77
84 60 94 15 10
55 64 49 35 16
36 8 23 58 59
74 19 70 35 82
77 21 84 50 25
18 61 12 28 54
0 3 72 85 87
78 4 57 38 16
1 63 0 38 23
31 76 73 22 35
8 72 44 25 45
70 33 29 37 21
49 50 85 57 61
37 50 51 12 93
83 80 87 6 88
4 95 62 20 41
78 56 76 49 11
72 7 52 14 28
72 34 61 19 68
2 67 88 7 55
8 11 20 85 47
42 54 46 48 64
38 84 3 76 13
32 34 55 90 64
16 1 94 48 91
96 45 27 58 63
98 20 43 73 10
87 52 49 8 24
6 9 31 37 29
45 55 12 23 67
86 0 81 49 1
18 25 7 15 50
32 34 90 99 69
38 73 44 17 52
7 81 85 62 98
68 66 86 21 76
24 94 50 46 67
36 54 55 96 8
90 39 51 5 99
33 20 14 1 81
94 74 38 95 35
37 96 62 57 84
65 11 55 46 69
26 29 75 3 55
33 83 68 94 47
37 41 85 50 57
76 39 5 81 20
18 24 92 71 87
89 92 39 70 59
40 35 23 62 47
7 16 22 34 71
15 97 86 91 3
54 26 56 44 29
93 91 66 8 78
60 48 51 6 57
69 35 87 65 73
53 32 94 49 89
88 34 23 84 59
41 57 7 37 0
79 2 86 82 9
25 69 14 78 33
4 28 85 8 61
97 72 88 1 54
24 84 65 28 60
99 86 53 93 22
17 67 10 29 54
27 0 96 20 36
25 3 62 89 33
10 28 78 82 96
21 11 51 27 97
41 63 72 58 89
7 0 76 67 19
52 38 87 18 13
73 35 49 44 79
76 47 94 53 82
11 61 88 86 83
81 60 33 99 72
84 26 40 8 54
31 50 40 9 80
6 59 51 55 12
2 34 93 38 13
11 82 21 20 72
89 83 60 53 79
42 54 52 13 85
99 76 87 44 26
36 50 0 59 82
10 73 29 72 27
79 31 64 51 91
68 49 65 94 3
46 2 6 78 93
63 31 53 27 60
21 67 99 22 95
24 9 18 76 33
31 95 91 18 37
83 2 78 75 8
77 33 9 12 22
24 50 80 93 39
21 47 35 70 94
2 44 55 60 89
45 18 46 72 11
47 83 56 52 65
4 19 21 14 34
25 80 16 48 36
53 92 71 14 95
98 51 54 15 82
48 87 99 46 83
42 86 11 43 18
72 28 37 93 78
84 79 30 28 98
33 80 65 82 25
35 29 46 13 60
90 69 52 78 64
55 94 0 48 56
42 71 26 93 82
47 36 31 89 69
65 5 41 1 32
74 17 64 11 68
23 54 61 99 37
97 4 22 2 38
8 17 79 99 20
44 80 28 57 32
18 86 94 77 70
11 93 75 49 3
80 48 85 89 23
30 50 94 46 18
59 9 81 42 8
40 15 90 26 31
0 51 39 36 65
93 63 15 87 25
90 44 65 23 66
22 27 20 17 45
42 62 14 0 57
46 4 10 35 96
44 43 60 80 86
48 45 78 40 19
54 98 32 17 69
25 11 14 34 63
26 20 59 0 74
0 59 87 45 30
33 36 1 38 43
67 37 74 2 70
85 22 44 56 23
68 24 75 92 10
90 83 87 85 67
95 24 94 6 40
77 15 52 68 66
22 20 38 29 79
3 10 62 13 16
9 49 87 13 18
85 39 77 82 86
96 44 12 72 78
59 81 21 94 88
17 93 23 56 45
57 53 80 98 22
23 45 5 26 77
6 28 4 25 83
59 55 58 75 92
72 36 99 82 97
74 33 53 49 86
9 50 66 7 78
29 36 71 26 87
54 82 84 47 46
39 30 56 22 27
6 49 84 14 43
41 44 29 18 79
93 56 77 64 26
15 13 96 9 80
50 54 75 99 24
58 49 91 69 63
16 55 19 18 84
13 79 42 56 0
36 27 60 74 53
66 61 62 54 15
85 22 43 79 90
77 21 75 66 15
25 68 69 35 78
88 3 18 50 7
8 27 52 76 72
12 56 0 45 33
13 81 25 24 41
80 65 9 32 95
18 44 36 68 99
78 29 17 38 43
57 41 77 5 10
98 30 70 23 46
9 19 11 34 74
43 33 32 95 14
65 8 68 50 88
49 93 95 1 55
57 92 58 0 90
69 15 23 62 56
54 37 6 96 11
26 80 70 79 88
46 76 82 77 19
4 50 83 88 69
67 44 59 25 21
40 12 90 33 24
63 78 9 71 86
74 82 88 25 15
61 83 7 6 98
41 9 84 13 72
78 26 8 60 20
4 58 29 93 11
46 60 44 55 63
91 19 58 56 85
2 32 67 26 41
43 61 25 73 21
86 14 71 9 6
38 72 58 17 77
25 79 78 5 67
81 70 50 85 73
7 69 14 80 6
93 51 60 42 29
82 28 99 66 27
35 97 91 90 80
87 7 55 78 17
83 36 98 37 72
58 43 51 49 56
93 72 61 19 74
81 44 27 25 12
96 10 26 69 99
94 23 63 52 8
71 95 17 54 70
28 21 33 5 26
45 86 63 92 69
77 43 99 20 56
89 40 36 30 53
41 32 94 17 58
83 63 92 93 51
11 86 67 3 61
81 50 16 90 89
0 75 31 22 77
82 74 37 57 39
49 87 33 0 13
54 38 71 85 32
79 84 89 4 61
34 14 69 47 3
35 12 59 1 55
95 37 72 73 85
0 69 50 75 55
51 24 90 71 78
66 86 23 40 6
34 27 43 14 65
46 11 41 86 21
31 82 38 23 53
66 52 39 6 1
16 95 36 0 69
28 54 91 99 60
32 80 4 3 97
26 63 89 52 22
25 91 43 96 68
71 42 78 34 56
0 82 5 69 19
69 60 58 19 1
91 59 54 52 11
43 46 27 2 7
89 57 42 88 31
93 94 37 96 29
72 8 29 64 75
16 45 0 39 46
77 6 88 40 27
92 78 21 63 51
24 12 90 94 47
5 41 63 42 73
37 80 91 18 50
3 24 53 17 49
6 86 30 46 69
16 97 75 88 93
97 60 66 77 74
1 72 41 69 94
30 8 98 33 43
99 63 95 91 11
56 65 70 12 0
47 39 37 79 48
60 31 19 10 53
14 36 25 38 2
76 89 32 1 20
65 72 91 71 66
87 72 13 30 75
50 80 97 17 63
99 9 53 69 86
20 57 92 66 21
31 42 4 98 0
38 89 15 91 95
94 20 13 64 25
37 9 98 10 44
28 97 5 78 32
99 41 82 22 87
97 16 42 87 15
19 70 82 66 30
79 5 67 75 91
27 26 56 63 17
51 99 13 59 35
85 33 3 34 5
72 74 88 81 10
4 64 61 59 8
78 42 90 27 80
14 12 52 76 1
67 92 61 33 60
82 91 85 76 56
39 37 6 65 63
32 51 45 14 98
73 17 8 46 70
97 75 33 9 23
85 27 15 3 26
4 34 36 10 77
68 82 37 32 86
58 88 95 87 99
70 19 67 42 31
81 6 10 95 18
85 50 90 25 56
16 94 7 78 24
59 88 93 77 4
92 25 16 75 67
97 71 53 32 90
6 70 69 55 40
77 20 72 84 73
34 35 38 98 76
24 96 27 39 3
54 26 12 65 60
67 62 43 98 14
15 95 2 82 33
64 17 86 0 63

@ -2,94 +2,128 @@
extern crate test;
const INPUTS: [&'static str; 2] = [
include_str!("../inputs/day3.sample.txt"),
include_str!("../inputs/day3.txt"),
include_str!("../inputs/day4.sample.txt"),
include_str!("../inputs/day4.txt"),
];
fn cmds(input: &'static str) -> Vec<u64> {
input
.lines()
.filter(|&x| !x.is_empty())
.map(|x| u64::from_str_radix(x, 2).unwrap())
.collect()
#[derive(Copy, Clone, Debug)]
enum BoardEntry {
Entry(u64),
CalledEntry(u64),
Null,
}
fn solution<const MAX_LENGTH: usize>(levels: Vec<u64>) -> u64 {
let oxygen_gen_rating = filter_candidates::<MAX_LENGTH>(levels.clone(), true);
let co2_scrub_rating = filter_candidates::<MAX_LENGTH>(levels, false);
oxygen_gen_rating * co2_scrub_rating
#[derive(Copy, Clone, Debug)]
struct Board {
board: [[BoardEntry; 5]; 5],
sum: u64,
}
fn filter_candidates<const MAX_LENGTH: usize>(mut levels: Vec<u64>, dominant: bool) -> u64 {
let mut i = 0;
while levels.len() > 1 {
let count = count_bits::<MAX_LENGTH>(&levels, dominant);
let leading = count & (1 << (MAX_LENGTH - i - 1));
fn cmds(input: &'static str) -> (Vec<u64>, Vec<Board>) {
let mut lines = input.split("\n\n").filter(|x| !x.is_empty());
let draws: Vec<u64> = lines
.next()
.unwrap()
.split(',')
.map(|x| x.parse::<u64>().unwrap())
.collect();
let mut boards = vec![];
for block in lines {
let mut bblock = Board {
board: [[BoardEntry::Null; 5]; 5],
sum: 0,
};
for (i, line) in block.split('\n').enumerate() {
for (j, c) in line.split(' ').filter(|x| !x.is_empty()).enumerate() {
let num = c.parse::<u64>().unwrap();
bblock.board[i][j] = BoardEntry::Entry(num);
bblock.sum += num;
}
}
boards.push(bblock)
}
(draws, boards)
}
levels = levels
.into_iter()
.filter(|&x| {
let pos = x & (1 << (MAX_LENGTH - i - 1));
fn solution((draws, mut boards): (Vec<u64>, Vec<Board>)) -> u64 {
for draw in draws {
// Mark boards
return pos == leading;
})
.collect();
mark_entry(&mut boards, draw);
i += 1;
if let Some(board) = check_winner(&boards) {
return board.sum * draw;
}
}
levels[0]
0
}
fn count_bits<const MAX_LENGTH: usize>(levels: &[u64], dominant: bool) -> u64 {
let n = levels.len();
let mut count = [0; MAX_LENGTH];
let mut mask = 0;
fn check_winner(boards: &[Board]) -> Option<&Board> {
for board in boards {
let grid = board.board;
for &level in levels.iter() {
for i in 0..MAX_LENGTH {
let c = level & (1 << (MAX_LENGTH - i - 1));
if c != 0 {
count[i as usize] += 1;
for i in 0..5 {
if grid[i]
.iter()
.all(|x| matches!(x, BoardEntry::CalledEntry(_)))
{
return Some(board);
}
}
}
for (i, c) in count.into_iter().enumerate() {
if c >= n - c {
mask |= 1 << (MAX_LENGTH - i - 1);
for j in 0..5 {
let mut all_called = true;
for i in 0..5 {
if !matches!(grid[i][j], BoardEntry::CalledEntry(_)) {
all_called = false;
break;
}
}
if all_called {
return Some(board);
}
}
}
if dominant {
mask
} else {
!mask
None
}
fn mark_entry(boards: &mut [Board], called: u64) {
for board in boards {
for row in board.board.iter_mut() {
for col in row.iter_mut() {
if let BoardEntry::Entry(val) = col {
if *val == called {
board.sum -= *val;
*col = BoardEntry::CalledEntry(*val);
}
}
}
}
}
}
fn main() {
let moves = cmds(INPUTS[0]);
let count = solution::<5>(moves);
println!("Result {}", count);
let moves = cmds(INPUTS[1]);
let count = solution::<12>(moves);
println!("Result {}", count);
for input in INPUTS {
let input = cmds(input);
let result = solution(input);
println!("Result {}", result);
}
}
#[bench]
fn solution_bench(b: &mut test::Bencher) {
let moves = cmds(INPUTS[1]);
b.iter(|| {
let v = solution::<12>(moves.clone());
test::black_box(v);
let input = cmds(INPUTS[1]);
let result = solution(input);
test::black_box(result);
})
}
#[test]
fn solution_test() {
assert_eq!(solution::<5>(cmds(INPUTS[0])), 230);
assert_eq!(solution::<12>(cmds(INPUTS[1])), 4406844);
}

Loading…
Cancel
Save