day 2 and revised day 1 with advantage of DoubleEndedIterator
This commit is contained in:
parent
b2f78d33e7
commit
69b53f37a6
11 changed files with 2392 additions and 28 deletions
|
|
@ -1,14 +1,24 @@
|
|||
use aoc23::prelude::*;
|
||||
|
||||
fn d1_0(input: String) -> Result<usize> {
|
||||
fn part1(input: String) -> Result<usize> {
|
||||
let mut sum = 0;
|
||||
for line in input.lines().into_iter() {
|
||||
let chars = line.chars();
|
||||
let first_num: usize = chars.clone().into_iter().skip_while(|c| !c.is_digit(10)).take(1)
|
||||
let first_num: usize = chars
|
||||
.clone()
|
||||
.into_iter()
|
||||
.skip_while(|c| !c.is_digit(10))
|
||||
.take(1)
|
||||
// This would get continuous digits: .take_while(|c| c.is_digit(10))
|
||||
.collect::<String>().parse()?;
|
||||
let last_num: usize =
|
||||
chars.into_iter().rev().skip_while(|c| !c.is_digit(10)).take(1).collect::<String>().parse()?;
|
||||
.collect::<String>()
|
||||
.parse()?;
|
||||
let last_num: usize = chars
|
||||
.into_iter()
|
||||
.rev()
|
||||
.skip_while(|c| !c.is_digit(10))
|
||||
.take(1)
|
||||
.collect::<String>()
|
||||
.parse()?;
|
||||
let value = first_num * 10 + last_num;
|
||||
sum += value;
|
||||
}
|
||||
|
|
@ -36,10 +46,11 @@ fn first_occurrence(str: &str, reversed: bool) -> Option<u32> {
|
|||
if reversed {
|
||||
for (i, char) in str.chars().rev().enumerate() {
|
||||
let digit = char.to_digit(10).or_else(|| {
|
||||
for num in 1 ..= 9 {
|
||||
for num in 1..=9 {
|
||||
if let Some(num_word) = num_to_word(num) {
|
||||
if i + 1 >= num_word.len() &&
|
||||
&str[str.len() - i - 1 .. str.len()][..num_word.len()] == num_word {
|
||||
if i + 1 >= num_word.len()
|
||||
&& &str[str.len() - i - 1..str.len()][..num_word.len()] == num_word
|
||||
{
|
||||
return Some(num);
|
||||
}
|
||||
}
|
||||
|
|
@ -53,9 +64,9 @@ fn first_occurrence(str: &str, reversed: bool) -> Option<u32> {
|
|||
} else {
|
||||
for (i, char) in str.chars().enumerate() {
|
||||
let digit = char.to_digit(10).or_else(|| {
|
||||
for num in 1 ..= 9 {
|
||||
for num in 1..=9 {
|
||||
if let Some(num_word) = num_to_word(num) {
|
||||
if i + 1 >= num_word.len() && &str[i + 1 - num_word.len() ..= i] == num_word {
|
||||
if i + 1 >= num_word.len() && &str[i + 1 - num_word.len()..=i] == num_word {
|
||||
return Some(num);
|
||||
}
|
||||
}
|
||||
|
|
@ -70,15 +81,15 @@ fn first_occurrence(str: &str, reversed: bool) -> Option<u32> {
|
|||
None
|
||||
}
|
||||
|
||||
fn d1_1(input: String) -> Result<u32> {
|
||||
fn part_2(input: String) -> Result<u32> {
|
||||
let mut sum = 0;
|
||||
for line in input.lines().into_iter() {
|
||||
let first_num = first_occurrence(line, false).ok_or("No number found in line")?;
|
||||
let last_num = first_occurrence(line, true).ok_or("No number found in line reversed")?;
|
||||
let value = first_num * 10 + last_num;
|
||||
sum += value;
|
||||
println!("Line {line}: a:{first_num}|b:{last_num} = {value} ++ {sum}");
|
||||
}
|
||||
|
||||
Ok(sum)
|
||||
}
|
||||
|
||||
|
|
@ -87,8 +98,7 @@ async fn main() -> Result<()> {
|
|||
println!("Day 1");
|
||||
println!("=====");
|
||||
let input = utils::aoc::get_puzzle_input(1).await?;
|
||||
|
||||
println!("Day 1, 0: {}", d1_0(input.clone())?);
|
||||
println!("Day 1, 1: {}", d1_1(input.clone())?);
|
||||
println!("part 1: {}", part1(input.clone())?);
|
||||
println!("part 2: {}", part_2(input.clone())?);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue