Я ищу элегантный способ для вычисления оценки догадки в игре MasterMind на C #, предпочтительно с использованием LINQ.
В MasterMind создатель кода генерирует секретный код из 4 цифр, используя цифрыОт 1 до 6. Цифра может использоваться более одного раза.Например, секретный код:
int[] secret = { 1, 2, 3, 1 };
Взломщик кода пытается взломать секретный код, выдвинув предположение.В этом примере предположение:
int[] guess = { 1, 1, 2, 2 };
(и код, и предположение теперь хранятся в массиве, но с другими типами коллекций тоже все в порядке).
Затем создатель кода "забивает"это предположение, объявляя количество «черных» и «белых».За каждую цифру от догадки присваивается черный, который является правильным как по значению, так и по положениюБелый присуждается за каждую правильную цифру, помещенную в неправильную позицию.В этом примере оценка составляет 1 черный (для «1» в позиции 1) и 2 белых (для «1» и «2» в позициях 2 и 3).
Вернуться к вопросу:Я ищу элегантный способ вычислить оценку предположения в C #, предпочтительно с использованием LINQ.До сих пор я придумал утверждение, которое вычисляет количество черных:
int blacks = new int[] { 0, 1, 2, 3 }.Count(i => (guess[i] == secret[i]));
Я собирался продолжить в том же духе, что количество белых - это общее количество совпадений (3) минус.количество негров.Поэтому я попытался:
int whites = guess.Intersect(secret).Count() - blacks;
Но, увы, IEnumerable.Intersect () выдает {1, 2} вместо {1, 1, 2}, потому что он смотрит только на отдельные цифры.Таким образом, он вычисляет белые = 1 вместо 2.
Я не могу придумать другой способ вычисления "белых", кроме как использовать вложенные циклы в стиле "C".Ты можешь?Предпочтительно использование LINQ - мне нравится, как алгоритм может быть выражен в коде с использованием LINQ.Скорость выполнения на самом деле не проблема.