public static void Main()
var riddle = new Riddle();
var solution = riddle.FindSolution();
Console.WriteLine(solution.ToString());
public Solution FindSolution()
var characterTypes = Enum.GetValues(typeof(CharacterType)).Cast<CharacterType>();
var cityTypes = Enum.GetValues(typeof(CityType)).Cast<CityType>();
var colorTypes = Enum.GetValues(typeof(ColorType)).Cast<ColorType>();
var drinkTypes = Enum.GetValues(typeof(DrinkType)).Cast<DrinkType>();
var heirloomTypes = Enum.GetValues(typeof(HeirloomType)).Cast<HeirloomType>();
from Character in characterTypes
((City == CityType.Dunwall) == (Character == CharacterType.Finch))
((Color == ColorType.White) == (Character == CharacterType.Winslow)) &&
((Color == ColorType.Green) == (City == CityType.Fraeport))
from Heirloom in heirloomTypes
((Heirloom == HeirloomType.Ring) == (Character == CharacterType.Contee)) &&
((Heirloom == HeirloomType.SnuffTin) == (City == CityType.Karnaca)) &&
(City != CityType.Fraeport || Heirloom != HeirloomType.Diamond) &&
(City != CityType.Baleton || Heirloom != HeirloomType.WarMedal)
((Drink == DrinkType.Absinthe) == (Color == ColorType.Blue)) &&
((Drink == DrinkType.Whiskey) == (Character == CharacterType.Natsiou)) &&
((Drink == DrinkType.Beer) == (City == CityType.Dabvoka))
select new Person{ Character = Character, City = City, Color = Color, Drink = Drink, Heirloom = Heirloom});
from seat1 in people.Where(p => p.Character == CharacterType.Marcolla)
.Select(p => new {Person = p, Seat=1 })
from seat2 in people.Where(p => p.Color == ColorType.Red)
.Where(p => !new[] { seat1 }.Any(s => s.Person.AnyMatch(p)))
.Where(p => (seat1.Person.Heirloom != HeirloomType.Diamond || p.City == CityType.Fraeport) && (seat1.Person.City != CityType.Fraeport || p.Heirloom== HeirloomType.Diamond))
.Where(p => (seat1.Person.City != CityType.Baleton || p.Drink == DrinkType.Rum) && (seat1.Person.Drink != DrinkType.Rum || p.City == CityType.Baleton))
.Where(p => (seat1.Person.City != CityType.Baleton || p.Heirloom == HeirloomType.WarMedal) && (seat1.Person.Heirloom != HeirloomType.WarMedal || p.City == CityType.Baleton))
.Select(p => new {Person = p, Seat=2 })
from seat3 in people.Where(p => p.Drink == DrinkType.Wine)
.Where(p => ! new[] {seat1,seat2}.Any(s => s.Person.AnyMatch(p)))
.Select(p => new {Person = p, Seat=3 })
from seat4 in people.Where(p => p.Color == ColorType.Blue || (p.Color == ColorType.Purple && seat3.Person.Color == ColorType.Blue) )
.Where(p => ! new[] {seat1,seat2,seat3}.Any(s => s.Person.AnyMatch(p)))
.Select(p => new {Person = p, Seat=4 })
from seat5 in people.Where(p => seat4.Person.Color != ColorType.Blue || p.Color == ColorType.Purple)
.Where(p => !new[] { seat1, seat2, seat3, seat4 }.Any(s => s.Person.AnyMatch(p)))
.Where(p => (seat4.Person.City != CityType.Baleton || p.Drink == DrinkType.Rum) && (seat4.Person.Drink != DrinkType.Rum || p.City == CityType.Baleton))
.Where(p => (seat4.Person.City != CityType.Baleton || p.Heirloom == HeirloomType.WarMedal) && (seat4.Person.Heirloom != HeirloomType.WarMedal || p.City == CityType.Baleton))
.Where(p => (seat4.Person.Heirloom != HeirloomType.Diamond || p.City == CityType.Fraeport) && (seat4.Person.City != CityType.Fraeport || p.Heirloom== HeirloomType.Diamond))
.Select(p => new {Person = p, Seat=5 })
People = new[] { seat1, seat2, seat3, seat4, seat5 }
Math.Abs(s.People.Single(p => p.Person.City == CityType.Fraeport).Seat - s.People.Single(p => p.Person.Heirloom == HeirloomType.Diamond).Seat) == 1
Math.Abs(s.People.Single(p => p.Person.City == CityType.Baleton).Seat - s.People.Single(p => p.Person.Drink == DrinkType.Rum).Seat) == 1
Math.Abs(s.People.Single(p => p.Person.City == CityType.Baleton).Seat - s.People.Single(p => p.Person.Heirloom == HeirloomType.WarMedal).Seat) == 1
var solutionPeople = scenarios.FirstOrDefault().People.OrderBy(p => p.Seat).Select(p => p.Person).ToArray();
return new Solution(solutionPeople);
public ColorType Color { get; set; }
public CityType City { get; set; }
public CharacterType Character { get; set; }
public DrinkType Drink { get; set; }
public HeirloomType Heirloom { get; set; }
public override string ToString()
return String.Format("Character: {0,-10} Color: {1,-10} City: {2,-10} Drink: {3,-10} Heirloom: {4,-10} ", Character, Color, City, Drink, Heirloom);
public bool AnyMatch(Person test)
this.Character == test.Character ||
this.City == test.City ||
this.Color == test.Color ||
this.Drink == test.Drink ||
this.Heirloom == test.Heirloom;
public Solution(Person[] people)
public override string ToString()
string result=String.Empty;
for (int seat = 1; seat <= 5; seat++)
var person = _people[seat - 1];
result += String.Format("Seat: {0} {1}", seat, person) + System.Environment.NewLine;
public enum CharacterType
Winslow, Marcolla, Contee, Natsiou, Finch
Red, Green, Blue, Purple, White
Fraeport, Dabvoka, Karnaca, Baleton, Dunwall
Wine, Rum, Absinthe, Beer, Whiskey
SnuffTin, WarMedal, BirdPendant, Ring, Diamond