Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Last active June 2, 2018 20:18
Show Gist options
  • Save AnthonyMikh/20a807d8dfe9d758801168d5a500ff26 to your computer and use it in GitHub Desktop.
Save AnthonyMikh/20a807d8dfe9d758801168d5a500ff26 to your computer and use it in GitHub Desktop.
Решение задачи №99 от UniLecs (непростая сортировка)
use std::borrow::Borrow;
use std::cmp::Ordering;
fn num_part_compare(a: &[u8], b: &[u8]) -> Ordering {
let a_b = a.iter().chain(b.iter());
let b_a = b.iter().chain(a.iter());
for (x, y) in a_b.zip(b_a) {
match x.cmp(y) {
Ordering::Equal => (),
non_eq => return non_eq.reverse()
}
}
Ordering::Equal
}
fn greatest_concatenated_mut<S>(arr: &mut [S]) -> String
where
S: Borrow<str> + Ord,
{
arr.sort_unstable_by(|a, b| num_part_compare(a.borrow().as_bytes(), b.borrow().as_bytes()));
arr.concat()
}
fn greatest_concatenated<S>(arr: &[S]) -> String
where
S: Borrow<str> + Ord
{
let mut buf = arr.iter().map(Borrow::borrow).collect::<Vec<_>>();
greatest_concatenated_mut(&mut buf)
}
#[test]
fn some_variants() {
let arr = ["123", "124", "56", "90"];
let answer = "9056124123";
assert_eq!(&greatest_concatenated(&arr), answer);
let arr = ["1", "100", "10"];
let answer = "110100";
assert_eq!(&greatest_concatenated(&arr), answer);
let arr = ["5", "54", "56"];
let answer = "56554";
assert_eq!(&greatest_concatenated(&arr), answer);
let arr = ["89", "30", "309", "300", "81", "8"];
let answer = "8988130930300";
assert_eq!(&greatest_concatenated(&arr), answer);
let arr = ["53", "5354"];
let answer = "535453";
assert_eq!(&greatest_concatenated(&arr), answer);
let arr = ["53", "5352"];
let answer = "535352";
assert_eq!(&greatest_concatenated(&arr), answer);
}
@AnthonyMikh
Copy link
Author

AnthonyMikh commented Jun 1, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment