Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Combinaciones Numero De 4 Cifras (https://www.clubdelphi.com/foros/showthread.php?t=79698)

rbarzallo 01-08-2012 16:40:25

Combinaciones Numero De 4 Cifras
 
Buen dia Foro,

alguien me puede ayudar e indicar como puedo realizar en Delphi las combinaciones posibles de un numero de 4 cifras? es decir, a partir de un numero de 4 cifras previamente conocido.

Por ejemplo el 0027 o el 8012 y que no se repitan?

Agradeciendo de antemano su ayuda.

roman 01-08-2012 17:25:29

¿Te refieres a las combinaciones de sus dígitos?

Toma cada uno de los dígitos y pégales las combinaciones de los tres restantes. Ahora tienes el mismo problema pero con menos dígitos, es decir, basta que resuelvas el problema para números de tres dígitos.

Para resolver este segundo problema, toma cada uno de los tres dígitos y pégales las combinaciones de los dos restantes. Ahora tienes el mismo problema pero con menos dígitos, es decir, basta que resuelvas el problema para números de dos dígitos.

Este tercer problema es trivial pues sólo hay dos combinaciones posibles para números de dos cifras, AB y BA.

Lo que estoy describiéndote es un proceso recursivo con el que puedes resolver el problema.

// Saludos

ecfisa 01-08-2012 17:28:00

Hola rbarzallo.

Una forma de realizarlo: Declara cinco variables, una para almacenar los 4 dígitos y 4 mas para que recorran los cuatro números.

El algorímo se reduce a:
Código:

variables
n       
a,b,c,d

comenzar

leer n.  // leer los 4 dígitos

para a <- 1 hasta 4
  ...
    ...
      ...
        si no((n[a]=n[b]) v (n[a]=n[c]) v (n[a]=n[d]) v
              (n[b]=n[c]) v (n[b]=n[d]) v (n[c]=n[d])) entonces
          escribir (n[a],n[b],n[c],n[d]).
  ...

Saludos.

Edito: No lo puse en Pascal para que realices algo de la tarea... :)

Casimiro Notevi 01-08-2012 18:19:56

Cita:

Empezado por ecfisa (Mensaje 438603)
Edito: No lo puse en Pascal para que realices algo de la tarea... :)

Entre lo que ha explicado Román y el metacódigo que ha puesto ecfisa... ya casi tengo yo también mi programita de combinaciones.
Así sí que se aprende :)

roman 01-08-2012 18:40:30

Yo, la verdad, no entendí el metacódigo :o (pero ya hice la tarea :))

// Saludos

ecfisa 01-08-2012 19:50:58

Cita:

Empezado por roman (Mensaje 438620)
Yo, la verdad, no entendí el metacódigo :o

Seguramente por que el pseudocódigo que iría en lugar de los '...' no queda tán claro de deducir como yo pensaba...:o

Sería:
Código:

variables
n       
a,b,c,d

comenzar

leer n

para a <- 1 hasta 4
  para b <- 1 hasta
    para c <- 1 hasta 4
      para d <- 1 hasta 4
        si no((n[a]=n[b]) v (n[a]=n[c]) v (n[a]=n[d]) v (*)
              (n[b]=n[c]) v (n[b]=n[d]) v (n[c]=n[d])) entonces
          escribir (n[a],n[b],n[c],n[d]).
fin

(*) v = disyunción inclusiva

Saludos. :)

Casimiro Notevi 01-08-2012 20:34:43

jejeje... puse metadato, lo corregí a medias y se quedó en metacódigo :)

Casimiro Notevi 01-08-2012 20:37:10

Cita:

Empezado por ecfisa (Mensaje 438629)
Seguramente por que el pseudocódigo que iría en lugar de los '...' no queda tán claro de deducir como yo pensaba...

A ver si lo que está preguntando es otra cosa, porque todavía no ha dicho nada.

roman 01-08-2012 20:44:48

Quizá dejó el ejercicio y se fue a la escuela.

// Saludos

ecfisa 01-08-2012 20:45:58

Cita:

Empezado por Casimiro Notevi (Mensaje 438635)
A ver si lo que está preguntando es otra cosa, porque todavía no ha dicho nada.

Puede ser, pero me parece que es eso... realmente estuve amarrete con el primer código :o

Saludos. :)

roman 01-08-2012 20:55:20

Bueno, mi solución tiene un error que ahora veo. La puse pensando en que las cifras del número no se repetían, pero si eso pasa debo descartar las repeticiones.

// Saludos

rbarzallo 02-08-2012 00:09:38

Combinaciones 4 Cifras
 
ok, gracias por su ayuda.

Exactamente lo que necesito realizar es obtener las combinaciones de 4 digitos conocidos, pero de forma aleatoria.

Es decir, si tengo el numero 1963, obtener 6 combinaciones de dicho numero es decir, 1963, 1936, 1396, 1369, 1693, 1639

Gracias

Casimiro Notevi 02-08-2012 00:18:33

No entiendo lo de "forma aleatoria" :confused:
Además tampoco entiendo lo de 6 combinaciones, ¿el 1 no cuenta?

ecfisa 02-08-2012 01:29:31

Cita:

Empezado por rbarzallo (Mensaje 438654)
ok, gracias por su ayuda.

Exactamente lo que necesito realizar es obtener las combinaciones de 4 digitos conocidos, pero de forma aleatoria.

Es decir, si tengo el numero 1963, obtener 6 combinaciones de dicho numero es decir, 1963, 1936, 1396, 1369, 1693, 1639

Gracias

Hola rbarzallo.

Se puede hablar de combinatoria cuando los grupos obtenidos se consideran diferentes si y solo sí, tienen un elemento diferente, por lo que en este caso estaríamos hablando de permutación. Es decir, se considera que un grupo es diferente a otro cuando difiere en el órden en que están dispuestos los elementos.

El número 1963 consta de cuatro dígitos y como es tomado de 4 en 4, sin ahondar en detalles, podemos decir que el número total de grupos a formar es 4! = 4.3.2.1 = 24

Los grupos obtenidos son:
Código:

1369  3169  6139  9136
1396  3196  6193  9163
1639  3619  6319  9316
1693  3691  6391  9361
1936  3916  6913  9613
1963  3961  6931  9631

Y aunque tal vez haya una mejor forma, es lo que realiza el pseudocódigo del mensaje #6 de este hilo.

Saludos. :)

rbarzallo 02-08-2012 01:44:16

Correcto eficsa, eso es exactamente lo que estoy necesitando desarrollar en Delphi.

Saludos

AzidRain 02-08-2012 01:47:21

Estaba pensando en las combinaciones y permutaciones, el famoso factorial (!) y mis clases de Mate IV en la Uni. La solución de eficsa es la correcta y además la más sencilla. Me acorde de una materia que se llamaba "Análisis Numérico" y que precisamente se trataba de resolver problemas matemáticos como este (hasta "Furias" de Fourier y "Transtornadas" de La Place) pero con la ayuda del lenguaje computacional de tu gusto. Era fenomenal esa clase.

roman 02-08-2012 17:31:11

Cita:

Empezado por ecfisa (Mensaje 438660)
El número 1963 consta de cuatro dígitos y como es tomado de 4 en 4, sin ahondar en detalles, podemos decir que el número total de grupos a formar es 4! = 4.3.2.1 = 24

Claro, pero el problema es cuando el número tiene cifras repetidas, como en el ejemplo que dio al principio: 0027, porque entonces hay aparecen combinaciones repetidas.

// Saludos

ecfisa 02-08-2012 23:24:57

Cita:

Empezado por roman (Mensaje 438704)
Claro, pero el problema es cuando el número tiene cifras repetidas, como en el ejemplo que dio al principio: 0027, porque entonces hay aparecen combinaciones repetidas.

// Saludos

Hola roman.

Estuve pensando en lo que comentas y no sé si estare hacertado conceptualmente, pero pienso que aún usando permutación con repetición, se debería consider la posición que ocupa el elemento en los grupos y no su valor. Si bién 0 y 0 tienen el mismo valor, no se refieren al mismo elemento.

Claro que tomando en cuenta lo anterior y con el condicional:
Código Delphi [-]
  if not((a=b)or(a=c)or(a=d)or(b=c)or(b=d)or(c=d)) then // tampoco serviría evaluar el valor (n[a]=n[b])...
    writeln(n[a],n[b],n[c],n[d]);
las repeticiones son inevitables.

Pero como te dije mas arriba, no estoy totalmente seguro cuál es el concepto que debiera considerarse, si el valor o el elemento... :confused:

Saludos.

roman 02-08-2012 23:33:00

Entiendo lo que dices, pero eso ya tendrá que contestarlo el profesor.

// Saludos


La franja horaria es GMT +2. Ahora son las 16:28:07.

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