Fortune for reverse's current commit: Middle blessing − 中吉master
commit
47df7a1e91
@ -0,0 +1 @@
|
|||||||
|
/target
|
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "reverse"
|
||||||
|
version = "0.2.0"
|
@ -0,0 +1,24 @@
|
|||||||
|
[package]
|
||||||
|
name = "reverse"
|
||||||
|
version = "0.2.0"
|
||||||
|
authors = ["Avril <flanchan@cumallover.me>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["output-lines"]
|
||||||
|
|
||||||
|
# Output as lines instead of `["2", "1", "0"]`
|
||||||
|
output-lines = []
|
||||||
|
|
||||||
|
# Print each string escaped
|
||||||
|
output-quoted = []
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
opt-level = 3
|
||||||
|
lto = "fat"
|
||||||
|
codegen-units = 1
|
||||||
|
strip=true
|
||||||
|
|
||||||
|
[dependencies]
|
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
|
reverse:
|
||||||
|
RUSTFLAGS="-C target-cpu=native" cargo build --release
|
||||||
|
strip target/release/$@
|
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
//#[inline]
|
||||||
|
fn reverse<T>(slice: &mut [T])
|
||||||
|
{
|
||||||
|
match slice {
|
||||||
|
[ref mut a, ref mut rest @ .., ref mut b] => {
|
||||||
|
std::mem::swap(a, b);
|
||||||
|
reverse(rest)
|
||||||
|
},
|
||||||
|
[] | [_] => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This actually works! And is so easily parallelisable with something like rayon, or asyncing by spawning/creating the tail-call into a new task, then either waiting them concurrently or in parallen (spawn or created future from just calling the function without awaiting it)
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn binsearch<'a, V: ?Sized, T: PartialEq<V> + 'a>(slice: &'a [T], find: &V) -> Option<&'a T>
|
||||||
|
{
|
||||||
|
match slice {
|
||||||
|
[ref a, pivot @ .., ref b] => {
|
||||||
|
match (a==find, b==find) {
|
||||||
|
(true, _) => Some(a),
|
||||||
|
(_, true) => Some(b),
|
||||||
|
_ => binsearch(pivot, find),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ref a] if a == find => Some(a),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut args: Vec<String> = std::env::args().skip(1).collect();
|
||||||
|
reverse(&mut args[..]);
|
||||||
|
//eprintln!("{:?}", binsearch(&args[..], "1")); // It works!
|
||||||
|
#[cfg(feature="output-lines")]
|
||||||
|
{
|
||||||
|
for x in args.iter() {
|
||||||
|
#[cfg(feature="output-quoted")] println!("{:?}", x);
|
||||||
|
#[cfg(not(feature="output-quoted"))] println!("{}", x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(not(feature="output-lines"))]
|
||||||
|
println!("{:?}", args);
|
||||||
|
}
|
Loading…
Reference in new issue