Ver Mensaje Individual
  #45  
Antiguo 09-05-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
Te dejo por aquí otro ejemplo en donde he creado una especie de clase llamada TCOMBINACION con las posibles funciones que necesitas y donde puedes ver su funcionamiento.

Es unidad totalmente independiente y sin enlaces a la parte visual de la aplicación

Código Delphi [-]
unit Combinaciones;

interface

type
  TCombinacion = Int64;
  TCombinacionHelper = record helper for TCombinacion
  private
    function GetNumero(ANum: byte): Boolean;
    function AsString(const value: TCombinacion): string; overload;
    function GetCount: Integer;
  public
    procedure AddNumero(const ANum: byte);                 // Inserta un numero en la combinacion
    procedure aleatorio;                                   // rellena con una combinacion aleatoria
    function AsString: string; overload;                   // devuelve la combinacion como un string
    procedure clear;                                       // vacia la combinacion
    function comparar(const combinacion: TCombinacion): Tcombinacion;
    function obtenerComunes(const combinacion: Tcombinacion): string;

    property Count:Integer read GetCount;                  // Indica cuantos numeros tiene esta combinacion
    // esta propiedad es para comparar si un determinado numero pertenece a la combinación
    property Numero[ANum:byte]:Boolean read GetNumero;
  published
    // añadir tantos metodos load como sea necesarios
    function load(list: array of Byte): boolean; overload; // carga una combinacion determinada
  end;


implementation

uses System.SysUtils;

const
  NumeroMax: Byte = 49;  // 1.. 49
  MaxCount: integer = 5;


{ TCombinacionHelper }
procedure TCombinacionHelper.AddNumero(const ANum: byte);
begin
  Self := self or (int64(1) shl ANum);
end;

procedure TCombinacionHelper.aleatorio;
var
  i: longint;
  value: Byte;
begin
  i := 0;
  clear;
  repeat
    //Genera un numero aleatorio entre 1 y 49
    value := Random(NumeroMax - 1) + 1;
    if not Numero[value] then begin
      //si el numero no esta en la combinacion entonces lo añade
      AddNumero(value);
      Inc(i);
    end;
    //y se repite hasta obtener el maximo de numeros necesarios para la combinacion
  until (i >= MaxCount);
end;

function TCombinacionHelper.AsString: string;
begin
  result := AsString(Self);
end;

procedure TCombinacionHelper.clear;
begin
  Self := 0;
end;

function TCombinacionHelper.comparar(
  const combinacion: TCombinacion): Tcombinacion;
begin
  Result := self and combinacion;
end;

function TCombinacionHelper.GetCount: Integer;
var
  aux: Int64;
begin
  Result := 0;
  aux := self;
  while (aux > 0) do begin
    if (aux and Int64(1)) = 1 then
      Inc(result);
    aux := aux shr 1;
  end;
end;

function TCombinacionHelper.GetNumero(ANum: byte): Boolean;
begin
  Result := ((self and (int64(1) shl ANum)) <> 0);
end;

function TCombinacionHelper.load(list: array of Byte): boolean;
var
  i: LongInt;
begin
  Result := False;
  clear;
  if length(list) = MaxCount then begin
    for i := 0 to High(list) do
      AddNumero(list[i]);
    Result := true;
  end;
end;

function TCombinacionHelper.obtenerComunes(
  const combinacion: Tcombinacion): string;
begin
  Result := Comparar(combinacion).AsString;
end;

function  TCombinacionHelper.AsString(const value: TCombinacion):string;
var
  i:integer;
begin
  result := '';
  for i := 1 to NumeroMax do
    if value.Numero[i] then
      result := result + IntToStr(i) + ' ';
end;

end.

y en la pantalla principal se puede usar de la siguiente manera (solo hay dos botones y un memo):

Código Delphi [-]
uses Combinaciones;

procedure TForm1.Button1Click(Sender: TObject);
var
  Combinacion: TCombinacion;
begin
  //genera una combinacion aleatoria
  Combinacion.aleatorio;
  //combierte la combinacion en un texto
  memo1.lines.add(Combinacion.AsString + #9 + '(' + IntToStr(Combinacion.count) + ')');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  cs1: string;
  Combinacion1, Combinacion2: TCombinacion;
  comunes: TCombinacion;
  i: LongInt;
begin
  //cargar una combinacion predeterminada
  if not Combinacion1.load([1, 5, 8, 13, 33]) then begin
    MessageDlg('La combinacion no es valida!!!', mtError, [mbOK], 0);
    exit;
  end;

  //guarda la combinacion1 en un string;
  cs1 := Combinacion1.AsString;
  //genera un bucle para analizar 100 combinaciones aleatorias
  for i := 1 to 100 do begin
    //generar una combinacion aleatoria
    Combinacion2.aleatorio;
    /// compara una combinacion con otra y obtine los comunes a ambas combinaciones
    comunes := Combinacion2.comparar(Combinacion1);
    /// si el valor es 0 entonces no hay numeros comunes
    if comunes <> 0 then
      memo1.Lines.Add(cs1 + #9 + Combinacion2.AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
  end;
end;
Responder Con Cita