day(05): refactor
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
95df0a175e
commit
4bbb98661c
1 changed files with 16 additions and 26 deletions
|
@ -42,7 +42,6 @@ impl FromStr for Ship {
|
|||
let (stacks_str, moves_str) = (split_s[0], split_s[1]);
|
||||
|
||||
let mut stacks: Vec<Vec<char>> = Vec::new();
|
||||
|
||||
stacks_str
|
||||
.lines()
|
||||
.rev()
|
||||
|
@ -69,22 +68,7 @@ impl FromStr for Ship {
|
|||
type Input = Ship;
|
||||
type Output = String;
|
||||
|
||||
fn part_1(input: &Input) -> Output {
|
||||
let Ship(stacks, moves) = input;
|
||||
|
||||
let mut stacks = stacks.clone();
|
||||
|
||||
moves.iter().for_each(|m| {
|
||||
for _ in 0..m.count {
|
||||
if stacks[m.from - 1].is_empty() {
|
||||
break;
|
||||
}
|
||||
|
||||
let popped = stacks[m.from - 1].pop().unwrap();
|
||||
stacks[m.to - 1].push(popped);
|
||||
}
|
||||
});
|
||||
|
||||
fn stacks_to_string(stacks: &[Vec<char>]) -> String {
|
||||
stacks.iter().fold(String::new(), |acc, stack| {
|
||||
if let Some(c) = stack.last() {
|
||||
acc + &c.to_string()
|
||||
|
@ -94,24 +78,30 @@ fn part_1(input: &Input) -> Output {
|
|||
})
|
||||
}
|
||||
|
||||
fn part_2(input: &Input) -> Output {
|
||||
fn move_crates(input: &Input, one_by_one: bool) -> Output {
|
||||
let Ship(stacks, moves) = input;
|
||||
|
||||
let mut stacks = stacks.clone();
|
||||
|
||||
moves.iter().for_each(|m| {
|
||||
let size = stacks[m.from - 1].len();
|
||||
let mut s = stacks[m.from - 1].split_off(max(0, size - m.count));
|
||||
|
||||
if one_by_one {
|
||||
s.reverse();
|
||||
}
|
||||
|
||||
stacks[m.to - 1].append(&mut s);
|
||||
});
|
||||
|
||||
stacks.iter().fold(String::new(), |acc, stack| {
|
||||
if let Some(c) = stack.last() {
|
||||
acc + &c.to_string()
|
||||
} else {
|
||||
acc
|
||||
stacks_to_string(&stacks)
|
||||
}
|
||||
})
|
||||
|
||||
fn part_1(input: &Input) -> Output {
|
||||
move_crates(input, true)
|
||||
}
|
||||
|
||||
fn part_2(input: &Input) -> Output {
|
||||
move_crates(input, false)
|
||||
}
|
||||
|
||||
fn parse_input(pathname: &str) -> Input {
|
||||
|
|
Loading…
Reference in a new issue