Pascal/Turbo Pascal - Agrupar por numero

 
Vista:

Agrupar por numero

Publicado por palvji (5 intervenciones) el 26/07/2007 13:49:10
Buenas.
Mi problema es el siguiente:
Tengo un array que almacena cartas. Cada carta es un record con dos campos, numero y palo. Bueno, es esto:

tNumero=(As,Dos,Tres,Cuatro,Cinco,Seis,Siete,Sota,Caballo,Rey);

tPalo=(Oros,Copas,Espadas,Bastos);

tCarta=Record
Numero:tNumero;
Palo:tPalo;
END;

tBaraja=Array [1..10, 1..4] of tCarta;

Cada fila que contiene las 4 cartas de un jugador distinto. Lo que tengo que hacer es agrupar las cartas de cada jugador de acuerdo al numero de las cartas, es decir, si yo tengo por ejemplo en la primera fila:

4 de oros 1 de copas 2 de espadas 4 de bastos

Tengo que conseguir agrupar las cartas iguales, es decir, me tendria que quedar algo asi:

4 de oros 4 de bastos 1 de copas 2 de espadas (por ejemplo)

Mi problema es que no se por donde empezar, he intentado cosas con ifs, pero como tengo que comparar todas con todas es un lio.

Si alguien puede ayudar con alguna idea lo agradecere.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Agrupar por numero

Publicado por Diego Romero (996 intervenciones) el 26/07/2007 19:24:48
No entendí muy bien cuál es criterio de agrupación. ¿Podrías poner más ejemplos como el que mencionaste?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Agrupar por numero

Publicado por palvji (5 intervenciones) el 26/07/2007 22:19:16
SI, claro.

Al ser cartas, tengo que agrupar por numero, es decir, si yo tengo:

as de oros tres de copas cinco de espadas tres de bastos

tengo que conseguir juntar las cartas al principio (izquierda) del array de acuerdo al numero que tienen:

TRES de copas TRES de bastos as de oros cinco de espadas

Cada jugador tiene que reunir las cuatro cartas del mismo numero, por eso necesito agrupar, para que si tiene dos treses como ahi, se quite una de las otras dos.

Es decir, lo que necesito es mover las cartas en el array de modo que queden juntas las que son del mismo numero.

Espero haberme explicado mejor.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Agrupar por numero

Publicado por Diego Romero (996 intervenciones) el 27/07/2007 00:01:05
Ya. Creo que comprendo ya. Entonces me parece que lo mejor es realizar una ordenación usando el número de la carta. Al final el resultado es el mismo.

Voy a ensayar un algoritmo que puede ayudarte, lo escribo aquí sin probarlo así que si hay algo mal *es mi maldita culpa* :D.

type
tNumero=(As,Dos,Tres,Cuatro,Cinco,Seis,Siete,Sota,Caballo,Rey);

tPalo=(Oros,Copas,Espadas,Bastos);

tCarta=Record
Numero:tNumero;
Palo:tPalo;
END;

tBaraja=Array [1..10, 1..4] of tCarta;

procedure OrdenaFila(Fila: integer; var A: tBaraja);
var
r: tCarta;
i,j:integer;
begin
for i:=1 to 4 do
for j:=1 to 4 do
begin
if A[Fila,j].Numero > A[Fila,i].Numero then
begin
r:=A[Fila,j];
A[Fila,j]:=A[Fila,i];
A[Fila,i]:=r;
end; { if }
end; { for }
end;

En este procedimiento Fila indica qué fila se va a ordenar, A es la baraja completa. Me aprovecho que el campo Numero del registro tCarta es de tipo ordinal (todo tipo enumerado, tal como tNumero, son ordinales, es decir tienen un orden) para comparar entre sí.

Al final del procedimiento la fila Fila de A quedará ordenada de menor a mayor, si hay dos o más cartas de distinto palo pero igual número quedarán juntas (agrupadas) aunque no necesariamente al principio. Esto lo podemos resolver después ¿he entendido bien lo que quieres hacer?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Agrupar por numero

Publicado por palvji (5 intervenciones) el 27/07/2007 12:02:40
Eeeeem, si, y no.

Veamos, yo también pensé ordenar de menor a mayor o de mayor a menor. Lo que pasa es que no me sirve, puesto que necesito las cartas iguales al principio del array. En el caso de tener:

1 de copas 3 bastos 3 espadas 7 oros

Eso quedaría ordenado como tú me sugieres, pero no sabría qué carta descartar.

¿Porqué necesito las cartas al principio del array? Pues porque mas adelante, cada jugador debe descartarse de una carta, obviamente de cualquiera de la que solo tenga una (en el ejemplo anterior da igual el 1 de copas que el 7 de oros). Mi idea era dejar las que coincidan en número al principio de la fila para luego descartarse siempre de la última, asegurándose así de que las que coinciden en número quedan juntas al principio.

Lo que propones puede servir, pero sigo teniendo el problema de llevar al princìpio las cartas iguales

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Agrupar por numero

Publicado por Diego Romero (996 intervenciones) el 27/07/2007 14:53:27
Cuando pensé la solución que expuse sabía de ese "efecto no deseado".
Estoy un poco "busy" ahora, al rato respondo adecuadamente...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar