my_leetcode/rust/src/main.rs

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);
}