Estoy buscando una manera elegante de calcular el puntaje de una conjetura en el juego MasterMind en C#, preferiblemente usando LINQ.Algoritmo de puntuación de MasterMind en C# usando LINQ
En MasterMind, el generador de códigos genera un código secreto de 4 dígitos usando los dígitos del 1 al 6. Un dígito puede usarse más de una vez. Como un ejemplo, el código secreto es:
int[] secret = { 1, 2, 3, 1 };
El descifrador intenta romper el código secreto presentando una conjetura. En este ejemplo, la suposición es:
int[] guess = { 1, 1, 2, 2 };
(tanto el código y adivina ahora se almacenan en una matriz, pero otros tipos de colección están bien también).
El creador de código entonces "puntúa" esta suposición al anunciar el número de "negros" y "blancos". Se concede un negro por cada dígito de la conjetura que es correcto tanto en valor como en posición. Se otorga un blanco por cada dígito correcto colocado en la posición incorrecta. En este ejemplo, el puntaje es 1 negro (para el "1" en la posición 1) y 2 blancos (para el "1" y "2" en las posiciones 2 y 3).
Volver a la pregunta: Estoy buscando una forma elegante de calcular el puntaje de una conjetura en C#, preferentemente utilizando LINQ. Hasta ahora, yo he llegado con una declaración que calcula el número de negros:
int blacks = new int[] { 0, 1, 2, 3 }.Count(i => (guess[i] == secret[i]));
que iba a proceder a lo largo de las líneas que el número de blancos es el número total de partidos (3) menos el número de negros Así que he intentado:
int whites = guess.Intersect(secret).Count() - blacks;
Pero, por desgracia, IEnumerable.Intersect() produce {1, 2} en lugar de {1, 1, 2}, porque se ve a sólo cifras distintas. Por lo tanto, calcula blancos = 1 en lugar de 2.
No se me ocurre otra forma de calcular "blancos", excepto el uso de bucles anidados estilo "C". ¿Puedes? Preferiblemente usando LINQ - Me gusta la forma en que un algoritmo puede expresarse en código usando LINQ. La velocidad de ejecución no es realmente un problema.
¿Qué es exactamente lo que está mal con "C style nested loops", parece una tarea de tarea. –
¿Cuál sería la puntuación de su valor secreto, si la conjetura fue "1111"? –
@Ramhound: mi solución de estilo C toma 15 líneas. Estoy dominando LINQ y estoy convencido de que LINQ puede hacer esto en menos líneas que sean más legibles al mismo tiempo. Por cierto cuando estaba en la escuela, C era un lenguaje moderno :-) –