Я увидел this article всплывающее окно в моем RSS-канале MSDN, и после прочтения его, and the sourced article here Я начал задаваться вопросом о решении.Решение проблем с LINQ/.NET4
Правила просты:
Найти номер, состоящий из 9 цифр, в которых каждая из цифр от 1 до 9, появляется только один раз. Это число должно удовлетворять этим требованиям делимости:
- число должно быть кратно 9.
- Если правая цифра удаляется, оставшееся число должно быть кратно 8.
- Если крайняя правая цифра новый номер удаляется, оставшееся число должно делиться на 7.
- И так далее, пока не будет только одна цифра (которая обязательно будет делиться на 1).
Это его предложил монстр LINQ запрос:
// C# and LINQ solution to the numeric problem presented in:
// http://software.intel.com/en-us/blogs/2009/12/07/intel-parallel-studio-great-for-serial-code-too-episode-1/
int[] oneToNine = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// the query
var query =
from i1 in oneToNine
from i2 in oneToNine
where i2 != i1
&& (i1 * 10 + i2) % 2 == 0
from i3 in oneToNine
where i3 != i2 && i3 != i1
&& (i1 * 100 + i2 * 10 + i3) % 3 == 0
from i4 in oneToNine
where i4 != i3 && i4 != i2 && i4 != i1
&& (i1 * 1000 + i2 * 100 + i3 * 10 + i4) % 4 == 0
from i5 in oneToNine
where i5 != i4 && i5 != i3 && i5 != i2 && i5 != i1
&& (i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5) % 5 == 0
from i6 in oneToNine
where i6 != i5 && i6 != i4 && i6 != i3 && i6 != i2 && i6 != i1
&& (i1 * 100000 + i2 * 10000 + i3 * 1000 + i4 * 100 + i5 * 10 + i6) % 6 == 0
from i7 in oneToNine
where i7 != i6 && i7 != i5 && i7 != i4 && i7 != i3 && i7 != i2 && i7 != i1
&& (i1 * 1000000 + i2 * 100000 + i3 * 10000 + i4 * 1000 + i5 * 100 + i6 * 10 + i7) % 7 == 0
from i8 in oneToNine
where i8 != i7 && i8 != i6 && i8 != i5 && i8 != i4 && i8 != i3 && i8 != i2 && i8 != i1
&& (i1 * 10000000 + i2 * 1000000 + i3 * 100000 + i4 * 10000 +
i5 * 1000 + i6 * 100 + i7 * 10 + i8) % 8 == 0
from i9 in oneToNine
where i9 != i8 && i9 != i7 && i9 != i6 && i9 != i5 && i9 != i4 && i9 != i3 && i9 != i2 && i9 != i1
let number = i1 * 100000000 +
i2 * 10000000 +
i3 * 1000000 +
i4 * 100000 +
i5 * 10000 +
i6 * 1000 +
i7 * 100 +
i8 * 10 +
i9 * 1
where number % 9 == 0
select number;
// run it!
foreach (int n in query)
Console.WriteLine(n);
Октавио гласит: «Обратите внимание, что ни одна попытка вообще не было сделано, чтобы оптимизировать код», что я хотел бы знать, что если мы DID пытается оптимизировать этот код. Это действительно лучший способ получить этот код? Я хотел бы знать, как мы можем сделать это лучше всего с .NET4, в частности, делая так же параллельно, насколько это возможно. Я не обязательно ищу ответ в чистом LINQ, предполагаю, что .NET4 в любой форме (управляемый C++, C# и т. Д. Все приемлемо).
Это .... это монстр. – Tejs
Это заставляет мои глаза болеть. LINQ - это не решение чего-либо и всего ...! – Noldorin
@Noldorin, не для всего, но это хорошо подходит для этой проблемы ... Учтите написать решение, отличное от LINQ? Бьюсь об заклад, это будет не намного яснее;) –