Решение на Форматиране на импорти от Стоян Генчев
Резултати
- 18 точки от тестове
- 0 бонус точки
- 18 точки общо
- 18 успешни тест(а)
- 2 неуспешни тест(а)
Код
use std::collections::HashSet;
pub struct Import<'a>(pub &'a [&'a str]);
pub enum Order {
Original,
Sorted,
}
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub struct ImportTreeNode {
value: String,
import_end: bool,
children: Vec<ImportTreeNode>,
}
pub fn format_flat(imports: &[Import], order: Order) -> Vec<String> {
let mut result = imports.iter()
.map(|import| import.0.iter()
.map(|s| s.to_string())
.reduce(|acc: String, next: String| acc + "::" + &next)
.unwrap_or_default())
.collect::<Vec<String>>();
let mut unique_flattened_imports = HashSet::new();
result.retain(|import| unique_flattened_imports.insert(import.clone()));
match order {
Order::Original => result,
Order::Sorted => {
result.sort_unstable();
result
}
}
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
let mut tree = ImportTreeNode { value: String::from(""), import_end: false, children: Vec::new() };
for import in imports {
tree_insert(&mut tree, import.0)
}
let ordered_tree = match order {
Order::Original => tree,
Order::Sorted => {
tree_sort(&mut tree);
tree
},
};
let mut result = Vec::new();
for child in ordered_tree.children.iter() {
result.push(node_serialize(&child, 0));
}
result
}
fn tree_sort(tree: &mut ImportTreeNode) {
if tree.children.len() == 0 {
return;
}
for child in tree.children.iter_mut() {
tree_sort(child)
}
tree.children.sort_unstable()
}
pub fn tree_insert(tree: &mut ImportTreeNode, import: &[&str]) {
if import.len() == 0 {
return;
}
for child in tree.children.iter_mut() {
if child.value == import[0] {
tree_insert(child, &import[1..]);
return;
}
}
tree.children.push(ImportTreeNode {
value: String::from(import[0]),
import_end: import.len() == 1,
children: Vec::new()
});
tree_insert(tree.children.last_mut().unwrap(), &import[1..]);
}
fn node_serialize(node: &ImportTreeNode, level: usize) -> String {
let mut result = String::new();
if node.children.len() > 0 {
result += &*format!("{}{}::{{\n", " ".repeat(level), node.value);
if node.import_end {
result += &*format!("{}self,\n", " ".repeat(level + 4));
}
for child in node.children.iter() {
result += &*node_serialize(child, level + 4);
}
result += &*format!("{}}}", " ".repeat(level));
if level != 0 {
result += ",";
}
result += "\n";
} else {
result += &*format!("{}{}", " ".repeat(level), node.value);
if level != 0 {
result += ",";
}
result += "\n";
}
result
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20241203-1739405-bahtsy/solution) Finished test [unoptimized + debuginfo] target(s) in 1.38s 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 ... FAILED 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 ... FAILED failures: ---- solution_test::test_nested_original_self stdout ---- thread 'solution_test::test_nested_original_self' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n c,\n b::{\n B2,\n B1,\n },\n a,\n}\n"]`, right: `["my_crate::{\n c,\n b::{\n self,\n B2,\n B1,\n },\n a,\n}\n"]`', tests/solution_test.rs:334:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ---- solution_test::test_nested_sorted_self stdout ---- thread 'solution_test::test_nested_sorted_self' panicked at 'assertion failed: `(left == right)` left: `["my_crate::{\n a,\n b::{\n B1,\n B2,\n },\n c,\n}\n"]`, right: `["my_crate::{\n a,\n b::{\n self,\n B1,\n B2,\n },\n c,\n}\n"]`', tests/solution_test.rs:360:5 failures: solution_test::test_nested_original_self solution_test::test_nested_sorted_self test result: FAILED. 18 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`