Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soni1345_ela en 17 Junio 2018, 21:09 pm



Título: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 21:09 pm
https://imageshack.com/a/img922/6439/jLPZgw.png

os dejo la dirección donde está el ejercicio, muchas gracias :)


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: simorg en 17 Junio 2018, 21:17 pm
Hola, con el titulo no basta.....expon en el post el problema y publica lo que lleves hecho, sino no te podran ayudar los compañeros.




Saludos.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 21:21 pm
yaa perdón es que no se cómo adjuntar una foto al mensaje con la que poder enseñar el ejercicio


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: simorg en 17 Junio 2018, 21:26 pm
Hola, para subir una foto al post primero debes subirla a un Hosting de imagenes, alli te proporcionan un link a dicha imagen, ese link lo pones aquí en el post entre los tag [image] [/image], hay un icono para ello y yá....

Pero también pudes publicar la parte de codigo que lleves hecho, directamente, con las etiquetas GeSHi correspondiente a tu lenguaje.



Saludos.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 21:27 pm
vale, muchas gracias :)


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: simorg en 17 Junio 2018, 21:30 pm
Este Hosting de imagenes es free, puedes usarlo si te apetece:

https://postimages.org/



Saludos.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 21:32 pm
https://imageshack.com/a/img922/6439/jLPZgw.png

Lo hice aquí, muchas gracias por tu ayuda, si sabes hacerel ejercicio me serias de mucha ayuda :)

(https://imageshack.com/a/img922/6439/jLPZgw.png)

[MOD] Para que saliera la imagen debias colocar los tag que te indiqué, yá lo he hecho yo.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: simorg en 17 Junio 2018, 21:36 pm
Hola, la normativa del Foro es que no se hacen los trabajos de los demás.....lo siento pero es así.

Para que te ayuden en el Foro debes aportar la parte que hayas hecho y las dudas puedes pedir alguien intente ayudarte....si no aportas lo hecho hasta ahora, no te podran ayudar el trabajo entero no te lo haran.



Saludos.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 21:48 pm
Hola, no es hacerme ningún trabajo. Estoy preparandome la asignatura para el examen final que lo tengo el viernes y simplemente no me sale el ejercicio, no es ninguna entrega ni nada por el estilo, pero bueno si te pones así pues no se, intentaré que me salga o algo...


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: simorg en 17 Junio 2018, 21:53 pm
Sorry... las Reglas  del Foro no las pongo yo. :)


https://foro.elhacker.net/reglas.htm




Saludos.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: MAFUS 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.


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: soni1345_ela en 17 Junio 2018, 22:58 pm
vale, muchas gracias por el consejo :)


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: dijsktra 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. }


Título: Re: Hola me llamo Sonia y queria pediros ayuda para resolver un ejercicio gracias :)
Publicado por: dijsktra 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)

(https://imageshack.com/a/img922/6439/jLPZgw.png)

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