send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[RETO] Animaos!

  • 12 Respuestas
  • 6092 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« en: Mayo 26, 2013, 12:06:50 pm »
Pensando en animar un poco esta sección propongo un reto en el que podrán participar TODOS LOS QUE SEPAN C o C++.

Imaginen que tengo una matriz de 3x3 y necesito rellenarla de números enteros positivos comprendidos entre 0 y 3*3-1. Los números deben estar dispersos por la matriz, colocados de forma aleatoria. En la matriz no puede repetirse ningún número.

La matriz realmente será de 1000x1000. El que tenga el tiempo de ejecución más bajo GANA, simple no?

Los códigos por MP para no dar ideas. Aquí las preguntas.

Yo no participo, pero tengo mi código que mostraré cuando este reto acabe. También postearé los 3 códigos más rápidos ;).

FECHA LÍMITE: Viernes 31 de mayo de 2013.

Reglas
  • Cada código será ejecutado 3 veces y se hará la media entre los tiempos.
  • Los números deben estar colocados de modo aleatorio.
  • No puede repetirse un número en la matriz.
  • Los lenguajes aceptados son C y C++, no es válido combinarlos con ASM de ningún modo.
  • Los códigos deben ser multiplataforma. (IMPORTANTE)



EDITO:

Debéis usar dos #define por todo el código para que cambiando los valores de estos pueda crear matrices de 3x3 o 4x4 para poder corregir más rápido, por favor, hacedlo así.

También debéis poner un for que recorra y muestre la matriz, cuando tome los tiempos comentaré y compilaré esa parte, así que tranquilos.

Suerte a tod@s!

Sa1uDoS
« Última modificación: Octubre 28, 2013, 07:59:32 am por Expermicid »

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #1 en: Mayo 26, 2013, 12:50:44 pm »
1000x1000x4 = 4000000 bytes = 3'8 GB :-\ No tiene sentido tener una matriz así cargada en RAM/paginación. Estaría bien que hubiese que hacer algo con esa matriz y así poder optimizar para evitar generarla o similar...

¿A que te refieres con dispersos? ¿Qué clase de test aplicas sobre ellos para saber si cumplen tu 'dispersión'? ¿Acaso no sería válido ponerlos en orden? Ya que colocándolos de forma aleatoria eso podría ocurrir :P

(EDIT) Ah, me olvidaba: ¿Como medirás la velocidad? ¿Compilador? ¿Parámetros de compilación? ¿Lo decidimos nosotros?

Me encantan los retos :P Saludos ;D
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #2 en: Mayo 26, 2013, 03:41:15 pm »
3'8 MB si no fallan mis cuentas (básicamente tengo unos 256MB de RAM y me funciona el código ;) )

No ricemos el rizo, simplemente no pueden estar todos en orden, ese es el punto, debes usar la función rand().
De verdad quieres sacar la probabilidad que hay de que 1 millón de números salgan en orden? Diría que es matemáticamente imposible :P.

La velocidad la mediré con el comando time de UNIX. Quiero el código así que compilaré todos igual gcc code.c -o code.

Sa1uDoS

Desconectado STANHMAL

  • *
  • Underc0der
  • Mensajes: 5
  • Actividad:
    0%
  • Reputación 0
  • ςταηhmαl - hηαfε
    • Ver Perfil
    • Google
« Respuesta #3 en: Mayo 26, 2013, 03:50:59 pm »
Interesante, pero necesitaras ver la matriz no?

o no es necesario, porque al mostrarla gasta mucho tiempo.

$4!u2
Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red



You are not allowed to view links. Register or Login

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #4 en: Mayo 26, 2013, 03:57:53 pm »
Cierto, se me olvidó decirlo, poned un for que muestre la matriz para comprobar que cumple con los requisitos, cuando tome el tiempo esa parte del código la comento y compilo para que no se ejecute.

Y por favor haced un
#define MAX_X 1000
#define MAX_Y 1000
que se use por todo el código para que cambiando esos dos valores yo vea que todo está correcto. Así puedo hacer una matriz de 4x4 y ver que no se repitan valores por ejemplo ;).

Por ejemplo for(i=0;i<MAX_X;i++) en vez de poner for(i=0;i<1000;i++)

Ahora edito el post principal. Gracias STANHMAL.

Sa1uDoS

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #5 en: Mayo 26, 2013, 04:09:43 pm »
You are not allowed to view links. Register or Login
3'8 MB si no fallan mis cuentas (básicamente tengo unos 256MB de RAM y me funciona el código ;) )
Vaya vergüenza xD No sé ya ni dividir jajaja

¿Entonces estamos forzados a usar rand()? ¿No podemos implementar nuestro PRNG? :-[ Se podría hacer muchísimo más rápido utilizando el PRNG SIMD2 de Intel que genera 4 valores aleatorios por llamada pero para ello debes habilitar la compilación optimizada...
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #6 en: Mayo 26, 2013, 05:05:16 pm »
Al principio para que todos tengáis las mismas oportunidades todos serán compilados del mismo modo.
En próximos retos cada uno enviará como quiere compilar...

Suerte a tod@s!

Sa1uDoS

Desconectado s00rk

  • *
  • Underc0der
  • Mensajes: 68
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #7 en: Mayo 26, 2013, 05:19:44 pm »
Wooha interesante! haber si es posible hacerlo, nunca he trabajado con una matriz tan grande xD

Por ahora se me ocurre una idea para lo de no repetir tales numeros en tan inmensa matriz :P
ya que hacer una busqueda cada que vayas a meter alguno seria solo una perdida de tiempo(DEMASIADO y absurdo) xD

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #8 en: Mayo 26, 2013, 05:23:55 pm »
s00rk espero tu código. Quiero ver que se te ocurrió.

Sa1uDoS

Desconectado s00rk

  • *
  • Underc0der
  • Mensajes: 68
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #9 en: Mayo 26, 2013, 09:06:55 pm »
Una consulta podemos hacer uso de Threads? hago pruebas y despues de 500 o mas se me hace que tarda demasiado >___<!!


El tuyo cuando tiempo tarda ? ;$ xD

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #10 en: Mayo 27, 2013, 02:15:09 am »
Debe ser multiplataforma, y los threads, no lo son. No creo que el resultado variase mucho.

500 segundos? El mio tarda entre 0.700s y 0.900s en llenar la matriz(SIN MOSTRAR NADA). Pero mostrando con printf la matriz entera tarda sobre 16-17s.

Sa1uDoS

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #11 en: Mayo 29, 2013, 03:13:06 pm »
Señores! Anímense a participar! La fecha límite es el Viernes día 31 de Mayo :).

Espero sus códigos. Venga que no es difícil.

Sa1uDoS

Desconectado mr.blood

  • *
  • Underc0der
  • Mensajes: 73
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
« Respuesta #12 en: Junio 08, 2013, 06:50:14 am »
Solo participó s00rk, dejo su código para que juzguen!

No lo declaro ganador porque no funciona correctamente, además de ser bastante poco eficaz.

s00rk me gustaría que pudieras explicar como funciona tu código ;).

Posteo su código y, de paso, el mío.

s00rk:
Código: C
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. #define MAX_X 10
  7. #define MAX_Y MAX_X
  8.  
  9.  
  10. int main()
  11. {
  12.  
  13.  
  14.    int total = (MAX_X*MAX_Y), nuevonum, x , y, pag = 0, partir = 0, vpartir = total, jx = 0, jy = 0, valor;
  15.  
  16.  
  17.    int *numeros = (int*) You are not allowed to view links. Register or Login(total*sizeof(int));
  18.    int **matriz;
  19.    matriz = (int **) You are not allowed to view links. Register or Login(total*sizeof(int*));
  20.    
  21.    for(x = 2; x < total; x++)
  22.       if((total%x) == 0 && vpartir > (total/x))
  23.       {
  24.          partir = x;
  25.          vpartir = (total/x);
  26.       }
  27.  
  28.  
  29.    valor = total/partir;
  30.  
  31.  
  32.    You are not allowed to view links. Register or Login (You are not allowed to view links. Register or Login(NULL));
  33.    matriz[jx] = (int*) You are not allowed to view links. Register or Login(total*sizeof(int));
  34.    for(x = 0; x < partir; x++)
  35.    {      
  36.       for(y = 0; y < (total/partir); y++)
  37.       {
  38.          do{
  39.             nuevonum = You are not allowed to view links. Register or Login() % valor;
  40.             if(pag != 0)
  41.                nuevonum = You are not allowed to view links. Register or Login() % ((valor + (valor*pag)) - valor) + valor;
  42.          }while(numeros[nuevonum] == -1);
  43.          matriz[jx][jy++] = nuevonum;
  44.          numeros[nuevonum] = -1;
  45.          if(jy == MAX_Y)
  46.          {
  47.             jx++;
  48.             jy = 0;
  49.             matriz[jx] = (int*) You are not allowed to view links. Register or Login(total*sizeof(int));
  50.          }
  51.  
  52.  
  53.       }
  54.       pag++;
  55.    }
  56.  
  57.  
  58.    You are not allowed to view links. Register or Login(matriz);
  59.         int i,j;
  60.         for(i=0;i<MAX_X;i++)
  61.         {
  62.                 for(j=0;j<MAX_Y;j++)
  63.                 {
  64.                         You are not allowed to view links. Register or Login("%i\t", matriz[i][j]);
  65.                 }
  66.                 You are not allowed to view links. Register or Login('\n');
  67.         }
  68.  
  69.    return 0;
  70. }
  71.  

mr.blood:
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #define MAX_X 1000
  7. #define MAX_Y 1000
  8.  
  9. int main()
  10. {
  11.         You are not allowed to view links. Register or Login(You are not allowed to view links. Register or Login(NULL));
  12.         int matriz[MAX_X][MAX_Y], x, y;
  13.        
  14.         register int i, j, k;
  15.        
  16.         You are not allowed to view links. Register or Login(matriz, -1, sizeof(int)*(MAX_X*MAX_Y));
  17.  
  18.         for(i=0;i<(MAX_X*MAX_Y);)
  19.         {
  20.                 x=You are not allowed to view links. Register or Login()%MAX_X;
  21.                 y=You are not allowed to view links. Register or Login()%MAX_Y;
  22.                 for(k=-1;k<=1;k++)
  23.                 {
  24.                         for(j=-1;j<=1;j++)
  25.                         {
  26.                                 if(matriz[x+k][y+j]==-1 && (x+k>=0 && x+k<MAX_X) && (y+j>=0 && y+j<MAX_Y))
  27.                                 {
  28.                                         matriz[x+k][y+j]=i;
  29.                                         i++;
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34.  
  35.         //~ for(i=0;i<MAX_X;i++)
  36.         //~ {
  37.                 //~ putchar('\n');
  38.                 //~ for(j=0;j<MAX_Y;j++)
  39.                         //~ printf("%i\t", matriz[i][j]);
  40.         //~ }
  41.         return 0;
  42. }
  43.  

Sa1uDoS
« Última modificación: Junio 08, 2013, 06:54:45 am por mr.blood »

 

¿Te gustó el post? COMPARTILO!



[Reto en C] Programa que calcule la potencia de un numero

Iniciado por Crod1K

Respuestas: 2
Vistas: 5342
Último mensaje Abril 12, 2013, 12:46:51 am
por 85