pub fn generate(iterations: usize, resolution: usize) -> Vec<u32> {
if resolution == 0 {
return vec![];
}
let mut set = vec![1u32; resolution];
if iterations == 0 {
return set;
}
let mut segments = vec![(0, resolution)];
for _ in 0..iterations {
let mut new_segments = Vec::new();
for (start, end) in segments {
let len = end - start;
if len < 3 {
new_segments.push((start, end));
continue;
}
let third = len / 3;
new_segments.push((start, start + third));
for val in set[(start + third)..(start + third * 2)].iter_mut() {
*val = 0;
}
new_segments.push((start + third * 2, end));
}
segments = new_segments;
}
set
}
pub fn cantor_rhythm_16() -> Vec<usize> {
generate(2, 16)
.iter()
.enumerate()
.filter(|(_, &v)| v == 1)
.map(|(i, _)| i)
.collect()
}
pub fn cantor_rhythm_27() -> Vec<usize> {
generate(3, 27)
.iter()
.enumerate()
.filter(|(_, &v)| v == 1)
.map(|(i, _)| i)
.collect()
}
pub fn cantor_rhythm_9() -> Vec<usize> {
generate(1, 9)
.iter()
.enumerate()
.filter(|(_, &v)| v == 1)
.map(|(i, _)| i)
.collect()
}
pub fn cantor_rhythm_81() -> Vec<usize> {
generate(4, 81)
.iter()
.enumerate()
.filter(|(_, &v)| v == 1)
.map(|(i, _)| i)
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cantor_set_basic() {
let set0 = generate(0, 9);
assert_eq!(set0, vec![1, 1, 1, 1, 1, 1, 1, 1, 1]);
let set1 = generate(1, 9);
assert_eq!(set1, vec![1, 1, 1, 0, 0, 0, 1, 1, 1]);
}
#[test]
fn test_cantor_set_edge_cases() {
let empty = generate(3, 0);
assert_eq!(empty, Vec::<u32>::new());
let single = generate(2, 1);
assert_eq!(single, vec![1]);
}
#[test]
fn test_cantor_set_iteration_2() {
let set = generate(2, 27);
assert_eq!(set[0], 1); assert_eq!(set[1], 1);
assert_eq!(set[2], 1);
assert_eq!(set[3], 0); assert_eq!(set[4], 0);
assert_eq!(set[5], 0);
assert_eq!(set[6], 1); assert_eq!(set[7], 1);
assert_eq!(set[8], 1);
for i in 9..18 {
assert_eq!(set[i], 0, "Middle third should be removed at position {}", i);
}
assert_eq!(set[18], 1);
assert_eq!(set[19], 1);
assert_eq!(set[20], 1);
assert_eq!(set[21], 0);
assert_eq!(set[22], 0);
assert_eq!(set[23], 0);
assert_eq!(set[24], 1);
assert_eq!(set[25], 1);
assert_eq!(set[26], 1);
}
#[test]
fn test_cantor_set_properties() {
let set1 = generate(1, 27);
let set2 = generate(2, 27);
let set3 = generate(3, 27);
let count1: u32 = set1.iter().sum();
let count2: u32 = set2.iter().sum();
let count3: u32 = set3.iter().sum();
assert!(count2 <= count1);
assert!(count3 <= count2);
let expected_2 = (27.0 * (2.0_f32 / 3.0_f32).powi(2)) as u32;
assert!(
(count2 as i32 - expected_2 as i32).abs() <= 2,
"Expected ~{}, got {}",
expected_2,
count2
);
}
}