, ... , , .
, , - , . , , , ( "" ).
Dn N, Xn D1... Dn. N :
In the following code, this invariant is implemented by the delegate isValid:
delegate TResult FuncWithParams<TArg, TResult>(params TArg[] args);
void Main()
{
var oneToNine = Enumerable.Range(1, 9).ToArray();
FuncWithParams<int, int> makeNumber =
digits => digits.Aggregate(0, (acc, d) => acc * 10 + d);
FuncWithParams<int, bool> isValid =
digits => !digits.Take(digits.Length - 1).Contains(digits.Last())
&& makeNumber(digits) % digits.Length == 0;
var query =
from d1 in oneToNine
from d2 in oneToNine
where isValid(d1, d2)
from d3 in oneToNine
where isValid(d1, d2, d3)
from d4 in oneToNine
where isValid(d1, d2, d3, d4)
from d5 in oneToNine
where isValid(d1, d2, d3, d4, d5)
from d6 in oneToNine
where isValid(d1, d2, d3, d4, d5, d6)
from d7 in oneToNine
where isValid(d1, d2, d3, d4, d5, d6, d7)
from d8 in oneToNine
where isValid(d1, d2, d3, d4, d5, d6, d7, d8)
from d9 in oneToNine
where isValid(d1, d2, d3, d4, d5, d6, d7, d8, d9)
select makeNumber(d1, d2, d3, d4, d5, d6, d7, d8, d9);
query.Dump();
}
Still quite large, but much more readable than the original ...