88 lines
4.5 KiB
Rust
88 lines
4.5 KiB
Rust
#![allow(dead_code)]
|
|
//! 目前此文件用于临时测试、将来将提供所有题目的入口
|
|
const MASK_LOOKUP: [[u128; 5]; 5] = [
|
|
[0x00000000ffff0000000000000000ffff_u128, 0x000000000000000000000000ffff0000_u128, 0x000000000000ffff0000000000000000_u128, 0x00000000000000000000ffff00000000_u128, 0x0000000000000000ffff000000000000_u128],
|
|
[0x00000000ff00000000ffff00000000ff_u128, 0x0000000000000000ff0000000000ff00_u128, 0x0000000000ff0000000000ff00000000_u128, 0x00000000000000ff0000000000ff0000_u128, 0x000000000000ff0000000000ff000000_u128],
|
|
[0x00000000f0000ff0000ff0000ff0000f_u128, 0x000000000000f00000f00000f00000f0_u128, 0x000000000f00000f00000f00000f0000_u128, 0x00000000000f00000f00000f00000f00_u128, 0x0000000000f00000f00000f00000f000_u128],
|
|
[0x00000000c03c03c03c03c03c03c03c03_u128, 0x0000000000c00c00c00c00c00c00c00c_u128, 0x00000000300300300300300300300300_u128, 0x00000000030030030030030030030030_u128, 0x000000000c00c00c00c00c00c00c00c0_u128],
|
|
[0x00000000861861861861861861861861_u128, 0x00000000082082082082082082082082_u128, 0x00000000410410410410410410410410_u128, 0x00000000104104104104104104104104_u128, 0x00000000208208208208208208208208_u128]];
|
|
|
|
pub fn three(a: u32, b: u32, c: u32) -> u128 {
|
|
let mut a = ((a as u128) << 64) | ((b as u128) << 32) | (c as u128);
|
|
a = (a & MASK_LOOKUP[0][0]) | ((a & MASK_LOOKUP[0][1]) << 0x20) | ((a & MASK_LOOKUP[0][2]) >> 0x20) | ((a & MASK_LOOKUP[0][3]) >> 0x10) | ((a & MASK_LOOKUP[0][4]) << 0x10);
|
|
a = (a & MASK_LOOKUP[1][0]) | ((a & MASK_LOOKUP[1][1]) << 0x10) | ((a & MASK_LOOKUP[1][2]) >> 0x10) | ((a & MASK_LOOKUP[1][3]) >> 0x08) | ((a & MASK_LOOKUP[1][4]) << 0x08);
|
|
a = (a & MASK_LOOKUP[2][0]) | ((a & MASK_LOOKUP[2][1]) << 0x08) | ((a & MASK_LOOKUP[2][2]) >> 0x08) | ((a & MASK_LOOKUP[2][3]) >> 0x04) | ((a & MASK_LOOKUP[2][4]) << 0x04);
|
|
a = (a & MASK_LOOKUP[3][0]) | ((a & MASK_LOOKUP[3][1]) << 0x04) | ((a & MASK_LOOKUP[3][2]) >> 0x04) | ((a & MASK_LOOKUP[3][3]) >> 0x02) | ((a & MASK_LOOKUP[3][4]) << 0x02);
|
|
(a & MASK_LOOKUP[4][0]) | ((a & MASK_LOOKUP[4][1]) << 0x02) | ((a & MASK_LOOKUP[4][2]) >> 0x02) | ((a & MASK_LOOKUP[4][3]) >> 0x01) | ((a & MASK_LOOKUP[4][4]) << 0x01)
|
|
}
|
|
|
|
pub fn re_three(mut a: u128) -> (u32, u32, u32) {
|
|
a = (a & MASK_LOOKUP[4][0]) | ((a & MASK_LOOKUP[4][1]) << 0x01) | ((a & MASK_LOOKUP[4][2]) >> 0x01) | ((a & MASK_LOOKUP[4][3]) << 0x02) | ((a & MASK_LOOKUP[4][4]) >> 0x02);
|
|
a = (a & MASK_LOOKUP[3][0]) | ((a & MASK_LOOKUP[3][1]) << 0x02) | ((a & MASK_LOOKUP[3][2]) >> 0x02) | ((a & MASK_LOOKUP[3][3]) << 0x04) | ((a & MASK_LOOKUP[3][4]) >> 0x04);
|
|
a = (a & MASK_LOOKUP[2][0]) | ((a & MASK_LOOKUP[2][1]) << 0x04) | ((a & MASK_LOOKUP[2][2]) >> 0x04) | ((a & MASK_LOOKUP[2][3]) << 0x08) | ((a & MASK_LOOKUP[2][4]) >> 0x08);
|
|
a = (a & MASK_LOOKUP[1][0]) | ((a & MASK_LOOKUP[1][1]) << 0x08) | ((a & MASK_LOOKUP[1][2]) >> 0x08) | ((a & MASK_LOOKUP[1][3]) << 0x10) | ((a & MASK_LOOKUP[1][4]) >> 0x10);
|
|
a = (a & MASK_LOOKUP[0][0]) | ((a & MASK_LOOKUP[0][1]) << 0x10) | ((a & MASK_LOOKUP[0][2]) >> 0x10) | ((a & MASK_LOOKUP[0][3]) << 0x20) | ((a & MASK_LOOKUP[0][4]) >> 0x20);
|
|
((a >> 64) as u32, (a >> 32) as u32, a as u32)
|
|
}
|
|
|
|
pub fn test_speed() {
|
|
use std::time::Instant;
|
|
let t1 = Instant::now();
|
|
let t = 10000000;
|
|
for i in 0..t {
|
|
three(i, 0xffffffffu32, i);
|
|
}
|
|
println!("{}", t1.elapsed().as_millis());
|
|
}
|
|
|
|
struct Func<'a, A, F>(&'a dyn Fn(Func<'a, A, F>, A) -> F);
|
|
|
|
impl<'a, A, F> Clone for Func<'a, A, F> {
|
|
fn clone(&self) -> Self {
|
|
Self(self.0)
|
|
}
|
|
}
|
|
|
|
impl<'a, A, F> Copy for Func<'a, A, F> {}
|
|
|
|
impl<'a, A, F> Func<'a, A, F> {
|
|
fn call(&self, f: Func<'a, A, F>, x: A) -> F {
|
|
(self.0)(f, x)
|
|
}
|
|
}
|
|
|
|
fn y<A, R>(g: impl Fn(&dyn Fn(A) -> R, A) -> R) -> impl Fn(A) -> R {
|
|
move |x: A| {
|
|
(|f: Func<A, R>, x| f.call(f, x))(
|
|
Func(&|f: Func<A, R>, x: A| g(&|x: A| f.call(f, x), x)),
|
|
x,
|
|
)
|
|
}
|
|
}
|
|
|
|
fn test_y() {
|
|
let fact = y(|f: &dyn Fn(usize) -> usize, x: usize| match x {
|
|
0usize => 1usize,
|
|
1usize => 1usize,
|
|
_ => f(x - 2) + f(x - 1),
|
|
});
|
|
println!("{}", fact(10usize));
|
|
}
|
|
|
|
fn reformat() {
|
|
let contents = std::fs::read_to_string("F:\\MyProject\\my_leetcode\\rust\\src\\implements\\mod.rs").expect("Something went wrong reading the file");
|
|
let mut arr = contents.split("\r\n").collect::<Vec<&str>>();
|
|
arr.sort_unstable();
|
|
|
|
for item in arr {
|
|
println!("{}", item);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
test_speed();
|
|
test_y();
|
|
reformat();
|
|
//println!("{:0128b}", a);
|
|
}
|