Estoy creando un juego en el que los usuarios seleccionan de una lista de símbolos y luego identifican cuáles fueron esas selecciones.
Ejemplo:
Símbolos: [A, B, C, D, E, F, G]
El usuario selecciona [B, F, G] y esta matriz representativa [0, 1, 0, 0, 0, 1, 1] se guarda en la base de datos
Cuando un usuario replica correctamente una selección, me gustaría poder otorgar puntos de bonificación si la selección es única.
Por único quiero decir si la selección es lo suficientemente diferente de todas las selecciones anteriores. Lo que he considerado hasta ahora es comparar la matriz de selección de un usuario con todas las anteriores y verificar si la "varianza" es al menos un valor X
Ejemplo de selecciones anteriores:
Selección del usuario: [0, 1, 0, 0, 0, 1, 1]
compare la matriz de selección del usuario con cada anterior y encuentre cuántos índices difieren
1) [0, 1, 0, 0, 0, 1, 1] [1, 1, 0, 0, 0, 0, 0] ---- variance = 3 2) [0, 1, 0, 0, 0, 1, 1] [0, 1, 0, 0, 0, 0, 0] ---- variance = 2Para una variación mínima (X) de 3, este usuario no obtiene puntos de bonificación, pero para 2, sí.
¿Hay una mejor manera de pensar e implementar esto?
EDICIONES
Para aclarar. Voy a establecer la variación mínima en 3. Entonces, después de calcular la variación entre la regla de un usuario y todas las demás reglas existentes, si la variación mínima encontrada es mayor que 3, el usuario obtiene los puntos de bonificación; de lo contrario, no.
Tiene un conjunto de tamaño 7 --> [A, B, C, D, E, F, G] y solo puede tener 2^7 = 128 valores anteriores posibles para matrices representativas.
Tan pronto como tenga una consulta eficiente para seleccionar distintas matrices representativas de la base de datos, su algoritmo debería ejecutarse muy rápido, incluso si no es el mejor algoritmo de complejidad de tiempo. Puede que no valga la pena hacer que su algoritmo sea mucho más complejo, pero aquí hay una buena manera de encontrar la varianza después de hacer una new selection & previous selection : Cuente el número de 1 en representación binaria
En mi opinión, debe centrarse más en recuperar las representaciones de matrices distintas anteriores de la base de datos. Puede hacer esto creando un hash uniq de su representación y almacenándolo con la representación anterior. Para este problema, tiene una gran función para hacerlo, simplemente calcule el valor decimal de su representación como se muestra a continuación:
0 = [0, 0, 0, 0, 0, 0, 0] = 0 * 2^0 + 0 * 2^1 + 0 * 2^2 + 0 * 2^3 + 0 * 2^4 + 0 * 2^5 + 0 * 2^6 1 = [1, 0, 0, 0, 0, 0, 0] = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 0 * 2^3 + 0 * 2^4 + 0 * 2^5 + 0 * 2^6 . . . 127 = [1, 1, 1, 1, 1, 1, 1] = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 + 1 * 2^4 + 1 * 2^5 + 1 * 2^6Cuando seleccione valores distintos, le garantizará que no hará más de 128 comparaciones
Creo que está buscando el operador XOR ^ y luego puede contar el número de "unos" para encontrar la varianza. No necesita almacenar una matriz en la base de datos, puede ser solo una columna de tipo INT simple.
En tu ejemplo:
1) 0100011 -> 35 1100000 -> 96Entonces en javascript podrías hacer:
a = parseInt("0100011", 2); // it will give 35 (store only 35 as INT) b = parseInt("1100000", 2); // it will give 96 (store only 96 as INT) // later when you want to calculate variance varDec = a ^ b; // varDec = 67 varBin = varDec.toString(2) // varBin = "1000011" Luego, debe contar el número de "unos" en su variable varBin . Hay pocas respuestas sobre SO con respecto a esto (es decir, ¿cómo encontrar el número de 1 en una representación binaria de un número? )
variance = varBin.split('1').length-1; // variance = 3Puede que me esté perdiendo algo aquí, pero esto suena como un problema bastante simple. Necesitamos una función para calcular la cantidad de índices en los que los elementos de dos matrices no coinciden, llámela variance , y necesitamos una función que ejecute eso para una selección actual contra una lista de las anteriores y tome el valor mínimo, minVariance . Este fragmento tiene versiones bastante simples de ambos:
const variance = (xs) => (ys) => xs .reduce ((c, x, i) => x == ys [i] ? c : c + 1, 0) const minVariance = (curr) => (prevs) => Math .min (... prevs .map (variance (curr))) const prevs = [ [1, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], ] const curr = [0, 1, 0, 0, 0, 1, 1] console .log (minVariance (curr) (prevs)) Como han señalado otros, existen técnicas que pueden ayudarlo a ahorrar aún más en costos de almacenamiento, pero al final deberá comparar mapas de bits o números enteros, o convertirlos a las matrices que ya estaba planeando. Nuestra minVariance puede permanecer igual para aquellos, cambiando solo la variance simple.