a lot of not needed logic i fear
This commit is contained in:
1 parent
fbd6cff526
commit
b3c0933cb5
2 files changed
+159
-9
No files matched your search
@@ -3,7 +3,7 @@ use std::ops::Range;
|
|||||||
/// a vec like struct, where everything is ever increasing and not by anything more than one.
|
/// a vec like struct, where everything is ever increasing and not by anything more than one.
|
||||||
///
|
///
|
||||||
/// so you can have 1, 2, 3, 4, 5 but not 0, 1, 1, 1, 3
|
/// so you can have 1, 2, 3, 4, 5 but not 0, 1, 1, 1, 3
|
||||||
#[derive(Debug, Default, PartialEq)]
|
#[derive(Debug, Default, PartialEq, Clone)]
|
||||||
pub struct DB {
|
pub struct DB {
|
||||||
/// inner starts from index 0 but inner\[0\] is the point where DB::vec is 1
|
/// inner starts from index 0 but inner\[0\] is the point where DB::vec is 1
|
||||||
inner: Vec<u32>,
|
inner: Vec<u32>,
|
||||||
@@ -40,7 +40,7 @@ impl DB {
|
|||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Default::default()
|
Default::default()
|
||||||
}
|
}
|
||||||
fn with_len(len: u32) -> Self {
|
pub fn with_len(len: u32) -> Self {
|
||||||
Self {
|
Self {
|
||||||
len,
|
len,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
@@ -84,13 +84,13 @@ impl DB {
|
|||||||
fn len(&self) -> u32 {
|
fn len(&self) -> u32 {
|
||||||
self.len
|
self.len
|
||||||
}
|
}
|
||||||
/// at looks the same as [`DB::vec`](DB::vec)(&self).[`get`](core::slice::get)(ind as usize)
|
/// looks the same as [`DB::vec`](DB::vec)(&self).[`get`](core::slice::get)(ind as usize)
|
||||||
fn get(&self, ind: u32) -> Option<u32> {
|
pub fn get(&self, ind: u32) -> Option<u32> {
|
||||||
if self.len() <= ind {
|
if self.len() <= ind {
|
||||||
// panic!("index {ind} >= len {selflen} which is ugly")
|
// panic!("index {ind} >= len {selflen} which is ugly")
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
self.inner
|
dbg!(&self.inner)
|
||||||
.iter()
|
.iter()
|
||||||
.rposition(|f| ind >= *f) // imagine got 7 > 4, and 4 is at index 2, so the value of 7 is 2
|
.rposition(|f| ind >= *f) // imagine got 7 > 4, and 4 is at index 2, so the value of 7 is 2
|
||||||
.map(|c| c as u32 + 1) // hack
|
.map(|c| c as u32 + 1) // hack
|
||||||
@@ -170,7 +170,7 @@ impl DB {
|
|||||||
(None, None)
|
(None, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn change(&mut self, ind: u32, val: u32) {
|
pub fn change(&mut self, ind: u32, val: u32) {
|
||||||
let (avail, up) = self.available_values(ind);
|
let (avail, up) = self.available_values(ind);
|
||||||
if let (Some(avail), Some(up)) = (avail, up) {
|
if let (Some(avail), Some(up)) = (avail, up) {
|
||||||
if val == avail[0] && up {
|
if val == avail[0] && up {
|
||||||
@@ -190,7 +190,39 @@ impl DB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn vec(&self) -> Vec<u32> {
|
/// override everything from ind on, that is if ind / val is good
|
||||||
|
pub fn propagate_to_end(&mut self, ind: u32, val: u32) {
|
||||||
|
println!("idn = {ind}, vala{val}");
|
||||||
|
if ind >= self.len() {
|
||||||
|
panic!("uh oh out of bounds: {ind} >={}", self.len())
|
||||||
|
}
|
||||||
|
if self.len() > 0 {
|
||||||
|
if matches!(self.last(), Some(x) if dbg!(x) > 0) {
|
||||||
|
match dbg!(self.get(ind)) {
|
||||||
|
Some(vecv) if vecv == val => {
|
||||||
|
self.inner.truncate(val as usize);
|
||||||
|
}
|
||||||
|
Some(vecv) if val == vecv + 1 => {
|
||||||
|
self.inner.truncate(val as usize + 1);
|
||||||
|
self.inner.push(ind);
|
||||||
|
}
|
||||||
|
Some(x) if val == x - 1 && self.inner[val as usize] == ind => {
|
||||||
|
self.inner.truncate(val as usize);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
unreachable!("len is > 0")
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if val == 1 {
|
||||||
|
self.inner.push(ind);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{:?}", self.inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn vec(&self) -> Vec<u32> {
|
||||||
let mut count = (0..).into_iter();
|
let mut count = (0..).into_iter();
|
||||||
self.inner
|
self.inner
|
||||||
.iter()
|
.iter()
|
||||||
@@ -487,6 +519,70 @@ mod test {
|
|||||||
assert_eq!(db, db2);
|
assert_eq!(db, db2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[test]
|
||||||
|
fn prop_idk() {
|
||||||
|
let c = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13];
|
||||||
|
let mut db = DB::try_from_vec(c.clone()).unwrap();
|
||||||
|
dbg!(&mut db).propagate_to_end(2, 2);
|
||||||
|
dbg!(&db);
|
||||||
|
println!("{:?}", db.vec());
|
||||||
|
assert_eq!(db.inner, vec![0, 1]);
|
||||||
|
let mut db = DB::try_from_vec(c.clone()).unwrap();
|
||||||
|
db.propagate_to_end(2, 3);
|
||||||
|
println!("{:?}", db.vec());
|
||||||
|
assert_eq!(db.inner, vec![0, 1, 2]);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn prop() {
|
||||||
|
let base = [
|
||||||
|
0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 12, 13,
|
||||||
|
14, 15, 16, 17, 17, 18, 18, 18, 18, 18, 19, 20, 21, 21, 21, 21, 22, 23, 23, 24, 25, 26,
|
||||||
|
26, 26,
|
||||||
|
];
|
||||||
|
|
||||||
|
let prop = |bd: &mut DB, cc: &mut Vec<u32>, i, v: u32| {
|
||||||
|
cc.get_mut(i as usize..).unwrap().fill(v);
|
||||||
|
bd.propagate_to_end(i, v);
|
||||||
|
};
|
||||||
|
{
|
||||||
|
let mut c = base.to_vec();
|
||||||
|
let mut db = DB::try_from_vec(c.to_vec()).unwrap();
|
||||||
|
|
||||||
|
prop(&mut db, &mut c, 15, 7);
|
||||||
|
prop(&mut db, &mut c, 28, 8);
|
||||||
|
|
||||||
|
println!("{db:?}, {c:?}");
|
||||||
|
|
||||||
|
assert_eq!(db, DB::try_from_vec(c.clone()).unwrap());
|
||||||
|
assert_eq!(db.vec(), c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn prop_failcase() {
|
||||||
|
let base = [
|
||||||
|
0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 12, 13,
|
||||||
|
14, 15, 16, 17, 17, 18, 18, 18, 18, 18, 19, 20, 21, 21, 21, 21, 22, 23, 23, 24, 25, 26,
|
||||||
|
26, 26,
|
||||||
|
];
|
||||||
|
|
||||||
|
let prop = |bd: &mut DB, cc: &mut Vec<u32>, i, v: u32| {
|
||||||
|
cc.get_mut(i as usize..).unwrap().fill(v);
|
||||||
|
bd.propagate_to_end(i, v);
|
||||||
|
};
|
||||||
|
{
|
||||||
|
let mut c = base.to_vec();
|
||||||
|
let mut db = DB::try_from_vec(c.to_vec()).unwrap();
|
||||||
|
|
||||||
|
// prop(&mut db, &mut c, 12, 6);
|
||||||
|
prop(&mut db, &mut c, 28, 14);
|
||||||
|
|
||||||
|
println!("{db:?}, {c:?}");
|
||||||
|
|
||||||
|
assert_eq!(db.vec(), c);
|
||||||
|
assert_eq!(db, DB::try_from_vec(c.clone()).unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// // [0,0,0,1,1,1,2,2,3] 9
|
// // [0,0,0,1,1,1,2,2,3] 9
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
use db::DB;
|
||||||
|
|
||||||
mod db;
|
mod db;
|
||||||
|
|
||||||
pub fn lcs_gen(str1: &str, str2: &str) -> Vec<Vec<u32>> {
|
pub fn lcs_gen(str1: &str, str2: &str) -> Vec<Vec<u32>> {
|
||||||
@@ -27,16 +29,50 @@ pub fn lcs_gen(str1: &str, str2: &str) -> Vec<Vec<u32>> {
|
|||||||
db
|
db
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn lcs_gen_DB(str1: &str, str2: &str) -> Vec<DB> {
|
||||||
|
let c1: Vec<char> = str1.chars().collect();
|
||||||
|
let c1len = c1.len();
|
||||||
|
let c2: Vec<char> = str2.chars().collect();
|
||||||
|
let c2len = c2.len();
|
||||||
|
let mut db: Vec<DB> = vec![DB::with_len(c2len as u32 + 1); c1len + 1];
|
||||||
|
if c1len * c2len == 0 {
|
||||||
|
// for i in &db {
|
||||||
|
// println!("{i:?}")
|
||||||
|
// }
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
let estr: &str = "out bounds";
|
||||||
|
for i in 1..=c1len {
|
||||||
|
for j in 1..=c2len {
|
||||||
|
if c1[i - 1] == c2[j - 1] {
|
||||||
|
let val = db[i - 1].get(j as u32 - 1).expect(estr) + 1;
|
||||||
|
db[i].propagate_to_end(j as u32, val);
|
||||||
|
} else {
|
||||||
|
let val = db[i]
|
||||||
|
.get(j as u32 - 1)
|
||||||
|
.expect(estr)
|
||||||
|
.max(db[i - 1].get(j as _).expect(estr));
|
||||||
|
db[i].propagate_to_end(j as _, val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for i in &db {
|
||||||
|
// println!("{i:?}")
|
||||||
|
// }
|
||||||
|
db
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::lcs_gen;
|
|
||||||
|
use super::{lcs_gen, lcs_gen_DB, DB};
|
||||||
#[test]
|
#[test]
|
||||||
fn test_normal_case() {
|
fn test_normal_case() {
|
||||||
lcs_gen("asjhdgasdhj", "gajhdgashjd");
|
lcs_gen("asjhdgasdhj", "gajhdgashjd");
|
||||||
// lcs_gen("", "");
|
// lcs_gen("", "");
|
||||||
}
|
}
|
||||||
#[test]
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn test_wiki() {
|
fn test_wiki() {
|
||||||
// 0 1 2 3 4 5 6 7
|
// 0 1 2 3 4 5 6 7
|
||||||
// ε M Z J A W X U
|
// ε M Z J A W X U
|
||||||
@@ -62,6 +98,24 @@ mod test {
|
|||||||
assert_eq!(lcs_gen("XMJYAUZ", "MZJAWXU"), s)
|
assert_eq!(lcs_gen("XMJYAUZ", "MZJAWXU"), s)
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
|
fn test_db() {
|
||||||
|
let s: Vec<Vec<u32>> = vec![
|
||||||
|
vec![0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
vec![0, 0, 0, 0, 0, 0, 1, 1],
|
||||||
|
vec![0, 1, 1, 1, 1, 1, 1, 1],
|
||||||
|
vec![0, 1, 1, 2, 2, 2, 2, 2],
|
||||||
|
vec![0, 1, 1, 2, 2, 2, 2, 2],
|
||||||
|
vec![0, 1, 1, 2, 3, 3, 3, 3],
|
||||||
|
vec![0, 1, 1, 2, 3, 3, 3, 4],
|
||||||
|
vec![0, 1, 2, 2, 3, 3, 3, 4],
|
||||||
|
];
|
||||||
|
let c: Vec<Vec<u32>> = lcs_gen_DB("XMJYAUZ", "MZJAWXU")
|
||||||
|
.iter()
|
||||||
|
.map(DB::vec)
|
||||||
|
.collect();
|
||||||
|
assert_eq!(c, s)
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
fn test_empty() {
|
fn test_empty() {
|
||||||
lcs_gen("", "");
|
lcs_gen("", "");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user