Ver Mensaje Individual
  #11  
Antiguo 13-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
hola danielmj,

Una opción es representar la combinación con un entero de 32 bits si los elementos a combinar son menos de 32 o de 64 bits si son mas de 32 elementos y menos de 64 elementos, (para mas elementos tendrías que crear array de enteros), de tal forma que cada posición de un bit representa ese numero de elemento.

por ejemplo: si tienes una combinación de 3 elementos de una lista del 1 al 8
combinación 1: elementos 1, 5, 6
combinación 2: elementos 2, 5, 6

Código:
bit|7|6|5|4|3|2|1|0|	->	DEC
C1=|0|0|1|1|0|0|0|1|	->	49
C2=|0|0|1|1|0|0|1|0|	->	50
IMPORTANTE: como el indice de los bits se inicia en 0 y los elementos en 1 hay que ajustar el indice restando una unidad

Al ejecutar el siguiente código ya puedes saber si hay coincidencias o no
Código Delphi [-]
var
  c1, c2: Integer;
begin
  ...
  if (c1 = c2) then begin
   // las dos combinaciones son iguales
  end
  else if (c1 and c2) <> 0 then begin
   // coinciden algunos elementos y en particular los elementos que coinciden
   // son aquellos cuya posicion de bit esta puesta a 1
  end
  else begin
    // las dos combinaciones son totalmente distintas
  end;
  ...
end;

Para obtener el entero de la combinación a partir de una lista con los elementos selecionados puede hacer los siguiente
Código Delphi [-]
function ValorCombinacion(list:TStrings):Int64;
var
  elemento:Byte;
  i: Integer;
begin
  result := 0;
  with list do
    for i := 0 to Count - 1 do begin
      //se obtiene el valor numerico de la lista
      elemento := StrToInt(strings[i])-1;
      //se inserta en el resultado
      result := result or (Int64(1) shl elemento);
    end;
end;

Espero que esto te pueda ayudar
Un saludo

Última edición por bucanero fecha: 13-04-2018 a las 17:38:47.
Responder Con Cita