diff options
author | Dennis Kobert <dennis@kobert.dev> | 2020-01-02 14:47:39 +0000 |
---|---|---|
committer | Dennis Kobert <dennis@kobert.dev> | 2020-01-02 14:47:39 +0000 |
commit | 82a65a82873c6699f12c9c6186705e0089c58240 (patch) | |
tree | 42e26ecacdee54cc9b80fa9956bc956ed692b31f /src/row.rs | |
parent | 20aaa152b25121f992480452a270ba1e0d5b5dd3 (diff) | |
parent | edaccaaf15a526714f3de4e9e044341abd037885 (diff) |
Merge branch 'master' of /var/repos/babel
Diffstat (limited to 'src/row.rs')
-rw-r--r-- | src/row.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/row.rs b/src/row.rs new file mode 100644 index 0000000..fc0633b --- /dev/null +++ b/src/row.rs @@ -0,0 +1,27 @@ +pub fn encode_row(n: u32, mut x: u64) -> Vec<u32> { + let mut row = Vec::with_capacity(n as usize); + let mut pieces: Vec<u32> = (0..n).collect(); + for i in (1..=n.into()).rev() { + let p = (x % i) as u32; + let piece = pieces[p as usize]; + row.push(piece + 1); + pieces.swap_remove(p as usize); + x /= i; + } + row +} + +pub fn colliding(w1: &[u32], w2: &[u32]) -> bool { + let n = w1.len() - 1; + let (mut v1, mut v2) = (w1.iter().take(n), w2.iter().take(n)); + let (mut i, mut j) = (*v1.next().unwrap(), *v2.next().unwrap()); + loop { + if i < j { + i += if let Some(&k) = v1.next() { k } else { return false; }; + } else if i > j { + j += if let Some(&k) = v2.next() { k } else { return false; }; + } else { + return true; + } + } +} |