public static void Main()
string masterKey = "03694";
from a in GetOwnerDigits(GetKeyDigit(masterKey, 1))
from b in GetOwnerDigits(GetKeyDigit(masterKey, 2))
from c in GetOwnerDigits(GetKeyDigit(masterKey, 3))
from d in GetOwnerDigits(GetKeyDigit(masterKey, 4))
from e in GetOwnerDigits(GetKeyDigit(masterKey, 5))
select $"{a}{b}{c}{d}{e}";
.Where(k => IsBetween(Math.Abs(GetKeyDigit(k, 1) - GetKeyDigit(k, 2)), 2, 6))
.Where(k => IsBetween(Math.Abs(GetKeyDigit(k, 2) - GetKeyDigit(k, 3)), 2, 6))
.Where(k => IsBetween(Math.Abs(GetKeyDigit(k, 3) - GetKeyDigit(k, 4)), 2, 6))
.Where(k => IsBetween(Math.Abs(GetKeyDigit(k, 4) - GetKeyDigit(k, 5)), 2, 6));
Console.WriteLine($"{ownerKeys.Count()} keys found:");
foreach(string key in ownerKeys)
private static int GetKeyDigit(string key, int position)
return int.Parse((key[position - 1]).ToString());
private static int[] GetOwnerDigits(int digit)
return Enumerable.Range(0, 10).Where(x => x % 2 == digit % 2 && x != digit).ToArray();
public static bool IsBetween(int value, int minimum, int maximum)
return value >= minimum && value <= maximum;