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)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Programa que imprime su código en: 28 Agosto 2011, 21:48
Uno de los ejercicios propuestos por un profesor de programación, fue el de hacer un programa que imprima su código. (Obviamente sin leer ningún archivo)
Aquí una posible solución, se puede hacer mucho más corto, quitando las tabulaciones y los saltos de línea, pero así queda más visual de corroborar.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6. int i,n;
  7. char palabra[] = "#include <stdio.h>\n#include <string.h>\n\nint main(int argc, char **argv)\n{\n\tint i, n;\n\tchar palabra[] = \tn=strlen (palabra);\n\tpalabra[102]='\\0';\n\tprintf (\"%s \",palabra);\n\tpalabra[102]=' ';\n\tprintf (\"\\\"\");\n\tfor (i=0;i<n;i++)\n\t\tswitch (palabra[i])\n\t\t\t{\n\t\t\t\tcase '\\n':\n\t\t\t\tprintf (\"\\\\n\");\n\t\t\t\tbreak;\n\t\t\t\tcase '\\t':\n\t\t\t\tprintf (\"\\\\t\");\n\t\t\t\tbreak;\n\t\t\t\tcase '\\\\':\n\t\t\t\tprintf (\"\\\\\\\\\");\n\t\t\t\tbreak;\n\t\t\t\tcase '\\\"':\n\t\t\t\tprintf (\"\\\\\\\"\");\n\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tprintf (\"%c\",palabar[i]);\n\t\t\t}\n\tprintf (\"\\\";\\n\");\n\tprintf (\"%s\", palabra+103);\n\treturn 0\n}";
  8. n=strlen (palabra);
  9. palabra[102]='\0';
  10. printf ("%s ",palabra);
  11. palabra[102]=' ';
  12. printf ("\"");
  13. for (i=0;i<n;i++)
  14. switch (palabra[i])
  15. {
  16. case '\n':
  17. printf ("\\n");
  18. break;
  19. case '\t':
  20. printf ("\\t");
  21. break;
  22. case '\\':
  23. printf ("\\\\");
  24. break;
  25. case '\"':
  26. printf ("\\\"");
  27. break;
  28. default:
  29. printf ("%c",palabra[i]);
  30. }
  31. printf ("\";\n");
  32. printf ("%s", palabra+103);
  33. return 0;
  34. }
  35.  
2  Programación / Programación C/C++ / Retos C/C++ en: 27 Febrero 2011, 22:49
Hago concreto por fin el proyecto mío de establecer en la sección de C/C++ una serie de retos.

He aquí las reglas que he elaborado para tal fin, luego agregaré los primeros dos problemas:


Los retos son una forma de estimular a la comunidad a participar mediante la resolución de problemas que competen a las ciencias de la computación. En este caso particular, la implementación será en C/C++.

Los retos NO son una competencia, de serlo, la administración sería, obviamente, más rígida (en una competencia todos entregan sus códigos al mismo tiempo, por ejemplo).
Por lo cual, me parece redundante aclarar, que nadie viene aquí para demostrar nada o pelearse con el resto de los participantes.
Igualmente confío en el actuar responsable de la comunidad y espero que los retos se desarrollen con éxito y participación asidua, de modo que se transforme en un buen espacio para  compartir el hábito de la programación.



Los retos se desarrollarán de la siguiente manera:
-Se decidirán uno o dos problemas.
-Se crearán los hilos respectivos, los cuales serán puesto en chincheta por un mes, de modo que no haya ninguna ventaja (si alguno hubiese visto el mismo problema o problema similar con anterioridad). Y para que todos puedan hacerse un tiempo para participar, aún cuando estén muy atareados por el trabajo/estudio.
-Luego del mes el post se cerrará y quedarán las mediciones oficiales.
-Se creará otro post en chincheta que irá almacenando el historial de todos los retos que se cierren, de modo que no se pierdan aquellas resoluciones.



Los problemas serán todos de índole matemática. De ningún modo se exigirán conocimientos como APIs o demás que no estén en el estándar.
Con esto me refiero a que no serán retos al estilo de “programar un servidor”, “hacer un rootkit”, “hacer una interface gráfica”, etc. Obviamente que puedo modificar el enunciado del problema para hacer una “historia” divertida, pero me aseguraré que con conocimientos muy básicos y un poco de lógica se puedan resolver. No necesito resolverlos, simplemente leyéndolos uno puede darse cuenta de como “pinta” el ejercicio, si es un problema matemático, o si se necesitan conocimientos avanzados que no son del estandar.

El hecho es que pongan sus esfuerzos en un programa que resuelva el problema de manera COMPLETA (que no haya casos sin cubrir), respetando los requerimientos de memoria explicitados en el enunciado y se deberá tratar de que sea los más óptimo posible en velocidad de resolución.

Además, cada código que se posteé tendrá que poseer una descripción de QUÉ es precisamente lo que hace (osea una explicación del algoritmo usado), de modo que se pruebe fehacientemente de que uno entiende lo que postea y además, contribuya a entender el método de resolución adoptado. Ya que, si bien es posible entender leyendo el código, ahorra mucho tiempo que se explique POR QUÉ se hace lo que se hace; especialmente en problemas que tienen una solución original, la cual es producto de todo un proceso matemático deductivo.
Si alguien usa una idea ya posteada, sólo con mencionarlo no necesita explicar otra cosa que la modificación añadida.

Yo, personalmente, me encargaré de las mediciones oficiales de los códigos, lo que no quiere decir que ustedes no puedan aportar sus propias mediciones. Del mismo modo, trataré de leer todos los algoritmos y códigos para asegurarme de que la solución sirve para todos los ingresos (para lo cual es importante que hagan la descripción de su algoritmo).

Además me ocuparé de buscar problemas. Mas cualquiera puede sugerir alguno, probablemente espere un poco para ponerlo como reto, de modo que nadie sugiera un problema que en realidad sea una tarea. Tengan en cuenta que probablemente, si participan en los retos frecuentemente haciendo buenos aportes se ganarán la confianza para que acepte los problemas que sugieran.
Es muy importante para que yo acepte poner un problema como reto, las fuentes. Ya que no sobra el listo que desea que se le haga la tarea (y de forma óptima! xD). Eso no es todo, ya que existen competiciones online y sería terrible que estuviesemos resolviendole los problemas a alguien. Yo también postearé las fuentes para que sea completamente transparente este tema tan delicado.



El incumplimiento de cualquier norma, tanto de la sección en general, como de las de normas particulares de los retos, podría acarrear a la eliminación del comentario sin aviso previo.



Problema #1:

Fuente: Es un problema que tenía en la computadora hace tiempo, y revisando (como siempre anoto las fuentes) descubrí que lo había sacado de éste foro.
El post de donde fue sacado es este: http://foro.elhacker.net/empty-t278773.0.html
Yo ya lo he resuelto, es un problema que tengo como ejemplo para explicarle a algunos chicos que a veces optimizar significa trabajar un poco el problema matemáticamente y abandonar la forma bruta de resolverlos. Además es original y fue uno de los primeros problemas de envergadura media con que me enfrenté.
En brevedad escanearé las hojas donde tengo la explicación (me gusta desarrollarlo a mano) y subiré el código que hice hace tiempo. No lo revisé, pero puede que sea factible hacerle optimizaciones.





Problema #2:
Trataremos el problema G del pdf que aquí adjunto (perdon por el hecho de que esté en inglés, si alguien no entiende avisa y lo traduzco).
http://cm.baylor.edu/ICPCWiki/attach/Problem%20Resources/1992WorldFinalProblemSet.pdf
Fuente: Exámen de la final del mundo de las competencias ACM de 1992 (organizadas por IBM) una olimpíada de programación universitaria internacionaldonde se valora el trabajo en grupo (se programa en grupos de a 3) para el diseño de soluciones óptimas a problemáticas de envergadura (siempre hablando de problemas de algoritmia) y donde también se valora la velocidad (se tiene 5 horas para realizar la prueba).





Este problema todavía no lo he tratado todavía pero probablemente lo haga, ya que estamos pensando en competir ahora q voy a la facu...


Suerte!
3  Programación / Programación C/C++ / Brute Force Iterativo en: 30 Abril 2010, 05:43
Esto va para principalmente para Littlehorse, que me había pedido (hace mucho mucho mucho tiempo, quizás ni se acuerde) un brute force iterativo (yo había posteado uno recursivo).

Y aquí va:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.  int contadores[50], len, cant, i;
  8.  char caracteres[200], pass[50];
  9.  
  10.  printf ("Ingrese los caracteres a usar para la contrasena: ");
  11.  scanf ("%s", caracteres);
  12.  
  13.  printf ("Ingrese la longitud de la contraseña: ");
  14.  scanf ("%i", &len);
  15.  
  16.  cant = strlen (caracteres);
  17.  
  18.  /*contadores = (int *) malloc (sizeof (int) * (len+1) );
  19.   pass = (char *) malloc (len+1);*/
  20.  
  21.  for (i=0 ; i<len ; i++)
  22.    {
  23.        pass[i] = caracteres[0];
  24.        contadores[i] = 0;
  25.    }
  26.  contadores[i] = 0;
  27.  pass [i] = '\0';
  28.    //Inicio bucle
  29.  
  30.    while (!contadores[len])
  31.    {
  32.        printf ("%s\n", pass);
  33.  
  34.        for (i=0;contadores[i]==cant-1;i++)
  35.            pass[i] = caracteres [contadores[i] = 0];
  36.  
  37.        pass[i] = caracteres [++contadores[i]];
  38.    }
  39.  
  40.  /*free (contadores);
  41.   free (pass);*/
  42.  
  43.  system("PAUSE");
  44.  return 0;
  45. }
4  Programación / Programación C/C++ / Mastermind en: 30 Abril 2010, 05:31
Bueno, luego de un gran descanso empezaré a postear nuevamente mis cosillas.

Aquí un jueguito que muchos quizás lo tengan en su casa con el nombre de "Mastermind"

El juego se base en adivinar un número de n dígitos elegido aleatoriamente por la máquina (el número de dígitos n es ingreso).

Pero se cuentan con una serie de pistas, lo que no indica que en el juego no influya la suerte obvio, pero lo hace un juego más para pensar que para "tirar números al azar".

Estas pistas consiste en dar al usuario el número de cifras en las que ha acertado. Y el número de cambios o conmutaciones que podrían hacer para hacer que una ficha que está incorrecta, lo esté.
Un ejemplo vale más que mil palabras:

Imaginemos que n vale 4 (osea, estamos operando con 4 dígitos)

El número elegido por la pc es: 3345

Nosotros ingresamos el: 5542

Cantidad de aciertos (o blancas): 1 (el 4 en la tercera posición)
Cantidad de rojas: 1 (ya que si bien tengo dos 5, osea, dos incorrectas, en la incógnita tengo sólo un 5. Así que el otro está de más)


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LIMPIAR_PANTALLA system("cls");
  5.  
  6.  
  7.  
  8.  
  9. int esnumero (const char usuario[], int cant)
  10.    {
  11.        while (cant)
  12.            if ( usuario[--cant]<'0' || usuario[cant]>'9' )
  13.                return 1;
  14.        return 0;
  15.    }
  16.  
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.  FILE *historial;
  21.  char *incognita, *usuario, h;
  22.  int cant, i, j, blancas, rojas;
  23.  srand (time(NULL));
  24.  
  25.  do {
  26.        printf ("Ingrese la cantidad de caracteres para jugar: ");
  27.        scanf ("%i", &cant);
  28.    } while (cant<1);
  29.  
  30.  do {
  31.      printf ("\n\nDesea guardar el historial de la partida (ingrese 1 por si y 0 por no): ");
  32.      scanf ("%i", &h);
  33.    } while (h!=0&&h!=1);
  34.  
  35.  if (h)
  36.    if (! (  historial = fopen ("historial.txt", "w")  )  )
  37.        {
  38.            do {
  39.                printf ("\n\n\nHa surgido un error al crear el historial. Que desea hacer:\n1-Cerrar el programa\n2-Continuar sin guardar el historial\n\n\tOpcion: ");
  40.                scanf ("%i", &h);
  41.                } while (h!=0&&h!=1);
  42.            if (h)
  43.                return 0;
  44.            else
  45.                h=0;
  46.        }
  47.  
  48.  usuario = (char *) malloc (cant);
  49.  incognita = (char *) malloc (cant);
  50.  
  51.  for (i=0 ; i<cant ; i++)
  52.    incognita[i] = rand ()%10+'0';
  53.  incognita[cant] = '\0';
  54.  
  55.  if (h)
  56.    fprintf (historial, "%s\n\n\n", incognita);
  57.  
  58.  for (i=0,j=0 ; i<cant ; i++)
  59.    {
  60.    j *= 10;
  61.    j += 9;
  62.    }
  63.  // Programa propiamente dicho:
  64.  LIMPIAR_PANTALLA
  65.  printf ("A continuacion debe numeros entre 0 y %i hasta que adivine el numero\nLuego de cada numero le aparecera las pistas\n\nAprete una teclea para comenzar a jugar...", j);
  66.  system ("PAUSE>>nul");
  67.  LIMPIAR_PANTALLA
  68.  
  69.  do {
  70.        do
  71.            scanf ("%s", usuario);
  72.              while (strlen (usuario) != cant || esnumero (usuario, cant) );
  73.  
  74.        if (h)
  75.            fwrite (usuario, 1, cant, historial);
  76.  
  77.        blancas=0;
  78.        rojas=0;
  79.  
  80.        for (i=0;i<cant;i++)
  81.            if (incognita[i]==usuario[i])
  82.                {
  83.                    usuario[i] = 'b';
  84.                    blancas++;
  85.                }
  86.  
  87.        for (i=0;i<cant;i++)
  88.            if (usuario[i]!='b')
  89.                for (j=0;j<cant;j++)
  90.                    if (usuario[j]!='b'&&usuario[j]!='r'&&incognita[i]==usuario[j])
  91.                        {
  92.                        usuario[j] = 'r';
  93.                        rojas++;
  94.                        break;
  95.                        }
  96.  
  97.        if (h)
  98.            fprintf (historial, "\nBlancas: %i Rojas: %i\n\n", blancas, rojas);
  99.  
  100.        printf ("Blancas: %i Rojas: %i\n\n", blancas, rojas);
  101.  
  102.    } while (blancas!=cant);
  103.  
  104.    LIMPIAR_PANTALLA
  105.  
  106.    printf ("\n\tFELICITACIONES!\n\n\nUsted ha adivinado el numero (%s)\n\n", incognita);
  107.  
  108.  free (usuario);
  109.  free (incognita);
  110.  system("PAUSE");
  111.  return 0;
  112. }

Bueno, es un juego muy popular también en mi escuela.

PD: También posee la opción de guardar el historial del juego
Páginas: [1]
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines