day05 both parts fast
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -2,7 +2,7 @@ use utils;
|
|||||||
|
|
||||||
pub fn task1() {
|
pub fn task1() {
|
||||||
let mut input = utils::read_file("input/day05.txt");
|
let mut input = utils::read_file("input/day05.txt");
|
||||||
input = reduce(input);
|
input = reduce(input.as_str());
|
||||||
|
|
||||||
println!("resulting polymer: {}", input); //11591 too high
|
println!("resulting polymer: {}", input); //11591 too high
|
||||||
println!("RESULT: {}", input.len());
|
println!("RESULT: {}", input.len());
|
||||||
@@ -16,36 +16,47 @@ pub fn task2() {
|
|||||||
(
|
(
|
||||||
c,
|
c,
|
||||||
reduce(
|
reduce(
|
||||||
input
|
&input
|
||||||
.chars()
|
.chars()
|
||||||
.filter(|ch| ch.to_lowercase().next().unwrap() != c)
|
.filter(|ch| ch.to_lowercase().next().unwrap() != c)
|
||||||
.collect(),
|
.collect::<String>(),
|
||||||
),
|
).len(),
|
||||||
)
|
)
|
||||||
}).max_by_key(|it| it.1.len())
|
}).min_by_key(|it| it.1)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("Best: {} (length {})", best.0, best.1.len()); // 11184 too high
|
println!("Best: {} (length {})", best.0, best.1); // 11184 too high, 4328 too low
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reduce(mut input: String) -> String {
|
fn reduce(input: &str) -> String {
|
||||||
let mut go_on = true;
|
|
||||||
while go_on {
|
|
||||||
go_on = false;
|
|
||||||
let mut index = 0;
|
|
||||||
while index < input.len() - 1 {
|
|
||||||
let a = input.chars().nth(index).unwrap();
|
|
||||||
let b = input.chars().nth(index + 1).unwrap();
|
|
||||||
if a.is_lowercase() && b.is_uppercase() && a == b.to_lowercase().next().unwrap()
|
|
||||||
|| b.is_lowercase() && a.is_uppercase() && b == a.to_lowercase().next().unwrap()
|
|
||||||
{
|
|
||||||
// println!("{} and {} match", a, b);
|
|
||||||
input.remove(index);
|
|
||||||
input.remove(index);
|
|
||||||
go_on = true;
|
|
||||||
}
|
|
||||||
index += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
input
|
input
|
||||||
|
.chars()
|
||||||
|
.fold(Vec::<char>::new(), |mut stack, c| {
|
||||||
|
let last: Option<char>;
|
||||||
|
{
|
||||||
|
if let Some(c) = stack.last() {
|
||||||
|
last = Some(*c)
|
||||||
|
} else {
|
||||||
|
last = None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(last) = last {
|
||||||
|
if c.is_lowercase()
|
||||||
|
&& last.is_uppercase()
|
||||||
|
&& c == last.to_lowercase().next().unwrap()
|
||||||
|
|| last.is_lowercase()
|
||||||
|
&& c.is_uppercase()
|
||||||
|
&& last == c.to_lowercase().next().unwrap()
|
||||||
|
{
|
||||||
|
stack.pop();
|
||||||
|
} else {
|
||||||
|
stack.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stack.push(c);
|
||||||
|
}
|
||||||
|
stack
|
||||||
|
}).iter()
|
||||||
|
.collect()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user