Решение на Форматиране на импорти от Петър Велков

Обратно към всички решения

Към профила на Петър Велков

Резултати

  • 19 точки от тестове
  • 0 бонус точки
  • 19 точки общо
  • 19 успешни тест(а)
  • 1 неуспешни тест(а)

Код

use std::collections::HashSet;
#[derive(Clone)]
pub struct Import<'a>(pub &'a [&'a str]);
impl<'a> Import<'a> {
pub fn to_formatted(&self) -> String {
self.0.join("::")
}
}
pub enum Order {
Original,
Sorted,
}
pub fn format_flat(imports: &[Import], order: Order) -> Vec<String> {
let mut imports_vec = imports.to_vec();
match order {
Order::Original => (),
Order::Sorted => imports_vec.sort_by(|a, b| a.to_formatted().cmp(&b.to_formatted())),
}
let mut formatted_imports: Vec<String> = Vec::new();
let mut added_imports: HashSet<String> = HashSet::new();
for import in imports_vec {
let formatted_import: String = import.to_formatted();
if added_imports.insert(formatted_import.clone()) {
formatted_imports.push(formatted_import);
}
}
formatted_imports
}
struct Tree {
root: Node
}
struct Node
{
value: String,
children: Vec<Node>,
has_self: bool,
}
impl Node {
fn new(value: String) -> Self {
Node {
value,
children: Vec::new(),
has_self: false,
}
}
fn insert(&mut self, path: &[&str]) {
if path.is_empty() {
self.has_self = true;
return;
}
let segment = path[0];
let rest = &path[1..];
if let Some(child) = self.children.iter_mut().find(|c| c.value == segment) {
child.insert(rest);
} else {
let mut new_child = Node::new(segment.to_string());
new_child.insert(rest);
self.children.push(new_child);
}
}
}
fn format_node(
node: &Node,
indent_level: usize,
output: &mut Vec<String>,
) {
let indent = " ".repeat(indent_level);
if node.children.is_empty() {
output.push(format!("{}{},", indent, node.value));
} else {
output.push(format!("{}{}::{{", indent, node.value));
if node.has_self {
// output.push("self,".to_string());
output.push(format!("{}{}", " ".repeat(indent_level+1), "self,"));
}
for child in &node.children {
format_node(child, indent_level + 1, output);
}
output.push(format!("{}}}{}", indent, if indent_level == 0 { "\n" } else { "," }));
}
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
let mut imports_vec = imports.to_vec();
if let Order::Sorted = order {
imports_vec.sort_by(|a, b| a.to_formatted().cmp(&b.to_formatted()));
}
let mut added_imports = HashSet::new();
let mut tree = Tree {
root: Node::new(String::new()),
};
for import in imports_vec {
let path = import.0;
let path_key = path.join("::");
if added_imports.insert(path_key) {
tree.root.insert(path);
}
}
let mut formatted_imports = Vec::new();
for node in &tree.root.children {
let mut nested_imports = Vec::new();
format_node(node, 0, &mut nested_imports);
formatted_imports.push(nested_imports.join("\n"));
}
formatted_imports
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20241203-1739405-1yg530b/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.27s
     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_original ... ok
test solution_test::test_nested_only_crate ... FAILED
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

failures:

---- solution_test::test_nested_only_crate stdout ----
thread 'solution_test::test_nested_only_crate' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate,"]`,
 right: `["my_crate\n"]`', tests/solution_test.rs:132:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    solution_test::test_nested_only_crate

test result: FAILED. 19 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--test solution_test`

История (1 версия и 0 коментара)

Петър качи първо решение на 03.12.2024 16:59 (преди 9 месеца)