test: slight taiko bf refactor
This commit is contained in:
@@ -7,3 +7,5 @@
|
||||
cc 1883e1e612026e7f7c8035803830ff21b6d98c946cfb92c5c144e682a5d72ad2 # shrinks to acc = 0.0, n300 = None, n100 = None, n_misses = None, best_case = false
|
||||
cc 84792fb0ec8971122d0eb2e61355a637e9326ac2b7469226bba06a2defdc44dd # shrinks to acc = 0.659020825478002, n300 = None, n100 = None, n_misses = Some(99), best_case = false
|
||||
cc 94fb95e246e580e010115334e5fd7de6160b3a24a735e4cb4ab4341f5f7b769e # shrinks to acc = 0.0, n300 = Some(0), n100 = Some(1), n_misses = None, best_case = false
|
||||
cc fcc52507f0304061f5b94a7aa8bb5cc40e7156effe1e2c3434161a5c152409d0 # shrinks to acc = 0.0, n300 = None, n100 = Some(1), n_misses = None, best_case = false
|
||||
cc 8d6b15c9881ebf33b1b91bb9398264048b28a95cb902f747af6c8320063c21a6 # shrinks to acc = 0.0, n300 = Some(240), n100 = Some(50), n_misses = None, best_case = false
|
||||
|
||||
+30
-46
@@ -557,64 +557,48 @@ mod test {
|
||||
n_misses: usize,
|
||||
best_case: bool,
|
||||
) -> TaikoScoreState {
|
||||
let n_objects = MAX_COMBO;
|
||||
let n_misses = n_misses.min(n_objects);
|
||||
|
||||
let mut best_dist = f64::MAX;
|
||||
|
||||
let mut best_state = TaikoScoreState {
|
||||
n_misses,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let mut bf_with_100 = |n300: usize, n100: usize| {
|
||||
let dist = (acc - accuracy(n300, n100, n_misses)).abs();
|
||||
let mut best_dist = f64::INFINITY;
|
||||
|
||||
if dist < best_dist {
|
||||
best_dist = dist;
|
||||
best_state.n300 = n300;
|
||||
best_state.n100 = n100;
|
||||
}
|
||||
let n_objects = MAX_COMBO;
|
||||
let n_remaining = n_objects - n_misses;
|
||||
|
||||
let (min_n300, max_n300) = match (n300, n100) {
|
||||
(Some(n300), _) => (n_remaining.min(n300), n_remaining.min(n300)),
|
||||
(None, Some(n100)) => (
|
||||
n_remaining.saturating_sub(n100),
|
||||
n_remaining.saturating_sub(n100),
|
||||
),
|
||||
(None, None) => (0, n_remaining),
|
||||
};
|
||||
|
||||
let mut bf_with_300 = |n300: usize| match n100 {
|
||||
Some(mut n100) => {
|
||||
n100 = n100
|
||||
.min(n_objects - n_misses)
|
||||
.max(n_objects.saturating_sub(n300 + n_misses));
|
||||
for new300 in min_n300..=max_n300 {
|
||||
let new100 = match n100 {
|
||||
Some(n100) => n_remaining.min(n100),
|
||||
None => n_remaining - new300,
|
||||
};
|
||||
|
||||
bf_with_100(n300, n100);
|
||||
}
|
||||
None => {
|
||||
let n100 = n_objects.saturating_sub(n300 + n_misses);
|
||||
bf_with_100(n300, n100);
|
||||
}
|
||||
};
|
||||
let curr_acc = accuracy(new300, new100, n_misses);
|
||||
let curr_dist = (acc - curr_acc).abs();
|
||||
|
||||
match (n300, n100) {
|
||||
(Some(mut n300), Some(n100)) => {
|
||||
n300 = n300.min(n_objects - n_misses);
|
||||
|
||||
if best_case {
|
||||
n300 = n300.max(n_objects.saturating_sub(n100 + n_misses));
|
||||
}
|
||||
|
||||
bf_with_300(n300);
|
||||
if curr_dist < best_dist {
|
||||
best_dist = curr_dist;
|
||||
best_state.n300 = new300;
|
||||
best_state.n100 = new100;
|
||||
}
|
||||
(Some(mut n300), None) => {
|
||||
n300 = n300.min(n_objects - n_misses);
|
||||
bf_with_300(n300);
|
||||
}
|
||||
(None, Some(n100)) => {
|
||||
let n300 = n_objects.saturating_sub(n100 + n_misses);
|
||||
bf_with_300(n300);
|
||||
}
|
||||
(None, None) => {
|
||||
let n_remaining = n_objects - n_misses;
|
||||
}
|
||||
|
||||
for n300 in 0..=n_remaining {
|
||||
bf_with_300(n300);
|
||||
}
|
||||
if best_state.n300 + best_state.n100 < n_remaining {
|
||||
let remaining = n_remaining - (best_state.n300 + best_state.n100);
|
||||
|
||||
if best_case {
|
||||
best_state.n300 += remaining;
|
||||
} else {
|
||||
best_state.n100 += remaining;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user