extern crate discrete;
use discrete::*;
fn main() {
let x: DimensionN = Construct::new();
let n = std::env::args_os().nth(1)
.and_then(|s| s.into_string().ok())
.and_then(|n| n.parse().ok())
.unwrap_or(4);
let base = std::env::args_os().nth(2)
.and_then(|s| s.into_string().ok())
.and_then(|n| n.parse().ok())
.unwrap_or(3);
println!("n {}, base {}", n, base);
let rot = gen_rotation_map(n);
let ref dim = vec![base; n];
let count = x.count(dim);
let mut a = vec![0; n];
let mut b = vec![0; n];
let mut counter: u64 = 0;
'i: for i in 0..count {
x.to_pos(dim, i, &mut a);
for k in 0..rot.len() {
for m in 0..n {
b[m] = a[rot[k][m]];
}
if x.to_index(dim, &b) < i { continue 'i; }
}
if count < 500 || counter % 100000 == 0 {
println!("{:?},", a);
}
counter += 1;
}
println!("necklaces {}", counter);
}
fn gen_rotation_map(n: usize) -> Vec<Vec<usize>> {
let mut res = vec![];
for i in 0..n {
let mut row = vec![];
for j in 0..n {
row.push((j + i) % n);
}
res.push(row)
}
res
}