Решение на Форматиране на импорти от Николай Иванов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 20 успешни тест(а)
- 0 неуспешни тест(а)
Код
use std::collections::VecDeque;
pub struct Import<'a>(pub &'a [&'a str]);
#[derive(PartialEq)]
pub enum Order {
Original,
Sorted,
}
pub fn format_flat(imports: &[Import], order: Order) -> Vec<String> {
let mut vec = Vec::new();
for import in imports {
let item = import.0.join("::").to_string();
if !vec.contains(&item) {
vec.push(item.clone());
}
}
if order == Order::Sorted{
vec.sort();
}
vec
}
#[derive(Debug)]
pub struct TreeNode {
val: String,
children: VecDeque<TreeNode>
}
impl TreeNode{
pub fn new(val: &str) -> Self {
TreeNode {
val: val.to_string(),
children: VecDeque::new(),
}
}
fn find_node(&mut self, val: &str) -> Option<&mut TreeNode> {
self.children.iter_mut().find(|child| child.val == val)
}
pub fn add_el(&mut self, vec: Vec<&str>) {
let mut curr_node = self;
for el in vec {
if curr_node.find_node(el).is_some() {
curr_node = curr_node.find_node(el).unwrap();
} else {
curr_node.children.push_back(TreeNode::new(el));
curr_node = curr_node.children.back_mut().unwrap();
}
}
curr_node.children.push_front(TreeNode::new("self"));
}
}
fn postorder(root: &TreeNode, count: u32) -> String {
let interval = " ".repeat(count as usize);
if root.children.len() == 1 && root.children[0].val =="self".to_string() {
return format!("{}{},\n", interval, root.val);
}
if root.children.is_empty(){
return format!("{}{},\n", interval, root.val);
}
let mut result = format!("{}{}::{{\n", interval, root.val);
for child in &root.children {
result += &postorder(child, count + 1);
}
result += &format!("{}}},\n", interval);
result
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
let vec: Vec<String> = format_flat(imports, order);
let mut root = TreeNode::new("root");
for el in vec{
let part:Vec<&str> = el.split("::").collect();
root.add_el(part);
}
let mut result = Vec::new();
for el in &root.children{
let mut a = postorder(el,0);
a.pop();
a.pop();
a+= "\n";
result.push(a.clone());
}
result
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241203-1739405-3dv7fs/solution) Finished test [unoptimized + debuginfo] target(s) in 1.12s Running tests/solution_test.rs (target/debug/deps/solution_test-1428e1090729d165) running 20 tests test solution_test::test_flat_empty ... ok test solution_test::test_flat_multi_crate ... ok test solution_test::test_flat_original ... ok test solution_test::test_flat_original_duplicates ... ok test solution_test::test_flat_sorted ... ok test solution_test::test_flat_sorted_duplicates ... ok test solution_test::test_nested_basic ... ok test solution_test::test_nested_deep ... ok test solution_test::test_nested_empty ... ok test solution_test::test_nested_only_crate ... ok test solution_test::test_nested_original ... ok test solution_test::test_nested_original_2 ... ok test solution_test::test_nested_original_duplicates ... ok test solution_test::test_nested_original_multi_crate ... ok test solution_test::test_nested_original_self ... ok test solution_test::test_nested_sorted ... ok test solution_test::test_nested_sorted_2 ... ok test solution_test::test_nested_sorted_duplicates ... ok test solution_test::test_nested_sorted_multi_crate ... ok test solution_test::test_nested_sorted_self ... ok test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s