Решение на Форматиране на импорти от Божидар Кьоров

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

Към профила на Божидар Кьоров

Резултати

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

Код

use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone, Copy)]
pub struct Import<'a>(pub &'a [&'a str]);
pub enum Order {
Original,
Sorted,
}
pub fn format_flat(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.0.cmp(b.0));
}
imports_vec
.into_iter()
.map(|import| import.0.join("::"))
.collect()
}
pub fn format_nested(imports: &[Import], order: Order) -> Vec<String> {
// Йерархична структура за съхранение на импортите
let mut tree: HashMap<&str, HashMap<Vec<&str>, HashSet<&str>>> = HashMap::new();
// Построяване на дървото
for import in imports {
if let Some((crate_name, path)) = import.0.split_first() {
let (module_path, leaf) = if let Some((last, rest)) = path.split_last() {
(rest.to_vec(), *last) // Разделяме на модулен път и последния елемент
} else {
(vec![], "self") // Ако няма други елементи, това е `self`
};
tree.entry(crate_name)
.or_insert_with(HashMap::new)
.entry(module_path)
.or_insert_with(HashSet::new)
.insert(leaf);
}
}
// Подготвяне на резултата
let mut result = Vec::new();
for (crate_name, modules) in tree {
let mut crate_output = format!("{}::{{", crate_name);
// Сортиране на модулните пътища
let mut module_paths: Vec<_> = modules.into_iter().collect();
module_paths.sort_by(|(a, _), (b, _)| a.cmp(b));
for (module_path, items) in module_paths {
let module_prefix = if module_path.is_empty() {
String::new()
} else {
format!("{}::", module_path.join("::"))
};
// Сортиране или запазване на реда на елементите в модулите
let mut items: Vec<_> = items.into_iter().collect();
match order {
Order::Sorted => items.sort(),
Order::Original => {}
}
if module_prefix.is_empty() {
// Ако няма префикс (най-горно ниво)
crate_output.push_str("\n ");
crate_output.push_str(&items.join(",\n "));
crate_output.push(',');
} else {
// Ако има модулен префикс
crate_output.push_str("\n ");
crate_output.push_str(&module_prefix);
crate_output.push_str("{\n ");
crate_output.push_str(&items.join(",\n "));
crate_output.push_str(",\n },");
}
}
crate_output.push_str("\n}\n");
result.push(crate_output);
}
result
}

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

Compiling solution v0.1.0 (/tmp/d20241203-1739405-1vqnwvy/solution)
    Finished test [unoptimized + debuginfo] target(s) in 1.36s
     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_sorted ... ok
test solution_test::test_flat_original_duplicates ... FAILED
test solution_test::test_flat_sorted_duplicates ... FAILED
test solution_test::test_nested_basic ... ok
test solution_test::test_nested_deep ... FAILED
test solution_test::test_nested_empty ... ok
test solution_test::test_nested_only_crate ... FAILED
test solution_test::test_nested_original ... FAILED
test solution_test::test_nested_original_duplicates ... FAILED
test solution_test::test_nested_original_multi_crate ... ok
test solution_test::test_nested_original_2 ... FAILED
test solution_test::test_nested_original_self ... FAILED
test solution_test::test_nested_sorted ... FAILED
test solution_test::test_nested_sorted_2 ... FAILED
test solution_test::test_nested_sorted_multi_crate ... ok
test solution_test::test_nested_sorted_duplicates ... FAILED
test solution_test::test_nested_sorted_self ... FAILED

failures:

---- solution_test::test_flat_original_duplicates stdout ----
thread 'solution_test::test_flat_original_duplicates' panicked at 'assertion failed: `(left == right)`
  left: `["std::string::String", "std::iter::once", "std::iter", "std::iter", "std::iter::repeat", "std::string::String"]`,
 right: `["std::string::String", "std::iter::once", "std::iter", "std::iter::repeat"]`', tests/solution_test.rs:44:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- solution_test::test_flat_sorted_duplicates stdout ----
thread 'solution_test::test_flat_sorted_duplicates' panicked at 'assertion failed: `(left == right)`
  left: `["std::iter", "std::iter", "std::iter::once", "std::iter::repeat", "std::string::String", "std::string::String"]`,
 right: `["std::iter", "std::iter::once", "std::iter::repeat", "std::string::String"]`', tests/solution_test.rs:88:5

---- solution_test::test_nested_deep stdout ----
thread 'solution_test::test_nested_deep' panicked at 'assertion failed: `(left == right)`
  left: `["std::{\n    a::b::c::{\n        d,\n    },\n}\n"]`,
 right: `["std::{\n    a::{\n        b::{\n            c::{\n                d,\n            },\n        },\n    },\n}\n"]`', tests/solution_test.rs:160:5

---- solution_test::test_nested_only_crate stdout ----
thread 'solution_test::test_nested_only_crate' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    self,\n}\n"]`,
 right: `["my_crate\n"]`', tests/solution_test.rs:132:5

---- solution_test::test_nested_original stdout ----
thread 'solution_test::test_nested_original' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    a,\n    c,\n    b::{\n        B1,\n        B2,\n    },\n}\n"]`,
 right: `["my_crate::{\n    c,\n    b::{\n        B2,\n        B1,\n    },\n    a,\n}\n"]`', tests/solution_test.rs:173:5

---- solution_test::test_nested_original_duplicates stdout ----
thread 'solution_test::test_nested_original_duplicates' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    a,\n    c,\n    b::{\n        B2,\n        B1,\n    },\n}\n"]`,
 right: `["my_crate::{\n    c,\n    b::{\n        B2,\n        B1,\n    },\n    a,\n}\n"]`', tests/solution_test.rs:283:5

---- solution_test::test_nested_original_2 stdout ----
thread 'solution_test::test_nested_original_2' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    c,\n    a::{\n        A1,\n    },\n    a::inner::{\n        I1,\n    },\n    b::{\n        B1,\n        B2,\n    },\n}\n"]`,
 right: `["my_crate::{\n    c,\n    b::{\n        B2,\n        B1,\n    },\n    a::{\n        inner::{\n            I1,\n        },\n        A1,\n    },\n}\n"]`', tests/solution_test.rs:198:5

---- solution_test::test_nested_original_self stdout ----
thread 'solution_test::test_nested_original_self' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    a,\n    c,\n    b,\n    b::{\n        B2,\n        B1,\n    },\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

---- solution_test::test_nested_sorted stdout ----
thread 'solution_test::test_nested_sorted' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    a,\n    c,\n    b::{\n        B1,\n        B2,\n    },\n}\n"]`,
 right: `["my_crate::{\n    a,\n    b::{\n        B1,\n        B2,\n    },\n    c,\n}\n"]`', tests/solution_test.rs:227:5

---- solution_test::test_nested_sorted_2 stdout ----
thread 'solution_test::test_nested_sorted_2' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    c,\n    a::{\n        A1,\n    },\n    a::inner::{\n        I1,\n    },\n    b::{\n        B1,\n        B2,\n    },\n}\n"]`,
 right: `["my_crate::{\n    a::{\n        A1,\n        inner::{\n            I1,\n        },\n    },\n    b::{\n        B1,\n        B2,\n    },\n    c,\n}\n"]`', tests/solution_test.rs:252:5

---- solution_test::test_nested_sorted_duplicates stdout ----
thread 'solution_test::test_nested_sorted_duplicates' panicked at 'assertion failed: `(left == right)`
  left: `["my_crate::{\n    a,\n    c,\n    b::{\n        B1,\n        B2,\n    },\n}\n"]`,
 right: `["my_crate::{\n    a,\n    b::{\n        B1,\n        B2,\n    },\n    c,\n}\n"]`', tests/solution_test.rs:309:5

---- 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    c,\n    b::{\n        B1,\n        B2,\n    },\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_flat_original_duplicates
    solution_test::test_flat_sorted_duplicates
    solution_test::test_nested_deep
    solution_test::test_nested_only_crate
    solution_test::test_nested_original
    solution_test::test_nested_original_2
    solution_test::test_nested_original_duplicates
    solution_test::test_nested_original_self
    solution_test::test_nested_sorted
    solution_test::test_nested_sorted_2
    solution_test::test_nested_sorted_duplicates
    solution_test::test_nested_sorted_self

test result: FAILED. 8 passed; 12 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 17:51 (преди 9 месеца)