feat: implement get_args :))))
This commit is contained in:
parent
c45c598ba9
commit
d262d4b9fd
@ -1,94 +1,95 @@
|
||||
pub fn get_arg<'a>(index: i32, args: &'a Vec<i32>) -> Option<&'a [i32]> {
|
||||
let mut arg_index = -1;
|
||||
let mut i: usize = 0;
|
||||
let mut depth = 0;
|
||||
pub fn get_args<'a>(args: &'a Vec<i32>) -> Vec<&[i32]> {
|
||||
let mut idx: usize = 0;
|
||||
let mut depth = -1;
|
||||
|
||||
let mut arg_start_index = 0;
|
||||
let mut arg_start_index = 2;
|
||||
let mut next_bracket_index = 0;
|
||||
let mut last_bracket_index = 0;
|
||||
|
||||
while i < args.len() {
|
||||
println!("------");
|
||||
let mut out_args: Vec<&[i32]> = Vec::new();
|
||||
|
||||
let is_bracket = i == next_bracket_index;
|
||||
let value = args[i];
|
||||
let length = args.len();
|
||||
|
||||
while idx < length {
|
||||
let is_bracket = idx == next_bracket_index;
|
||||
let value = args[idx];
|
||||
|
||||
// if we are at a bracket
|
||||
if is_bracket {
|
||||
next_bracket_index = 1 + i + args[i + 1] as usize;
|
||||
// if is opening
|
||||
if value == 0 {
|
||||
if i != 0 {
|
||||
depth += 1;
|
||||
}
|
||||
// if we are at the end of the args
|
||||
if idx >= length - 1 {
|
||||
break;
|
||||
}
|
||||
|
||||
if depth == 0 {
|
||||
i += 2;
|
||||
arg_index += 1;
|
||||
} else {
|
||||
i = next_bracket_index;
|
||||
}
|
||||
// if closing
|
||||
last_bracket_index = next_bracket_index;
|
||||
next_bracket_index = 1 + idx + args[idx + 1] as usize;
|
||||
|
||||
if value == 0 {
|
||||
depth += 1;
|
||||
} else if value == 1 {
|
||||
depth -= 1;
|
||||
if depth > 1 {
|
||||
i = next_bracket_index;
|
||||
} else {
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
|
||||
if depth == 0 {
|
||||
// skip over the bracket encoding
|
||||
idx += 2;
|
||||
} else {
|
||||
// skip to the next bracket if we are at depth > 0
|
||||
idx = next_bracket_index - 1;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
arg_index += 1;
|
||||
|
||||
println!(
|
||||
"i: {}, next: {}, v: {}, ai: {}",
|
||||
i, next_bracket_index, args[i], arg_index
|
||||
);
|
||||
|
||||
println!("is_bracket: {}", is_bracket);
|
||||
println!("depth: {}", depth);
|
||||
|
||||
println!("arg_start_index: {}", arg_start_index);
|
||||
|
||||
if arg_index == index {
|
||||
println!("------");
|
||||
return Some(&args[arg_start_index..=i]);
|
||||
// this is at the end of args where normally multiple ] are encoded
|
||||
if depth < 0 {
|
||||
break;
|
||||
}
|
||||
|
||||
i += 1;
|
||||
// remove starting bracket from single numbers
|
||||
if idx - arg_start_index < 3 && last_bracket_index == arg_start_index {
|
||||
arg_start_index += 2;
|
||||
}
|
||||
|
||||
out_args.push(&args[arg_start_index..=idx]);
|
||||
|
||||
idx += 1;
|
||||
arg_start_index = idx;
|
||||
}
|
||||
|
||||
None
|
||||
return out_args;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input_a = vec![0, 4, 1, 2, 3, 0, 7, 1, 2, 4, 2, 4, 1, 1, 1, 1];
|
||||
// -> [1, 2, 3, [1, 2, 4, 2, 4]]
|
||||
// 1: [1]
|
||||
// 2: [2]
|
||||
// 3: [3]
|
||||
// 4: [1,2,4,2,4]
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
let input_b = vec![0, 2, 1, 0, 4, 4, 2, 4, 1, 2, 2, 0, 3, 2, 3, 1, 1, 1, 1];
|
||||
// -> [1,[4,2,4], 2, [2,3]];
|
||||
// 1: [1]
|
||||
// 2: [4,2,4]
|
||||
// 3: [2]
|
||||
// 4: [2,3]
|
||||
#[test]
|
||||
fn test_example_input_a() {
|
||||
let input_a = vec![0, 4, 1, 2, 3, 0, 7, 1, 2, 4, 2, 4, 1, 1, 1, 1];
|
||||
// -> [1, 2, 3, [1, 2, 4, 2, 4]]
|
||||
|
||||
let input = input_b;
|
||||
let args = get_args(&input_a);
|
||||
|
||||
//let first_arg = get_arg(0, &input);
|
||||
//println!("-----> FIRST: {:?}", first_arg);
|
||||
assert_eq!(args.len(), 4);
|
||||
assert_eq!(args[0], [1]);
|
||||
assert_eq!(args[1], [2]);
|
||||
assert_eq!(args[2], [3]);
|
||||
assert_eq!(args[3], [0, 7, 1, 2, 4, 2, 4, 1]);
|
||||
}
|
||||
|
||||
//let second_arg = get_arg(1, &input);
|
||||
//println!("-----> SECOND: {:?}", second_arg);
|
||||
#[test]
|
||||
fn test_example_input_b() {
|
||||
let input_b = vec![0, 3, 7, 1, 0, 4, 4, 2, 4, 1, 2, 2, 0, 3, 2, 3, 1, 1, 1, 1];
|
||||
// -> [1,[4,2,4], 2, [2,3]]
|
||||
|
||||
//let third_arg = get_arg(2, &input);
|
||||
//println!("-----> THIRD: {:?}", third_arg);
|
||||
let args = get_args(&input_b);
|
||||
|
||||
let fourth_arg = get_arg(3, &input);
|
||||
println!("-----> FOURTH: {:?}", fourth_arg);
|
||||
assert_eq!(args.len(), 5);
|
||||
assert_eq!(args[0], [7]);
|
||||
assert_eq!(args[1], [1]);
|
||||
assert_eq!(args[2], [0, 4, 4, 2, 4]);
|
||||
assert_eq!(args[3], [2]);
|
||||
assert_eq!(args[4], [0, 3, 2, 3]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user