use selen::prelude::*;
fn main() {
println!("🦓 Einstein's Zebra Puzzle (Simplified)");
println!("========================================");
let mut model = Model::default();
let red_house = model.int(1, 5);
let green_house = model.int(1, 5);
let blue_house = model.int(1, 5);
let yellow_house = model.int(1, 5);
let white_house = model.int(1, 5);
let dog = model.int(1, 5);
let cat = model.int(1, 5);
let bird = model.int(1, 5);
let fish = model.int(1, 5);
let zebra = model.int(1, 5);
let tea = model.int(1, 5);
let coffee = model.int(1, 5);
let water = model.int(1, 5);
let beer = model.int(1, 5);
let milk = model.int(1, 5);
let kools = model.int(1, 5);
let chesterfield = model.int(1, 5);
let winston = model.int(1, 5);
let lucky = model.int(1, 5);
let parliament = model.int(1, 5);
let british = model.int(1, 5);
let swedish = model.int(1, 5);
let danish = model.int(1, 5);
let norwegian = model.int(1, 5);
let german = model.int(1, 5);
model.alldiff(&vec![red_house, green_house, blue_house, yellow_house, white_house]);
model.alldiff(&vec![dog, cat, bird, fish, zebra]);
model.alldiff(&vec![tea, coffee, water, beer, milk]);
model.alldiff(&vec![kools, chesterfield, winston, lucky, parliament]);
model.alldiff(&vec![british, swedish, danish, norwegian, german]);
model.new(british.eq(red_house));
model.new(swedish.eq(dog));
model.new(danish.eq(tea));
model.new(green_house.eq(coffee));
model.new(parliament.eq(bird));
model.new(yellow_house.eq(kools));
model.new(milk.eq(int(3)));
model.new(norwegian.eq(int(1)));
println!("🔍 Solving the puzzle...");
match model.solve() {
Ok(solution) => {
println!("✅ Solution found!");
if let Val::ValI(zebra_house) = solution[zebra] {
println!("\n🦓 The zebra is owned by the person in house {}!", zebra_house);
let nationalities = [
("British", solution[british]),
("Swedish", solution[swedish]),
("Danish", solution[danish]),
("Norwegian", solution[norwegian]),
("German", solution[german]),
];
for (name, val) in &nationalities {
if let Val::ValI(pos) = val {
if *pos == zebra_house {
println!("🏆 The {} person owns the zebra!", name);
}
}
}
}
},
Err(_) => {
println!("❌ No solution found with current constraints!");
}
}
}