Что надо передать в метод Foo, чтобы он вернул true?
using System.Linq;
public class C
{
public static bool Foo(params int[] arr)
{
return
arr != null &&
arr.Distinct().Count() == 3 &&
arr.All(x => x * x - 12 * x + 35 == 0);
}
}
(с методами из System.Linq.Enumerable подвоха нет, используется стандартная реализация)
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Вопрос — почему так (естественно, не про 5 и 7)?
S>А почему должно быть не так? В чем подвох-то?
Здравствуйте, Aen Sidhe, Вы писали:
AS>Здравствуйте, nikov, Вы писали:
N>>Что надо передать в метод Foo, чтобы он вернул true?
AS>Ну, любой набор по 3 числа из: 5, 7, -2147483643, -2147483641. Возможно ещё какие-нибудь, лень пока проверять.
AS>Вопрос — почему так (естественно, не про 5 и 7)?
Разобрался. Порядок вычислений будет примерно такой:
Здравствуйте, SE, Вы писали:
SE>Здравствуйте, nikov, Вы писали:
N>>Что надо передать в метод Foo, чтобы он вернул true?
SE>-2147483643 SE>-2147483641
SE>брутфорс
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, SE, Вы писали:
SE>>брутфорс
N>Гораздо быстрее их можно найти с помощью Pex, в т.ч. для типа long, для которого брутфорс помогает плохо.
А он для любых выражений находит или только для простых? Т.е. если там будет что-нибудь послежнее многочлена второй степени — найдёт?
Здравствуйте, nikov, Вы писали:
SE>>брутфорс
N>Гораздо быстрее их можно найти с помощью Pex, в т.ч. для типа long, для которого брутфорс помогает плохо.
Я попробовал с помошью Pex найти корни поотдельности, но у меня не получилось. Он упорно выдвал только 0 => 35
А можно привести пример этого паззла, корректный с точки зрения Pex?
Здравствуйте, SE, Вы писали:
SE>Здравствуйте, nikov, Вы писали:
SE>>>брутфорс
N>>Гораздо быстрее их можно найти с помощью Pex, в т.ч. для типа long, для которого брутфорс помогает плохо.
SE>Я попробовал с помошью Pex найти корни поотдельности, но у меня не получилось. Он упорно выдвал только 0 => 35 SE>А можно привести пример этого паззла, корректный с точки зрения Pex?
Странно, а сейчас все получилось. Задал Пексу такую задачку:
using System;
public class Program
{
public static void Puzzle(int x)
{
if(x * x - 12 * x + 35 == 0)
Console.Write("Ok!");
}
}
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, SE, Вы писали:
SE>>брутфорс
N>Гораздо быстрее их можно найти с помощью Pex, в т.ч. для типа long, для которого брутфорс помогает плохо.
брутфорс для long находит моментально, если искать от long.MinValue
Здравствуйте, Aen Sidhe, Вы писали:
N>>Гораздо быстрее их можно найти с помощью Pex, в т.ч. для типа long, для которого брутфорс помогает плохо.
AS>А он для любых выражений находит или только для простых? Т.е. если там будет что-нибудь послежнее многочлена второй степени — найдёт?
Не для всех, до для достаточно широкого класса, в т.ч. и многочленов более высоких степеней.
Кстати, интересно, что если использовать длинную арифметику (в которой можно записать любые числа), и ограничиться операциями сложения и умножения и проверки на равенство, то вопрос о том, выполнимо ли данное условие при каких-то значениях переменных, является алгоритмически неразрешимым (по теореме Матиясевича)
Здравствуйте, SE, Вы писали:
SE>2 -2147483643 Solved!
Кстати, Pex интересуется только тем, чтобы выполнить все возможные ветки в коде. Поэтому он и находит только один корень — после того, как он попал в эту ветку, дальнейшие попытки становятся ему не интересными. Но можно переписать код так, чтобы нашлись сразу 4 корня:
using System;
public class Program
{
public static void Puzzle(int a, int b, int c, int d)
{
if (a < b && b < c && c < d &&
a * a - 12 * a + 35 == 0 &&
b * b - 12 * b + 35 == 0 &&
c * c - 12 * c + 35 == 0 &&
d * d - 12 * d + 35 == 0)
throw new Exception("Solved");
}
}