summaryrefslogtreecommitdiff
path: root/src/row.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/row.rs')
-rw-r--r--src/row.rs27
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;
+ }
+ }
+}