elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)  (Leído 3,393 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
« Respuesta #10 en: 17 Junio 2018, 22:47 pm »

¿Conoces las listas enlazadas? El problema se basa en ellas. Eso lo habréis visto.
En verdad es una lista circular, dónde el último elemento enlaza con el primero.
Dadas dos listas circulares de la misma longitud, usa una como referencia y muévete por la otra hasta encontrar una coincidencia, a partir de allí muévete por las dos al mismo tiempo vigilando si los elementos son los mismos. Cuando des una vuelta entera a la de referencia y hayan sido todos los elementos iguales podrás decir que las dos listas son las mismas.


En línea

soni1345_ela

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
« Respuesta #11 en: 17 Junio 2018, 22:58 pm »

vale, muchas gracias por el consejo :)


En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
« Respuesta #12 en: 20 Junio 2018, 20:56 pm »

Hola Sonia.

No he tenido mucho tiempo, porque me voy a ver el partido del mundial de España-Irán   :xD :D.

Echa un vistazo a esto... (No he probado, mañana edito una respuesta más elaborada, e implemento el programa principal, aunque no lo pide)


Código
  1. #define MAX 10000
  2. #include <assert.h>
  3.  
  4. /* Static memory implementation */
  5.  
  6. typedef struct {
  7.  int V[MAX];
  8.  int N;
  9. } CycleSeq, *pCycleSeq;
  10.  
  11.  
  12. /* Comment: Compare cannonical forms */
  13. int SameCycle(CycleSeq *A, CycleSeq *B)
  14. {
  15.  
  16.  if (A->N != B->N) return 0;
  17.  
  18.  if (A->N == 0 ) return 1 ;
  19.  
  20.  // otherwise
  21.  assert((A->N == B->N) && A->N );
  22.  
  23.  int n ;
  24.  int mA, mB;
  25.  for (mA=mB=0, n = 1 ; n < A->N ; n++)
  26.    {
  27.      if (A->V[mA]>A->V[n]) mA = n ;
  28.      if (B->V[mB]>B->V[n]) mB = n ;
  29.    };
  30.  // mA mB holds minimum positions;
  31. // count coincidences in cannonical form.
  32.  int count;
  33.  for(count=0; (count < A->N) && (A->V[mA]==B->V[mB]); mA=(mA+1)% A->N,mB=(mB+1)%A->N  )
  34.    count++;
  35.  return count == A->N;
  36. }
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
« Respuesta #13 en: 21 Junio 2018, 12:34 pm »

Hola!
Ya lo tengo de nuevo, completo, con especificación algebraica, implementación, programa principal y todo! (no se pedía todo)



Como esto es un foro de C/C++ , empezamos por el final, la implementación...  Tened en cuenta que sólo se pedía el struct y la operación equals (Mismo Ciclo). Me ha salido más fácil que ayer!! :laugh: ;-)

Código
  1. /*
  2. CYCLE: Informally, a circular permutation, ie.
  3.  
  4.   [1,4,23,7]~[4,23,7,1]~[23,7,1,4]~[7,1,4,23]
  5. */
  6. #define MAX 10000
  7. #include <cassert>
  8. #include <cstdlib>
  9. #include <cstdio>
  10.  
  11. // Implementation on static memory.
  12. typedef struct {
  13.  int V[MAX];
  14.  int N;
  15. } CycleSeq, *pCycleSeq;
  16.  
  17. CycleSeq* cycle(const int V[],const int N)
  18. {
  19.  // Pre: assumed Def(canonical(V))
  20.  CycleSeq *A;
  21.  if (!(A = (pCycleSeq)malloc(sizeof(CycleSeq))))
  22.    {
  23.      perror("malloc");
  24.      exit(1);
  25.    };
  26.  A->N = N ;
  27.  for(int n=0; n<N ; n++) A->V[n]=V[n];
  28.  return A;
  29. }
  30.  
  31. int contains(const int i,const CycleSeq *A)
  32. {
  33.  // Pre: true O(n)
  34.  int n;
  35.  for (n=0 ; n<A->N && (A->V[n]!=i) ; n++);
  36.  return (n<A->N);
  37.  
  38. }
  39.  
  40. int next(const int i,const CycleSeq *A)
  41. {
  42.  // Pre: contains(A,i) O(n)
  43.  int n ;
  44.  for ( n=0 ; A->V[n]!=i ; n++);
  45.  return (A->V[(n+1)%A->N]);
  46.  
  47. }
  48.  
  49. /* Comment: Compare cannonical forms . (Was SameCycle)*/
  50. int equals(const CycleSeq *A, const CycleSeq *B)
  51. {
  52.  
  53.  if (A->N != B->N) return 0;
  54.  
  55.  if (A->N == 0 ) return 1 ;
  56.  
  57.  // e.o.c
  58.  assert((A->N == B->N) && A->N );
  59.  
  60.  int n ;
  61.  int mA, mB;
  62.  for (mA=mB=0, n = 1 ; n < A->N ; n++)
  63.    {
  64.      if (A->V[mA]>A->V[n]) mA = n ;
  65.      if (B->V[mB]>B->V[n]) mB = n ;
  66.    };
  67.  // mA mB holds minimum positions; count matches in cannonical form.
  68.  for(n=0; (n < A->N) && (A->V[(mA+n)%A->N]==B->V[(mB+n)%A->N]); n++);
  69.  return (n == A->N);
  70. }
  71.  
  72. #include <iostream>
  73. using namespace std;
  74. #define MAX 10000
  75.  
  76. int main(int argc, char *args[])
  77. {
  78.  CycleSeq *B,*A;
  79.  int V1[MAX],V2[MAX];
  80.  int N1,N2;
  81.  for( ; cin >> N1 && cin >>N2 ; )
  82.    {
  83.      for(int n=0; n<N1; n++) cin >> V1[n];
  84.      for(int n=0; n<N2; n++) cin >> V2[n];
  85.      A= cycle(V1,N1);
  86.      B= cycle(V2,N2);
  87.      cout << equals(A,B) << endl;
  88.      free(A);
  89.      free(B);
  90.    }
  91. }


Y algunos casos de prueba emepzando por los de la foto.

 Protocolo de entrada.
  • Linea que marca la longitud de las permutaciones ciclicas
  • Componentes de la primera permucacion
  • Componentes de la segunda permucacion
  • Acaba cuando no se dan pares de longitudes

Protocolo de salida: 1 marca TRUE ( permutaciones ciclicas equivalentes) 0 marca FALSE

Código:
5 5
6 23 4 71 9
71 9 6 23 4
1
5  5
71 9 6 23 4
6 23 4 71 9
1
5  5
6 23 4 71 9
6 23 71 4  9
0

Otros casos que no tienen que ver con esos.
Código:
1 1
3 3
1
1 1
3 4
0
2 2
1 2
2 1
1
2 3
1 2
1 2 3
0
4 4
1 4 23 7
4 23 7 1
1
4  4
4 23 7 1
23 7 1 4
1
4  4
23 7 1 4
7 1 4 23
1
4  4
7 1 4 23
1 4 23 7
1
4  4
1 4 23 7
23 7 1 4
1
4 4
23 7 1 4
23 1 7 4
0

y Ahora.... Para los que busquen algo "pure mathematical", sin C... aquí os dejo la especifiación ecuacional del tipo Ciclic... No se si tiene fallos...

Código:
CYCLE: Informally, a circular permutation, ie.

  [1,4,23,7]~[4,23,7,1]~[23,7,1,4]~[7,1,4,23]


  Algebraic Spec:
  ---------------

  TAD CYCLE is

  uses SEQ;

  carrier Cycle;

  ops
  ---

  cycle : Seq -> Cycle   [non free cons]

  partial next : Int Cycle -> Int   [ obs ]

  aux ops
  --------

  contains : Int Cycle -> Bool  [obs]

  partial canonical  : Seq -> Seq  // extends TAD SEQ, but safe

  var
  ---
  n:Int, c:Cycle , s: Seq

  axioms
  ------

  contains(n,c) -> Def(next(n,c))

  nonRepeated(s) -> Def(canonical(s))

  Def(canonical(s)) -> Def(cycle(s))

  contains(n,cycle(s)) = contains(n,s)

  // canonical form of a a seq.
 length(s) = length(cannonical(s))

  let
    M = length(s)
  in
    (M==0 ||
           let
              ms,ms' = min(s) , min(canonical(s))
           in  
           \forall i : 0<= i < M : s.at[(ms+i)%M]=cannonical(s).at[(ms'+i)%M])

  cycle(seq) = cycle(cannonical(seq))  

Y unos breves apuntes  sobre la implementación, expresando el invariante de representación y la función de abstracción.

A lo mejor estas cosas no parecen imporantes, pero sirven para guiarme en como hago las cosas luego en C.


Código:
 Impl:
  -----

    int V[MAX];
    int N;

  INV : N<=MAX && \forall : 0 <= i < N : frec(V[i],V)=1

  ABSTRACTION : (V1,N1) ~ (V2,N2)

     N1=N2 and
     (N1 = 0 ||
     let A = min i : 0 <= i < N1 : V1[i]
         B = min i : 0 <= i < N2 : V2[i]
     in
     \forall : 0 <= i < N1 : V1[(A+i) mod N1)] = V2[(B+i) mod N1)] )
        



« Última modificación: 21 Junio 2018, 14:16 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con un ejercicio gracias:)
Programación C/C++
poxluis 1 2,141 Último mensaje 21 Octubre 2010, 21:18 pm
por Littlehorse
hola ayuda for leberar nokia 6061 gracias
Dispositivos Móviles (PDA's, Smartphones, Tablets)
batal26 0 1,834 Último mensaje 15 Febrero 2011, 16:02 pm
por batal26
Hola los quería pedir consejo para antena USB wifi
Materiales y equipos
yanpi 3 3,134 Último mensaje 10 Junio 2014, 23:36 pm
por Omarflx
Ejercicio resuelto. Gracias por la ayuda.
Ejercicios
Droigor 3 5,513 Último mensaje 22 Marzo 2014, 19:29 pm
por Mitsu
Por favor ayuda con este ejercicio gracias
Programación C/C++
panda45 2 2,134 Último mensaje 11 Octubre 2014, 00:35 am
por b7
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines