PDA

Ver la Versión Completa : Permutaciones de un numero


CoCaInE
25-06-2006, 02:22:00
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í:


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


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.


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 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:

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:

Total de combinaciones 2
23
32


texto:233
Solución:

Total de combinaciones 3
233
323
332


texto:234
Solución:

Total de combinaciones 6
234
243
324
342
423
432


texto:2344
Solución:

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

texto: 2345
Solución:

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
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:


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
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


http://www.aulafacil.com/CursoEstadistica/Lecc-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


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
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.:)