All caught up (days 3 and 4 parts 1 and 2)
This commit is contained in:
parent
d5d866ca3a
commit
da12b07502
41
src/03part1.rs
Normal file
41
src/03part1.rs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/03input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let lines_count = contents.clone().lines().count();
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let first_line: Vec<char> = lines.next().unwrap().chars().collect();
|
||||||
|
let mut matrix: Vec<Vec<char>> = Vec::new();
|
||||||
|
matrix.push(first_line);
|
||||||
|
loop {
|
||||||
|
match lines.next() {
|
||||||
|
Some(line) => {
|
||||||
|
matrix.push(line.chars().collect());
|
||||||
|
},
|
||||||
|
None => break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut total_val = 0;
|
||||||
|
println!("{:?}", matrix);
|
||||||
|
for i in 0..lines_count {
|
||||||
|
let mut temp_value = 0;
|
||||||
|
let mut symbol = false;
|
||||||
|
for j in 0..matrix.get(i).unwrap().len() {
|
||||||
|
if matrix.get(i).unwrap().get(j).unwrap().is_ascii_digit() {
|
||||||
|
temp_value = temp_value * 10 + matrix.get(i).unwrap().get(j).unwrap().to_digit(10).unwrap();
|
||||||
|
symbol = symbol || (i > 0 && ((j > 0 && matrix.get(i-1).unwrap().get(j-1).unwrap().is_ascii_punctuation() && matrix.get(i-1).unwrap().get(j-1).unwrap() != &'.') || (matrix.get(i-1).unwrap().get(j).unwrap().is_ascii_punctuation() && matrix.get(i-1).unwrap().get(j).unwrap() != &'.') || (j < matrix.get(i-1).unwrap().len()-1 && matrix.get(i-1).unwrap().get(j+1).unwrap().is_ascii_punctuation() && matrix.get(i-1).unwrap().get(j+1).unwrap() != &'.'))) ||
|
||||||
|
((j > 0 && matrix.get(i).unwrap().get(j-1).unwrap().is_ascii_punctuation() && matrix.get(i).unwrap().get(j-1).unwrap() != &'.') || (matrix.get(i).unwrap().get(j).unwrap().is_ascii_punctuation() && matrix.get(i).unwrap().get(j).unwrap() != &'.') || (j < matrix.get(i).unwrap().len()-1 && matrix.get(i).unwrap().get(j+1).unwrap().is_ascii_punctuation() && matrix.get(i).unwrap().get(j+1).unwrap() != &'.')) ||
|
||||||
|
(i < matrix.len()-1 && ((j > 0 && matrix.get(i+1).unwrap().get(j-1).unwrap().is_ascii_punctuation() && matrix.get(i+1).unwrap().get(j-1).unwrap() != &'.') || (matrix.get(i+1).unwrap().get(j).unwrap().is_ascii_punctuation() && matrix.get(i+1).unwrap().get(j).unwrap() != &'.') || (j < matrix.get(i+1).unwrap().len()-1 && matrix.get(i+1).unwrap().get(j+1).unwrap().is_ascii_punctuation() && matrix.get(i+1).unwrap().get(j+1).unwrap() != &'.')));
|
||||||
|
} else {
|
||||||
|
if symbol {
|
||||||
|
println!("{}", temp_value);
|
||||||
|
total_val += temp_value;
|
||||||
|
symbol = false;
|
||||||
|
}
|
||||||
|
temp_value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", total_val);
|
||||||
|
}
|
256
src/03part2.rs
Normal file
256
src/03part2.rs
Normal file
|
@ -0,0 +1,256 @@
|
||||||
|
use std::{fs, collections::HashMap};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/03input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let lines_count = contents.clone().lines().count();
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let first_line: Vec<char> = lines.next().unwrap().chars().collect();
|
||||||
|
let mut matrix: Vec<Vec<char>> = Vec::new();
|
||||||
|
matrix.push(first_line);
|
||||||
|
loop {
|
||||||
|
match lines.next() {
|
||||||
|
Some(line) => {
|
||||||
|
matrix.push(line.chars().collect());
|
||||||
|
},
|
||||||
|
None => break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut total_val = 0;
|
||||||
|
for i in 0..lines_count {
|
||||||
|
for j in 0..matrix.get(i).unwrap().len() {
|
||||||
|
let mut values = Vec::new();
|
||||||
|
if matrix.get(i).unwrap().get(j).unwrap() == &'*' {
|
||||||
|
let mut locations = HashMap::new();
|
||||||
|
for k in i-1..i+2 {
|
||||||
|
for l in j-1..j+2 {
|
||||||
|
if k < lines_count && l <= matrix.get(k).unwrap().len() && (k != i || l != j) {
|
||||||
|
locations.insert((k+2-i)*3+(l+2-j)-4, matrix.get(k).unwrap().get(l).unwrap().is_ascii_digit());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{} {} {:?}", i, j, locations);
|
||||||
|
/*
|
||||||
|
* 012
|
||||||
|
* 3*5
|
||||||
|
* 678
|
||||||
|
*/
|
||||||
|
if i > 0 && j > 0 && *locations.get(&0).unwrap() {
|
||||||
|
if j < matrix.get(i-1).unwrap().len()-1 && *locations.get(&2).unwrap() && *locations.get(&1).unwrap() {
|
||||||
|
// 012
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..matrix.get(i-1).unwrap().len() {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j+1 {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
} else if j < matrix.get(i-1).unwrap().len()-1 && *locations.get(&2).unwrap() && !*locations.get(&1).unwrap() {
|
||||||
|
// 0.2
|
||||||
|
{
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j+1..matrix.get(i-1).unwrap().len() {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if *locations.get(&1).unwrap() {
|
||||||
|
// 01.
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j+1 {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j+1 {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
} else {
|
||||||
|
// 0..
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if i > 0 && *locations.get(&1).unwrap() {
|
||||||
|
if (j < matrix.get(i-1).unwrap().len()-1 && !*locations.get(&2).unwrap()) || j == matrix.get(i-1).unwrap().len()-1 {
|
||||||
|
// .1.
|
||||||
|
values.push(matrix.get(i-1).unwrap().get(j).unwrap().to_digit(10).unwrap());
|
||||||
|
} else {
|
||||||
|
// .12
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j..matrix.get(i-1).unwrap().len() {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if i < lines_count-1 && *locations.get(&2).unwrap() {
|
||||||
|
// ..2
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j+1..matrix.get(i-1).unwrap().len() {
|
||||||
|
if matrix.get(i-1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i-1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
if j > 0 && *locations.get(&3).unwrap() {
|
||||||
|
// 3*
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j {
|
||||||
|
if matrix.get(i).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j-1 {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
if j < matrix.get(i).unwrap().len()-1 && *locations.get(&5).unwrap() {
|
||||||
|
// *5
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j+1..matrix.get(i).unwrap().len() {
|
||||||
|
if matrix.get(i).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
if i < lines_count-1 && j > 0 && *locations.get(&6).unwrap() {
|
||||||
|
if j < matrix.get(i+1).unwrap().len()-1 && *locations.get(&8).unwrap() && *locations.get(&7).unwrap() {
|
||||||
|
// 678
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..matrix.get(i+1).unwrap().len() {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j+1 {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
} else if j < matrix.get(i+1).unwrap().len()-1 && *locations.get(&8).unwrap() && !*locations.get(&7).unwrap() {
|
||||||
|
// 6.8
|
||||||
|
{
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j+1..matrix.get(i+1).unwrap().len() {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if *locations.get(&7).unwrap() {
|
||||||
|
// 67.
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j+1 {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j+1 {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
} else {
|
||||||
|
// 6..
|
||||||
|
let mut value = 0;
|
||||||
|
for k in 0..j {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else if k < j {
|
||||||
|
value = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if i < lines_count - 1 && *locations.get(&7).unwrap() {
|
||||||
|
if (j < matrix.get(i+1).unwrap().len()-1 && !*locations.get(&8).unwrap()) || j == matrix.get(i+1).unwrap().len()-1 {
|
||||||
|
// .7.
|
||||||
|
values.push(matrix.get(i+1).unwrap().get(j).unwrap().to_digit(10).unwrap());
|
||||||
|
} else {
|
||||||
|
// .78
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j..matrix.get(i+1).unwrap().len() {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
} else if i < lines_count-1 && *locations.get(&8).unwrap() {
|
||||||
|
// ..8
|
||||||
|
let mut value = 0;
|
||||||
|
for k in j+1..matrix.get(i+1).unwrap().len() {
|
||||||
|
if matrix.get(i+1).unwrap().get(k).unwrap().is_ascii_digit() {
|
||||||
|
value = value * 10 + matrix.get(i+1).unwrap().get(k).unwrap().to_digit(10).unwrap();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.push(value);
|
||||||
|
}
|
||||||
|
println!("{:?}", values);
|
||||||
|
if values.len() == 2 {
|
||||||
|
total_val += values.into_iter().fold(1, |acc, x| acc * x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", total_val);
|
||||||
|
}
|
37
src/04part1.rs
Normal file
37
src/04part1.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use std::{fs, char::CharTryFromError};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/04input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let mut total_points = 0;
|
||||||
|
loop {
|
||||||
|
match lines.next() {
|
||||||
|
Some(line) => {
|
||||||
|
let mut points = 0;
|
||||||
|
let mut sub_line = line.get(line.find(":").unwrap()+1..line.len()).unwrap().split("|");
|
||||||
|
let mut winning_nums: Vec<u128> = sub_line.next().unwrap().split_whitespace().map(|x| x.parse::<u128>().ok().unwrap()).collect();
|
||||||
|
let mut chosen_nums: Vec<u128> = sub_line.next().unwrap().split_whitespace().map(|x| x.parse::<u128>().ok().unwrap()).collect();
|
||||||
|
winning_nums.sort();
|
||||||
|
chosen_nums.sort();
|
||||||
|
let mut j = 0;
|
||||||
|
for i in winning_nums {
|
||||||
|
while j < chosen_nums.len() && chosen_nums[j] < i {
|
||||||
|
j += 1;
|
||||||
|
}
|
||||||
|
if j < chosen_nums.len() && i == chosen_nums[j] {
|
||||||
|
j += 1;
|
||||||
|
if points == 0 {
|
||||||
|
points = 1;
|
||||||
|
} else {
|
||||||
|
points *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total_points += points;
|
||||||
|
},
|
||||||
|
None => break,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", total_points);
|
||||||
|
}
|
47
src/04part2.rs
Normal file
47
src/04part2.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
use std::{fs, collections::HashMap};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_path = "input/04input.txt";
|
||||||
|
let contents = fs::read_to_string(file_path).expect("should read file");
|
||||||
|
let mut lines = contents.lines();
|
||||||
|
let mut total_cards = 0;
|
||||||
|
let mut extra_cards = HashMap::new();
|
||||||
|
let mut card_index = 0;
|
||||||
|
loop {
|
||||||
|
match lines.next() {
|
||||||
|
Some(line) => {
|
||||||
|
card_index += 1;
|
||||||
|
let mut points = 0;
|
||||||
|
let mut sub_line = line.get(line.find(":").unwrap()+1..line.len()).unwrap().split("|");
|
||||||
|
let mut winning_nums: Vec<u128> = sub_line.next().unwrap().split_whitespace().map(|x| x.parse::<u128>().ok().unwrap()).collect();
|
||||||
|
let mut chosen_nums: Vec<u128> = sub_line.next().unwrap().split_whitespace().map(|x| x.parse::<u128>().ok().unwrap()).collect();
|
||||||
|
winning_nums.sort();
|
||||||
|
chosen_nums.sort();
|
||||||
|
let mut j = 0;
|
||||||
|
for i in winning_nums {
|
||||||
|
while j < chosen_nums.len() && chosen_nums[j] < i {
|
||||||
|
j += 1;
|
||||||
|
}
|
||||||
|
if j < chosen_nums.len() && i == chosen_nums[j] {
|
||||||
|
j += 1;
|
||||||
|
points += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if extra_cards.get(&card_index).is_none() {
|
||||||
|
extra_cards.insert(card_index, 0);
|
||||||
|
}
|
||||||
|
println!("{}", points);
|
||||||
|
for i in 1..points+1 {
|
||||||
|
if extra_cards.get(&(card_index+i)).is_none() {
|
||||||
|
extra_cards.insert(card_index + i, 0);
|
||||||
|
}
|
||||||
|
extra_cards.insert(card_index + i, *extra_cards.get(&card_index).unwrap() + 1 + *extra_cards.get(&(card_index+i)).unwrap());
|
||||||
|
}
|
||||||
|
total_cards += 1 + extra_cards.get(&card_index).unwrap();
|
||||||
|
println!("{:?}", extra_cards);
|
||||||
|
},
|
||||||
|
None => break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", total_cards);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user