Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Permutaciones de un numero (https://www.clubdelphi.com/foros/showthread.php?t=33032)

CoCaInE 25-06-2006 02:22:00

Permutaciones de un numero
 
Saludos a todos/as , Necesito hacer una busqueda de un numero en un campo pero ese numero puede variar mejor dicho

Yo tengo un numero el 123 yo quiero que delphi me busque en un campo ese numero y sus posibles conbinaciones ejemplo: 231,312 etc.. alguna funcion o idea:confused:

Lepe 25-06-2006 10:11:09

Siempre que hables de Bases de datos, dinos qué base de datos usas, porque suele haber una solución distinta para cada una de ellas.

Saludos

marcoszorrilla 25-06-2006 10:38:40

Quizás, generar en una matriz de dos dimensiones, las distintas combinaciones posibles del número dado y luego ir buscando las distintas combinaciones y guardar en la segunda posición, por ejemplo S, cuando se encuentre, la otra posición se habría inicializado a N.

Un Saludo.

CoCaInE 26-06-2006 02:36:33

la base de datos es en paradox. pero mejor seria que me den un ejemplo por codigo.....

o existe alguna funcion , perdone son novato:confused:

nemesio 26-06-2006 06:22:10

Realiza las combinaciones posibles que en tu caso serían seis. Supongamos que cada combinación la guardas en un arreglo de longitud 6, luego harías una consulta que se me ocurre puede ser así aunque no la he probado:
Query1.close;
Query1.ParamByname('Var1').Value:=Comb1;
Query1.ParamByname('Var2').Value:=Comb2;
.........
Query1.SQL.add('select campo1,campo2,.... from tabla where campo1=:Var1 or campo1=:Var2 or campo1=:var3 or campo1=:var4........')
Query1.execSQL;
Query1.Open;

Puedes validar que los numeros que generaste no se repitan para que optimices el código. Pero así como está debería funcionarte.

Lepe 26-06-2006 10:34:22

Otra forma es guardarlo en un string y usar algo así:

Código Delphi [-]
query1.sql.text := 'select * from tabla where campo in ('321', '123', '213')'

Saludos

CoCaInE 28-06-2006 23:11:58

Bueno ya un amigo me ha dado la solucion pero el caso esta en que este me repite los numeros ejemplo yo le entro el 553 y me genera las posibles combinaciones pero me repite los numeros varias veces.

553
535
553
535
355
355

El codigo es este

Código Delphi [-]
 
cadena:=Edit1.Text;
  Memo1.Lines.Add(cadena[1]+cadena[2]+cadena[3]);
  Memo1.Lines.Add(cadena[1]+cadena[3]+cadena[2]);
  Memo1.Lines.Add(cadena[2]+cadena[1]+cadena[3]);
  Memo1.Lines.Add(cadena[2]+cadena[3]+cadena[1]);
  Memo1.Lines.Add(cadena[3]+cadena[1]+cadena[2]);
  Memo1.Lines.Add(cadena[3]+cadena[2]+cadena[1]);

Alguna sugerencia :confused: :confused:

Lepe 29-06-2006 10:08:40

La propiedad Lines del Memo es un TStrings, compatible con un TStringList, este último tiene la propiedad Duplicates que se puede establecer en dupIgnore, de esta forma al repetir una cadena... obviamente la ignora y no la añade.

Código Delphi [-]
var X :TStringList;
begin
X := Tstringlist.create;
x.sorted := true; // debe estar ordenado para ignorar duplicados
x.Duplilcates := dupIgnore;
X.Add('uno');
X.Add('uno'); // este no se añade por estar duplicado
Memo1.Lines.Assign(X); // sustituimos lo que hay en el memo por X (sin duplicados)
Memo1.Lines.Add(X); // tambien podemos añadir los textos al memo, sin borrar lo que haya
X.Free;// destruimos la lista.

Saludos

CoCaInE 06-07-2006 01:30:39

Disculpenme
 
Disculpenme por la tardanza para contestar pero es el trabajo que me ocupa de mucho al igual que ustedes.

Realmente lo que necesito es que si tengo un numero por ejemplo de cuatro cifra 2343 que me genere las posibles combinaciones para ese numero sin repetirlo y que me diga cuantas combinaciones se generaron para guardar en una variable X..

Lepe 06-07-2006 15:14:31

Falta quitar los duplicados, pero lo más gordo está hecho. No lo he testeado a fondo, pero creo que funciona. Está hecho a lo bruto, por simples intercambios de caracteres:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var pivot, str:string;
    i, saltos,idx: Integer;
begin

  saltos := 1;
  mmo1.lines.Add(edt1.Text);
  for i := 1 to Length(edt1.Text) do
  begin
    str := edt1.Text+#0;
    saltos := 1;
    pivot := str[i];
    mmo1.lines.Add('------- Nuevo Pivot: '+pivot+' ---');
    Delete(str,i,1);
    str := pivot + str; // pasamos el pivot al primer caracter de la cadena
    idx := 2;
    while saltos < length(str)-1 do
    begin
      Application.ProcessMessages;
      if idx = length(str)-1 then
      begin
        inc(saltos);
        idx := 2;
        mmo1.lines.Add('------salto-----------');
      end
      else
      begin
        str := Copy(str,1,idx-1) + str[idx+1] + str[idx]+ Copy(str,idx+2,255);
        inc(idx);
        mmo1.lines.Add(str);
      end;
    end;

  end;
end;

end.

Saludos

Lepe 06-07-2006 15:29:04

acabo de ver que tiene un fallo... pero eso te lo dejo a tí ;)

Saludos

Lepe 06-07-2006 15:53:36

El caso es complicado, por eso he puesto parte de la solución, ahora te toca trabajarlo a tí y buscar linea por linea los errores.

La filosofía es la siguiente: de la cadena principal elijo el primer caracter como Pivote, lo paso al principio de la cadena y ahora voy intercambiando el segundo caracter con el tercer, despues el tercero con el cuarto, etc. Pero siempre quedan combinaciones que no las pillas, por eso está lo de los "saltos".

Para ayudarte, quitando los fallos me da lo siguiente:

texto:23
Solución:
Código:

Total de combinaciones 2
23
32

texto:233
Solución:
Código:

Total de combinaciones 3
233
323
332

texto:234
Solución:
Código:

Total de combinaciones 6
234
243
324
342
423
432

texto:2344
Solución:
Código:

Total de combinaciones 12
2344
2434
2443
3244
3424
3442
4234
4243
4324
4342
4423
4432

texto: 2345
Solución:
Código:

Total de combinaciones 24
2345
2354
2435
2453
2534
2543
3245
3254
3425
3452
3524
3542
4235
4253
4325
4352
4523
4532
5234
5243
5324
5342
5423
5432

Esta última no la he comprobado... pero juraría que va bien :D

Saludos

vtdeleon 07-07-2006 00:10:42

OffTopic

Con el permiso otorgado por CoCaine, he cambiado el titulo del hilo para que el titulo coincida con el contenido de éste, y para futura busqueda.


Saludos

CoCaInE 08-07-2006 03:11:00

Saludos a todos
 
Cuando resolvamos este dilema le voy a invitar una jarra de cervezas a todos mis colegas y amigos :D un saludo a mi hermano Marverick.

Realmente lo que quiero es guardar en una tabla las convinaciones del numero eh checkado la solucion y no encuentro como convertir la varible a string debido a que la varible es un tstringlist, que viene siendo parecido a una arreglo.


Con convertir eso y algunos arregrillos creo que resuelvo

dec 08-07-2006 03:19:26

Hola,

A ver si en esto último que dices puedo echarte una mano. La variable "TStrings" obviamente no puede convertirse a "Integer", pero, es que una variable de tipo "TStrings" se compone de uno o varios elementos que son a su vez de tipo "String". Es decir, son dichos elementos los que podrías convertir a "Integer", si es necesario.

¿Un ejemplo? A ver si puede servirte de algo:

Código Delphi [-]
var
  i,j: integer;
  ejemplo: TStrings;
begin
  ejemplo := TStringList.Create;

  // Un suponer...
  ejemplo.Add('1234');
  ejemplo.Add('4321');
  ejemplo.Add('4211');

  for i := 0 to ejemplo.Count-1 do
  begin
    {
      Accederemos aquí a cada uno de los elementos
      de "ejemplo", que podríamos convertir desde
      "Integer" a "String" con "StrToInt"...
    }
    
    // "j" es de tipo "Integer"
    j := StrToInt( ejemplo[i] );
    
  end;

  ejemplo.Free;
end;

CoCaInE 08-07-2006 10:39:28

Gracias
 
Con la ayuda de todos y de dec eh logrado hacer las combinaciones , gracias a todos.

madriles 08-07-2006 15:23:07

hola
solo una pequeña aclaracion al tema. ya que se ha cambiado el nombre para futuras busquedas, deberia volver a cambiarse, me explico, a la vista de las respuestas estamos hablando de permutaciones no de combinaciones para ver esto cito un texto

Cita:

http://www.aulafacil.com/CursoEstadi...ecc-20-est.htm

Combinaciones:
Determina el número de subgrupos de 1, 2, 3, etc. elementos que se pueden formar con los "n" elementos de una muestra. Cada subgrupo se diferencia del resto en los elementos que lo componen, sin que influya el orden.
Por ejemplo, calcular las posibles combinaciones de 2 elementos que se pueden formar con los números 1, 2 y 3.
Se pueden establecer 3 parejas diferentes: (1,2), (1,3) y (2,3). En el cálculo de combinaciones las parejas (1,2) y (2,1) se consideran idénticas, por lo que sólo se cuentan una vez.

Para calcular el número de combinaciones se aplica la siguiente fórmula:

Cm,n = m! / n! * (m-n)!


El termino " n ! " se denomina "factorial de n" y es la multiplicación de todos los números que van desde "n" hasta 1.
Por ejemplo: 4 ! = 4 * 3 * 2 * 1 = 24
La expresión "Cm,n" representa las combinaciones de "m" elementos, formando subgrupos de "n" elementos.
y esto serian las permutaciones

Cita:

Permutaciones:
Cálcula las posibles agrupaciones que se pueden establecer con todos los elementos de un grupo, por lo tanto, lo que diferencia a cada subgrupo del resto es el orden de los elementos.
Por ejemplo, calcular las posibles formas en que se pueden ordenar los número 1, 2 y 3.
Hay 6 posibles agrupaciones: (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2) y (3, 2, 1)

Permutaciones:
Para calcular el número de permutaciones se aplica la siguiente fórmula:
Pm = m!
La expresión "Pm" representa las permutaciones de "m" elementos, tomando todos los elementos. Los subgrupos se diferenciaran únicamente por el orden de los elementos.
Aclarado esto, a ver si alguien propone un algotirmo de permutaciones para cualquier cifra dada
un saludo

eduardosanz 03-07-2007 23:25:46

Help me
 
Hey amigo gracias por ese codigo para realizar combinaciones con letras y numeros pero necesito por favor que me lo envies con las correcciones ya que, soy nuevo programando en Delphi y no entiendo mucho, aunque te prometo que me esforzare por aprender, pero please enviame el programita sin errores y si puedes explicarmelo en palabras mucho mejor.

Gracias

EduardoSanz.
Rep. Dom.:)


La franja horaria es GMT +2. Ahora son las 17:57:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi