day12: added
This commit is contained in:
parent
80f9c4195b
commit
e1b8b4fa8b
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
/target
|
||||
.aoc_token
|
||||
todo
|
||||
|
|
168
src/day12/1.rs
168
src/day12/1.rs
|
@ -1 +1,167 @@
|
|||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
|
||||
fn process(data: &str) -> usize {
|
||||
let mut answer = 0;
|
||||
|
||||
for line in data.lines() {
|
||||
let (springs, count) = line.split_once(' ').unwrap();
|
||||
|
||||
// 5 ss
|
||||
// 4 interspersed string
|
||||
let springs: Vec<char> = springs.chars().collect();
|
||||
|
||||
let count: Vec<usize> = count
|
||||
.split(',')
|
||||
.map(|x| x.parse::<usize>().unwrap())
|
||||
.collect();
|
||||
|
||||
let total: usize = count.iter().sum();
|
||||
|
||||
let mut active = vec![];
|
||||
|
||||
let mut map = HashMap::new();
|
||||
|
||||
answer += combination_helper(
|
||||
&springs,
|
||||
&mut map,
|
||||
&count,
|
||||
&mut active,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
total,
|
||||
springs.len(),
|
||||
);
|
||||
}
|
||||
|
||||
answer
|
||||
}
|
||||
|
||||
fn combination_helper(
|
||||
expected: &[char],
|
||||
map: &mut HashMap<(usize, usize, usize, usize), usize>,
|
||||
groups: &[usize],
|
||||
active: &mut Vec<char>,
|
||||
e_idx: usize,
|
||||
mut g_idx: usize,
|
||||
inserted: usize,
|
||||
continugous_length: usize,
|
||||
target: usize,
|
||||
max_length: usize,
|
||||
) -> usize {
|
||||
if active.len() >= max_length && inserted != target {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if target - inserted > max_length - active.len() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if continugous_length == 0 && active.len() >= 2 && active[active.len() - 2] == '#' {
|
||||
g_idx += 1;
|
||||
}
|
||||
|
||||
if inserted == target && active.len() == max_length {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if let Some(v) = map.get(&(e_idx, g_idx, inserted, continugous_length)) {
|
||||
return *v;
|
||||
}
|
||||
let mut sum = 0;
|
||||
match expected[e_idx] {
|
||||
'#' if g_idx < groups.len() && continugous_length < groups[g_idx] => {
|
||||
active.push('#');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted + 1,
|
||||
continugous_length + 1,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
'.' => {
|
||||
active.push('.');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted,
|
||||
0,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
'?' => {
|
||||
if g_idx < groups.len() && continugous_length < groups[g_idx] {
|
||||
active.push('#');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted + 1,
|
||||
continugous_length + 1,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
active.push('.');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted,
|
||||
0,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
_ => (),
|
||||
}
|
||||
|
||||
map.insert((e_idx, g_idx, inserted, continugous_length), sum);
|
||||
sum
|
||||
}
|
||||
|
||||
fn main() {
|
||||
for input in INPUTS.iter() {
|
||||
println!("total = {}", process(input));
|
||||
}
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn part1(b: &mut test::Bencher) {
|
||||
b.iter(|| {
|
||||
let v = process(INPUTS[INPUTS.len() - 1]);
|
||||
test::black_box(v);
|
||||
});
|
||||
}
|
||||
|
|
174
src/day12/2.rs
174
src/day12/2.rs
|
@ -1 +1,173 @@
|
|||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
|
||||
fn process(data: &str) -> usize {
|
||||
let mut answer = 0;
|
||||
|
||||
for line in data.lines() {
|
||||
let (springs, count) = line.split_once(' ').unwrap();
|
||||
|
||||
// 5 ss
|
||||
// 4 interspersed string
|
||||
let springs: Vec<char> = std::iter::repeat(springs)
|
||||
.intersperse("?")
|
||||
.take(9)
|
||||
.flat_map(|x| x.chars().collect::<Vec<char>>())
|
||||
.collect();
|
||||
|
||||
let count: Vec<usize> = count
|
||||
.split(',')
|
||||
.map(|x| x.parse::<usize>().unwrap())
|
||||
.collect();
|
||||
let l = count.len();
|
||||
let count: Vec<usize> = count.into_iter().cycle().take(5 * l).collect();
|
||||
|
||||
let total: usize = count.iter().sum();
|
||||
|
||||
let mut active = vec![];
|
||||
|
||||
let mut map = HashMap::new();
|
||||
|
||||
answer += combination_helper(
|
||||
&springs,
|
||||
&mut map,
|
||||
&count,
|
||||
&mut active,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
total,
|
||||
springs.len(),
|
||||
);
|
||||
}
|
||||
|
||||
answer
|
||||
}
|
||||
|
||||
fn combination_helper(
|
||||
expected: &[char],
|
||||
map: &mut HashMap<(usize, usize, usize, usize), usize>,
|
||||
groups: &[usize],
|
||||
active: &mut Vec<char>,
|
||||
e_idx: usize,
|
||||
mut g_idx: usize,
|
||||
inserted: usize,
|
||||
continugous_length: usize,
|
||||
target: usize,
|
||||
max_length: usize,
|
||||
) -> usize {
|
||||
if active.len() >= max_length && inserted != target {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if target - inserted > max_length - active.len() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if continugous_length == 0 && active.len() >= 2 && active[active.len() - 2] == '#' {
|
||||
g_idx += 1;
|
||||
}
|
||||
|
||||
if inserted == target && active.len() == max_length {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if let Some(v) = map.get(&(e_idx, g_idx, inserted, continugous_length)) {
|
||||
return *v;
|
||||
}
|
||||
let mut sum = 0;
|
||||
match expected[e_idx] {
|
||||
'#' if g_idx < groups.len() && continugous_length < groups[g_idx] => {
|
||||
active.push('#');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted + 1,
|
||||
continugous_length + 1,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
'.' => {
|
||||
active.push('.');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted,
|
||||
0,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
'?' => {
|
||||
if g_idx < groups.len() && continugous_length < groups[g_idx] {
|
||||
active.push('#');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted + 1,
|
||||
continugous_length + 1,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
active.push('.');
|
||||
sum += combination_helper(
|
||||
expected,
|
||||
map,
|
||||
groups,
|
||||
active,
|
||||
e_idx + 1,
|
||||
g_idx,
|
||||
inserted,
|
||||
0,
|
||||
target,
|
||||
max_length,
|
||||
);
|
||||
active.pop();
|
||||
}
|
||||
|
||||
_ => (),
|
||||
}
|
||||
|
||||
map.insert((e_idx, g_idx, inserted, continugous_length), sum);
|
||||
sum
|
||||
}
|
||||
|
||||
fn main() {
|
||||
for input in INPUTS.iter() {
|
||||
println!("total = {}", process(input));
|
||||
}
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn part1(b: &mut test::Bencher) {
|
||||
b.iter(|| {
|
||||
let v = process(INPUTS[INPUTS.len() - 1]);
|
||||
test::black_box(v);
|
||||
});
|
||||
}
|
||||
|
|
1000
src/day12/input.txt
Normal file
1000
src/day12/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
6
src/day12/sample.txt
Normal file
6
src/day12/sample.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
???.### 1,1,3
|
||||
.??..??...?##. 1,1,3
|
||||
?#?#?#?#?#?#?#? 1,3,1,6
|
||||
????.#...#... 4,1,1
|
||||
????.######..#####. 1,6,5
|
||||
?###???????? 3,2,1
|
Loading…
Reference in New Issue
Block a user