Seperated solutions into different binaries
Implemented day 3 part 1 solution
This commit is contained in:
parent
c65881bfd0
commit
d0f307bc02
4 changed files with 146 additions and 55 deletions
32
src/bin/day1.rs
Normal file
32
src/bin/day1.rs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
fn main() {
|
||||||
|
let input = std::fs::read_to_string("input/1.txt").unwrap();
|
||||||
|
let (result1, result2) = (part1(&input), part2(&input));
|
||||||
|
println!("Day 1");
|
||||||
|
println!("Part 1: {}", result1);
|
||||||
|
println!("Part 2: {}", result2);
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> u128 {
|
||||||
|
let mut result = 0_u128;
|
||||||
|
for line in input.lines() {
|
||||||
|
let mut digits_only = String::new();
|
||||||
|
for c in line.chars() { if c.is_digit(10) { digits_only.push(c); } }
|
||||||
|
let mut calibration = String::new();
|
||||||
|
calibration += &digits_only[..1];
|
||||||
|
calibration += &digits_only[digits_only.len() - 1..];
|
||||||
|
let value: u128 = calibration.parse().unwrap();
|
||||||
|
result += value;
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> u128 {
|
||||||
|
let str_to_digit = std::collections::HashMap::from([
|
||||||
|
("one", "o1e"), ("two", "t2o"), ("three", "t3e"), ("four", "4"),
|
||||||
|
("five", "5e"), ("six", "6"), ("seven", "7n"), ("eight", "e8t"), ("nine", "n9e")
|
||||||
|
]);
|
||||||
|
let mut input: String = input.into();
|
||||||
|
for (str, digit) in str_to_digit.iter() { input = input.replace(str, digit); }
|
||||||
|
part1(&input)
|
||||||
|
}
|
51
src/bin/day2.rs
Normal file
51
src/bin/day2.rs
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
fn main() {
|
||||||
|
let input = std::fs::read_to_string("input/2.txt").unwrap();
|
||||||
|
let (result1, result2) = (part1(&input, 12, 13, 14), part2(&input));
|
||||||
|
println!("Day 2");
|
||||||
|
println!("Part 1: {}", result1);
|
||||||
|
println!("Part 2: {}", result2);
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str, red: u8, green: u8, blue: u8) -> u128 {
|
||||||
|
let bag_contents = std::collections::HashMap::from([
|
||||||
|
("red", red), ("green", green), ("blue", blue)
|
||||||
|
]);
|
||||||
|
let mut result = 0_u128;
|
||||||
|
'games_loop:
|
||||||
|
for line in input.lines() {
|
||||||
|
let (game_id, game_data) = line.split_once(':').unwrap();
|
||||||
|
let (_, game_id) = game_id.split_once(' ').unwrap();
|
||||||
|
let game_id: u128 = game_id.parse().unwrap();
|
||||||
|
for cubes in game_data.split(';') {
|
||||||
|
for colored_cubes in cubes.split(',') {
|
||||||
|
let (amount, color) = colored_cubes.trim().split_once(' ').unwrap();
|
||||||
|
let amount: u8 = amount.parse().unwrap();
|
||||||
|
if bag_contents[color] < amount { continue 'games_loop; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += game_id;
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> u128 {
|
||||||
|
let mut result = 0_u128;
|
||||||
|
for line in input.lines() {
|
||||||
|
let mut possible_game_cubes = std::collections::HashMap::from([
|
||||||
|
("red", u8::MIN), ("green", u8::MIN), ("blue", u8::MIN)
|
||||||
|
]);
|
||||||
|
let (_, game_data) = line.split_once(':').unwrap();
|
||||||
|
for cubes in game_data.split(';') {
|
||||||
|
for colored_cubes in cubes.split(',') {
|
||||||
|
let (amount, color) = colored_cubes.trim().split_once(' ').unwrap();
|
||||||
|
let amount: u8 = amount.parse().unwrap();
|
||||||
|
possible_game_cubes.insert(color, possible_game_cubes[color].max(amount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let power: u128 = possible_game_cubes.values().map(|e| *e as u128).product();
|
||||||
|
result += power;
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
63
src/bin/day3.rs
Normal file
63
src/bin/day3.rs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
fn main() {
|
||||||
|
let input = std::fs::read_to_string("input/3.txt").unwrap();
|
||||||
|
let (result1, result2) = (part1(&input), 0);
|
||||||
|
println!("Day 3");
|
||||||
|
println!("Part 1: {}", result1);
|
||||||
|
println!("Part 2: {}", result2);
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn adjacent_numbers(lines: &Vec<&str>, line_index: usize, char_index: usize) -> Vec<u128> {
|
||||||
|
let mut numbers: Vec<u128> = vec![];
|
||||||
|
for dy in -1..=1 {
|
||||||
|
let line_offsetted_index = (line_index as i32 + dy) as usize;
|
||||||
|
let line = lines[line_offsetted_index];
|
||||||
|
for dx in -1..=1 {
|
||||||
|
if dx == 0 && dy == 0 { continue; }
|
||||||
|
let char_offsetted_index = (char_index as i32 + dx) as usize;
|
||||||
|
let c = line.as_bytes()[char_offsetted_index] as char;
|
||||||
|
if !c.is_digit(10) { continue; }
|
||||||
|
let number = find_full_number(line, char_offsetted_index, c);
|
||||||
|
numbers.push(number);
|
||||||
|
}
|
||||||
|
let row_left = &line[char_index - 1..=char_index];
|
||||||
|
if row_left.chars().filter(|c| c .is_digit(10)).count() == 2 { numbers.pop(); }
|
||||||
|
let row_right = &line[char_index..=char_index + 1];
|
||||||
|
if row_right.chars().filter(|c| c.is_digit(10)).count() == 2 { numbers.pop(); }
|
||||||
|
}
|
||||||
|
numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_full_number(line: &str, char_index: usize, character: char) -> u128 {
|
||||||
|
let (mut left_side, mut right_side) = (String::new(), String::new());
|
||||||
|
for i in char_index + 1..line.len() {
|
||||||
|
let c = line.as_bytes()[i] as char;
|
||||||
|
if !c.is_digit(10) { break; }
|
||||||
|
right_side.push(c);
|
||||||
|
}
|
||||||
|
for i in (0..char_index).rev() {
|
||||||
|
let c = line.as_bytes()[i] as char;
|
||||||
|
if !c.is_digit(10) { break; }
|
||||||
|
left_side.push(c);
|
||||||
|
}
|
||||||
|
left_side = left_side.chars().rev().collect();
|
||||||
|
let number = left_side + &character.to_string() + &right_side;
|
||||||
|
let number = number.parse().unwrap();
|
||||||
|
number
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> u128 {
|
||||||
|
let lines: Vec<&str> = input.lines().collect();
|
||||||
|
let mut result = 0_u128;
|
||||||
|
for i in 1..lines.len() - 1 {
|
||||||
|
let line = lines[i];
|
||||||
|
for (j, c) in line.chars().enumerate() {
|
||||||
|
if c == '.' || c.is_digit(10) { continue; }
|
||||||
|
let numbers = adjacent_numbers(&lines, i, j);
|
||||||
|
let sum: u128 = numbers.iter().sum();
|
||||||
|
result += sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
55
src/main.rs
55
src/main.rs
|
@ -1,55 +0,0 @@
|
||||||
#![allow(dead_code)]
|
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
day3();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn day1() {
|
|
||||||
let str_to_digit = HashMap::from([
|
|
||||||
("one", "o1e"), ("two", "t2o"), ("three", "t3e"), ("four", "4"),
|
|
||||||
("five", "5e"), ("six", "6"), ("seven", "7n"), ("eight", "e8t"), ("nine", "n9e")
|
|
||||||
]);
|
|
||||||
let input = std::fs::read_to_string("input/1.txt").unwrap();
|
|
||||||
let mut result = 0_u128;
|
|
||||||
for line in input.lines() {
|
|
||||||
let mut line = String::from(line);
|
|
||||||
for (str, digit) in str_to_digit.iter() { line = line.replace(str, digit); }
|
|
||||||
let mut digits_only = String::new();
|
|
||||||
for c in line.chars() { if c.is_digit(10) { digits_only.push(c); } }
|
|
||||||
let mut calibration = String::new();
|
|
||||||
calibration += &digits_only[..1];
|
|
||||||
calibration += &digits_only[digits_only.len() - 1..];
|
|
||||||
let value: u128 = calibration.parse().unwrap();
|
|
||||||
result += value;
|
|
||||||
}
|
|
||||||
println!("{}", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn day2() {
|
|
||||||
let input = std::fs::read_to_string("input/2.txt").unwrap();
|
|
||||||
let mut result = 0_u128;
|
|
||||||
for line in input.lines() {
|
|
||||||
let mut possible_game_cubes = HashMap::from([
|
|
||||||
("red", u8::MIN), ("green", u8::MIN), ("blue", u8::MIN)
|
|
||||||
]);
|
|
||||||
let (_, game_data) = line.split_once(':').unwrap();
|
|
||||||
for cubes in game_data.split(';') {
|
|
||||||
for colored_cubes in cubes.split(',') {
|
|
||||||
let (amount, color) = colored_cubes.trim().split_once(' ').unwrap();
|
|
||||||
let amount: u8 = amount.parse().unwrap();
|
|
||||||
possible_game_cubes.insert(color, possible_game_cubes[color].max(amount));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let power: u128 = possible_game_cubes.values().map(|e| *e as u128).product();
|
|
||||||
result += power;
|
|
||||||
}
|
|
||||||
println!("{}", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn day3() {
|
|
||||||
let input = std::fs::read_to_string("input/3.txt").unwrap();
|
|
||||||
let mut result = 0_u128;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue