use selen::prelude::*;
fn main() {
println!("🦓 Zebra Puzzle Solver (New API)");
println!("===============================\n");
println!("Who owns the zebra? Who drinks water?\n");
let mut m = Model::default();
let red = m.int(1, 5);
let green = m.int(1, 5);
let ivory = m.int(1, 5);
let yellow = m.int(1, 5);
let blue = m.int(1, 5);
m.alldiff(&[red, green, ivory, yellow, blue]);
let english = m.int(1, 5);
let spanish = m.int(1, 5);
let ukrainian = m.int(1, 5);
let norwegian = m.int(1, 5);
let japanese = m.int(1, 5);
m.alldiff(&[english, spanish, ukrainian, norwegian, japanese]);
let coffee = m.int(1, 5);
let tea = m.int(1, 5);
let milk = m.int(1, 5);
let orange_juice = m.int(1, 5);
let water = m.int(1, 5);
m.alldiff(&[coffee, tea, milk, orange_juice, water]);
let old_gold = m.int(1, 5);
let kools = m.int(1, 5);
let chesterfields = m.int(1, 5);
let lucky_strike = m.int(1, 5);
let parliaments = m.int(1, 5);
m.alldiff(&[old_gold, kools, chesterfields, lucky_strike, parliaments]);
let dog = m.int(1, 5);
let snails = m.int(1, 5);
let fox = m.int(1, 5);
let horse = m.int(1, 5);
let zebra = m.int(1, 5);
m.alldiff(&[dog, snails, fox, horse, zebra]);
m.new(english.eq(red));
m.new(spanish.eq(dog));
m.new(coffee.eq(green));
m.new(ukrainian.eq(tea));
let diff1 = m.sub(green, ivory);
m.new(diff1.eq(1));
m.new(old_gold.eq(snails));
m.new(kools.eq(yellow));
m.new(milk.eq(3));
m.new(norwegian.eq(1));
let diff2 = m.sub(chesterfields, fox);
let abs_diff1 = m.abs(diff2);
m.new(abs_diff1.eq(1));
let diff3 = m.sub(kools, horse);
let abs_diff2 = m.abs(diff3);
m.new(abs_diff2.eq(1));
m.new(lucky_strike.eq(orange_juice));
m.new(japanese.eq(parliaments));
let diff4 = m.sub(norwegian, blue);
let abs_diff3 = m.abs(diff4);
m.new(abs_diff3.eq(1));
println!("🔍 Solving...");
match m.solve() {
Ok(solution) => {
println!("✅ Solution found!\n");
let zebra_house = solution.get_int(zebra);
let water_house = solution.get_int(water);
let zebra_owner = if solution.get_int(english) == zebra_house {
"English"
} else if solution.get_int(spanish) == zebra_house {
"Spanish"
} else if solution.get_int(ukrainian) == zebra_house {
"Ukrainian"
} else if solution.get_int(norwegian) == zebra_house {
"Norwegian"
} else {
"Japanese"
};
let water_drinker = if solution.get_int(english) == water_house {
"English"
} else if solution.get_int(spanish) == water_house {
"Spanish"
} else if solution.get_int(ukrainian) == water_house {
"Ukrainian"
} else if solution.get_int(norwegian) == water_house {
"Norwegian"
} else {
"Japanese"
};
println!("🦓 The {} owns the zebra (house {})", zebra_owner, zebra_house);
println!("💧 The {} drinks water (house {})", water_drinker, water_house);
}
Err(_) => {
println!("❌ No solution found!");
}
}
}