喜报,过了
This commit is contained in:
parent
18252fe47d
commit
3db2606e65
190
src/name.rs
190
src/name.rs
@ -138,25 +138,6 @@ impl Namer {
|
|||||||
let name_bytes = name.as_bytes();
|
let name_bytes = name.as_bytes();
|
||||||
let name_len = name_bytes.len();
|
let name_len = name_bytes.len();
|
||||||
let b_name_len = name_len + 1;
|
let b_name_len = name_len + 1;
|
||||||
// // 计算
|
|
||||||
// for i in 0..256 {
|
|
||||||
// s += team_bytes[i % (team_len + 1)] as u32 + val[i] as u32;
|
|
||||||
// s %= 256;
|
|
||||||
// let tmp = val[i];
|
|
||||||
// val[i] = val[s as usize];
|
|
||||||
// val[s as usize] = tmp;
|
|
||||||
// }
|
|
||||||
// s = 0;
|
|
||||||
// cpp 实现
|
|
||||||
/*
|
|
||||||
for (int _ = 0; _ < 2; _++) {
|
|
||||||
for (int i = s = 0, j = 0; i < N; i++, j++) {
|
|
||||||
s += name[j];
|
|
||||||
s += val[i];
|
|
||||||
std::swap(val[i], val[s]);
|
|
||||||
if (j == len) j = -1;
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
for _ in 0..2 {
|
for _ in 0..2 {
|
||||||
// 手动处理 0 的问题
|
// 手动处理 0 的问题
|
||||||
// 手动swap
|
// 手动swap
|
||||||
@ -172,24 +153,6 @@ impl Namer {
|
|||||||
val.swap(i, s as usize);
|
val.swap(i, s as usize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
#define median(x, y, z) std::max(std::min(x, y), std::min(std::max(x, y), z))
|
|
||||||
#define LIM 96
|
|
||||||
#define WK(x) val[i + x] = val[i + x] * 181 + 160;
|
|
||||||
#define a name_base
|
|
||||||
for (int i = 0; i < LIM; i += 8) {
|
|
||||||
WK(0) WK(1) WK(2) WK(3) WK(4) WK(5) WK(6) WK(7)
|
|
||||||
}
|
|
||||||
for (int i = 0; i < LIM && q_len < 30; i++)
|
|
||||||
if (val[i] >= 89 && val[i] < 217) a[++q_len] = val[i] & 63;
|
|
||||||
|
|
||||||
if (q_len < 30) {
|
|
||||||
for (int i = LIM; i < N; i += 8) {
|
|
||||||
WK(0) WK(1) WK(2) WK(3) WK(4) WK(5) WK(6) WK(7)
|
|
||||||
}
|
|
||||||
for (int i = LIM; i < N && q_len < 30; i++)
|
|
||||||
if (val[i] >= 89 && val[i] < 217) a[++q_len] = val[i] & 63;
|
|
||||||
}*/
|
|
||||||
// simd 优化
|
// simd 优化
|
||||||
#[cfg(feature = "simd")]
|
#[cfg(feature = "simd")]
|
||||||
{
|
{
|
||||||
@ -282,110 +245,59 @@ impl Namer {
|
|||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn update_skill(&mut self) {
|
pub fn update_skill(&mut self) {
|
||||||
/*
|
|
||||||
template <int len>
|
|
||||||
void calc_skills() {
|
|
||||||
// q_len = -1;
|
|
||||||
// memcpy(val, val_base, sizeof val);
|
|
||||||
// for (int _ = 0; _ < 2; _++)
|
|
||||||
// for (int i = s = 0, j = 0; i < N; i++, j++) {
|
|
||||||
// s += name[j];
|
|
||||||
// s += val[i];
|
|
||||||
// std::swap(val[i], val[s]);
|
|
||||||
// if (j == len) j = -1;
|
|
||||||
// }
|
|
||||||
for (int i = 0; i < N; i++)
|
|
||||||
if (val[i] * 181 + 199 & 128) name_base[++q_len] = val[i] * 53 & 63 ^ 32;
|
|
||||||
|
|
||||||
u8_t *a = name_base + K;
|
|
||||||
for (int i = 0; i < skill_cnt; i++) skill[i] = i;
|
|
||||||
p = q = s = 0;
|
|
||||||
for (int _ = 0; _ < 2; _++)
|
|
||||||
for (int i = 0; i < skill_cnt; i++) {
|
|
||||||
s = (s + rnd() + skill[i]) % skill_cnt;
|
|
||||||
std::swap(skill[i], skill[s]);
|
|
||||||
}
|
|
||||||
int last = -1;
|
|
||||||
for (int i = 0, j = 0; j < 16; i += 4, j++) {
|
|
||||||
u8_t p = std::min(std::min(a[i], a[i + 1]), std::min(a[i + 2], a[i + 3]));
|
|
||||||
if (p > 10 && skill[j] < 35) {
|
|
||||||
freq[j] = p - 10;
|
|
||||||
if (skill[j] < 25) last = j;
|
|
||||||
} else
|
|
||||||
freq[j] = 0;
|
|
||||||
}
|
|
||||||
if (last != -1) freq[last] <<= 1;
|
|
||||||
if (freq[14] && last != 14)
|
|
||||||
freq[14] += std::min(std::min(name_base[60], name_base[61]), freq[14]);
|
|
||||||
if (freq[15] && last != 15)
|
|
||||||
freq[15] += std::min(std::min(name_base[62], name_base[63]), freq[15]);
|
|
||||||
} */
|
|
||||||
|
|
||||||
let skill_id = self.skl_id.as_mut();
|
let skill_id = self.skl_id.as_mut();
|
||||||
for i in 0..40 {
|
for i in 0..40 {
|
||||||
skill_id[i] = i as u8
|
skill_id[i] = i as u8
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut name_base = self.name_base.clone();
|
|
||||||
#[cfg(feature = "simd")]
|
#[cfg(feature = "simd")]
|
||||||
{
|
{
|
||||||
// let mut simd_val = self.val.clone();
|
let mut simd_val = self.val.clone();
|
||||||
// let mut simd_val_b = self.val.clone();
|
let mut simd_val_b = self.val.clone();
|
||||||
// let simd_181 = u8x64::splat(181);
|
let simd_181 = u8x64::splat(181);
|
||||||
// let simd_199 = u8x64::splat(199);
|
let simd_199 = u8x64::splat(199);
|
||||||
// let simd_128 = u8x64::splat(128);
|
let simd_128 = u8x64::splat(128);
|
||||||
// let simd_53 = u8x64::splat(53);
|
let simd_53 = u8x64::splat(53);
|
||||||
// let simd_63 = u8x64::splat(63);
|
let simd_63 = u8x64::splat(63);
|
||||||
// let simd_32 = u8x64::splat(32);
|
let simd_32 = u8x64::splat(32);
|
||||||
|
|
||||||
// for i in (0..256).step_by(64) {
|
for i in (0..256).step_by(64) {
|
||||||
// let mut x = u8x64::from_slice(&simd_val[i..]);
|
let mut x = u8x64::from_slice(&simd_val[i..]);
|
||||||
// let mut y = u8x64::from_slice(&simd_val_b[i..]);
|
let mut y = u8x64::from_slice(&simd_val_b[i..]);
|
||||||
// x = x * simd_181 + simd_199 & simd_128;
|
x = x * simd_181 + simd_199 & simd_128;
|
||||||
// y = y * simd_53 & simd_63 ^ simd_32;
|
y = y * simd_53 & simd_63 ^ simd_32;
|
||||||
// x.copy_to_slice(&mut simd_val[i..]);
|
x.copy_to_slice(&mut simd_val[i..]);
|
||||||
// y.copy_to_slice(&mut simd_val_b[i..]);
|
y.copy_to_slice(&mut simd_val_b[i..]);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// let mut mod_count = 0;
|
let mut mod_count = 0;
|
||||||
// for i in 0..256 {
|
for i in 0..256 {
|
||||||
// if simd_val[i] != 0 {
|
if simd_val[i] != 0 {
|
||||||
// name_base[mod_count as usize] = simd_val_b[i];
|
self.name_base[mod_count as usize] = simd_val_b[i];
|
||||||
// mod_count += 1;
|
mod_count += 1;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// const int N = 256, M = 128, K = 64, skill_cnt = 40, max_len = 25;
|
// const int N = 256, M = 128, K = 64, skill_cnt = 40, max_len = 25;
|
||||||
let mut p: u8 = 0;
|
let mut a: u8 = 0;
|
||||||
let mut q: u8 = 0;
|
let mut b: u8 = 0;
|
||||||
let mut s: u8 = 0;
|
let mut s: u8 = 0;
|
||||||
println!("val: {:?}", self.val);
|
|
||||||
println!("name_base: {:?}", name_base);
|
|
||||||
for _ in 0..2 {
|
for _ in 0..2 {
|
||||||
for i in 0..40 {
|
for i in 0..40 {
|
||||||
/*
|
|
||||||
inline u8_t rnd() {
|
|
||||||
q += val[++p];
|
|
||||||
std::swap(val[p], val[q]);
|
|
||||||
u8_t u = val[(val[p] + val[q]) & 255];
|
|
||||||
q += val[++p];
|
|
||||||
std::swap(val[p], val[q]);
|
|
||||||
return (u << 8 | val[(val[p] + val[q]) & 255]) % skill_cnt;
|
|
||||||
} */
|
|
||||||
let rnd = {
|
let rnd = {
|
||||||
q = q.wrapping_add(self.val[p as usize]);
|
a += 1;
|
||||||
p += 1;
|
b = b.wrapping_add(self.val[a as usize]);
|
||||||
self.val.swap(p as usize, q as usize);
|
self.val.swap(a as usize, b as usize);
|
||||||
let u: u8 = self.val
|
let u: u8 = self.val[((self.val[a as usize] as u16
|
||||||
[((self.val[p as usize] as u16 + self.val[q as usize] as u16) & 255) as usize];
|
+ self.val[b as usize] as u16)
|
||||||
q = q.wrapping_add(self.val[p as usize]);
|
& 255) as usize];
|
||||||
p += 1;
|
a += 1;
|
||||||
self.val.swap(p as usize, q as usize);
|
b = b.wrapping_add(self.val[a as usize]);
|
||||||
let t = self.val
|
self.val.swap(a as usize, b as usize);
|
||||||
[((self.val[p as usize] as u16 + self.val[q as usize] as u16) & 255) as usize];
|
let t = self.val[((self.val[a as usize] as u16
|
||||||
|
+ self.val[b as usize] as u16)
|
||||||
|
& 255) as usize];
|
||||||
(((u as u32) << 8 | t as u32) % 40) as u8
|
(((u as u32) << 8 | t as u32) % 40) as u8
|
||||||
};
|
};
|
||||||
println!("rnd: {} i: {i}", rnd);
|
|
||||||
// s = (s.wrapping_add(rnd).wrapping_add(skill_id[i])) % 40;
|
|
||||||
s = (s as u16 + rnd as u16 + skill_id[i] as u16) as u8 % 40;
|
s = (s as u16 + rnd as u16 + skill_id[i] as u16) as u8 % 40;
|
||||||
skill_id.swap(i as usize, s as usize);
|
skill_id.swap(i as usize, s as usize);
|
||||||
}
|
}
|
||||||
@ -393,7 +305,6 @@ impl Namer {
|
|||||||
let mut last = -1;
|
let mut last = -1;
|
||||||
let mut j = 0;
|
let mut j = 0;
|
||||||
for i in (64..128).step_by(4) {
|
for i in (64..128).step_by(4) {
|
||||||
// a[k] == self.name_base[k+10]
|
|
||||||
let p = min(
|
let p = min(
|
||||||
min(self.name_base[i + 0], self.name_base[i + 1]),
|
min(self.name_base[i + 0], self.name_base[i + 1]),
|
||||||
min(self.name_base[i + 2], self.name_base[i + 3]),
|
min(self.name_base[i + 2], self.name_base[i + 3]),
|
||||||
@ -428,7 +339,7 @@ impl Namer {
|
|||||||
|
|
||||||
#[cfg(not(feature = "simd"))]
|
#[cfg(not(feature = "simd"))]
|
||||||
{
|
{
|
||||||
todo!("none simd 还没写呢")
|
todo!("none simd 还没写呢")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,9 +391,19 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn base_name_test() {
|
fn base_name_test() {
|
||||||
let team = TeamNamer::new_unchecked("x");
|
let team = TeamNamer::new_unchecked("x");
|
||||||
let namer = Namer::new_from_team_namer_unchecked(&team, "x");
|
let mut namer = Namer::new_from_team_namer_unchecked(&team, "x");
|
||||||
|
|
||||||
let base_name_vec: Vec<u8> = vec![
|
let base_name_vec: Vec<u8> = vec![
|
||||||
|
53, 0, 40, 4, 58, 61, 37, 46, 56, 51, 21, 20, 27, 17, 15, 26, 13, 30, 52, 63, 36, 30,
|
||||||
|
57, 34, 22, 37, 35, 6, 12, 25, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
];
|
||||||
|
assert_eq!(namer.name_base.to_vec(), base_name_vec);
|
||||||
|
namer.update_skill();
|
||||||
|
// update skill 之后才会是完整的 name
|
||||||
|
|
||||||
|
let full_base_name_vec: Vec<u8> = vec![
|
||||||
53, 0, 40, 4, 58, 61, 37, 46, 56, 51, 21, 20, 27, 17, 15, 26, 13, 30, 52, 63, 36, 30,
|
53, 0, 40, 4, 58, 61, 37, 46, 56, 51, 21, 20, 27, 17, 15, 26, 13, 30, 52, 63, 36, 30,
|
||||||
57, 34, 22, 37, 35, 6, 12, 25, 50, 49, 59, 23, 49, 27, 51, 58, 39, 28, 60, 20, 31, 36,
|
57, 34, 22, 37, 35, 6, 12, 25, 50, 49, 59, 23, 49, 27, 51, 58, 39, 28, 60, 20, 31, 36,
|
||||||
41, 11, 7, 29, 24, 24, 61, 62, 57, 4, 28, 48, 55, 50, 38, 29, 10, 40, 42, 15, 23, 47,
|
41, 11, 7, 29, 24, 24, 61, 62, 57, 4, 28, 48, 55, 50, 38, 29, 10, 40, 42, 15, 23, 47,
|
||||||
@ -490,7 +411,7 @@ mod test {
|
|||||||
41, 55, 5, 34, 3, 7, 33, 33, 45, 16, 16, 32, 43, 18, 44, 22, 14, 17, 10, 11, 53, 18,
|
41, 55, 5, 34, 3, 7, 33, 33, 45, 16, 16, 32, 43, 18, 44, 22, 14, 17, 10, 11, 53, 18,
|
||||||
44, 19, 52, 2, 32, 12, 8, 2, 54, 26, 48, 8, 3, 63, 54, 19, 25,
|
44, 19, 52, 2, 32, 12, 8, 2, 54, 26, 48, 8, 3, 63, 54, 19, 25,
|
||||||
];
|
];
|
||||||
assert_eq!(namer.name_base.to_vec(), base_name_vec);
|
assert_eq!(namer.name_base.to_vec(), full_base_name_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -499,10 +420,11 @@ mod test {
|
|||||||
let mut namer = Namer::new_from_team_namer_unchecked(&team, "x");
|
let mut namer = Namer::new_from_team_namer_unchecked(&team, "x");
|
||||||
|
|
||||||
namer.update_skill();
|
namer.update_skill();
|
||||||
// println!("namer: {:?}", namer);
|
let skill_prop_vec: Vec<u8> = vec![
|
||||||
println!("skill prop {:?}", namer.skl_freq);
|
13, 0, 0, 0, 0, 0, 0, 0, 6, 8, 0, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
println!("skill id {:?}", namer.skl_id);
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
panic!()
|
];
|
||||||
|
assert_eq!(namer.skl_freq.to_vec(), skill_prop_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user