elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18
81  Programación / Programación C/C++ / Demostracion del problema de Monty Hall en: 11 Agosto 2016, 23:14 pm
Quien no ha visto ese concurso donde hay un solo premio detras de 3 puertas las otras 2 con  Cabras u Ovejas...



La opción adecuada es siempre "cambiar" de puerta cuando te pregunten si te quieres cambiar de la misma..

El programa simula 10 Millones de Juegos 2 veces, en la primera ronda el jugador siempre cambia de puerta y en la segunda ronda el jugador nunca cambia de puerta.

Se demuestra que se tiene 66.6% de probabilidad de ganar si se cambia de puerta, contra 33.3% de probabilidad de ganar si no se cambia  de puerta.

Código
  1. #include<stdio.h>
  2. #include<stdint.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  6.  
  7. #define GOAT 0 //CABRA 0
  8. #define PRIZE 1 //PREMIO 1
  9.  
  10. #define MAX_SIMULATIONS 10000000
  11.  
  12. int main() {
  13. /*unsigned char */
  14. uint8_t position = 0; //Posicion del premio
  15. uint8_t selected = 0; //Posicion seleccionada por el jugado
  16. uint8_t doors[3]; //Puertas
  17. uint8_t can_switch = 0; //La puerta a la cual se puede cambiar
  18. register uint32_t count_win = 0;
  19. register uint32_t simulations = 0;
  20. srand(time(NULL)); //Semilla Random
  21. memset(doors,GOAT,sizeof(uint8_t)*3); //Todas las puertas son Cabras
  22. //< 10000000
  23. while(simulations < MAX_SIMULATIONS) {
  24. position = rand() % 3; //position del Premio Pseudo-Aleatoria
  25. doors[position] = PRIZE; //Guardamos el premio en la position antes seleccionada
  26. selected = rand() % 3; //position elejida por el Jugador
  27.  
  28. switch(selected) { //En base a lo elejido por el jugador
  29. //El encargado del juego valida que puerta tiene otra Cabra y la destapa
  30. //Dandole la oportunida al jugador de cambiar su puerta por la puerta restante
  31. case 0: //Puerta 0 elejida por el Jugador
  32. if(doors[1] == GOAT) { //Si otra puerta 1 Tiene cabra entonces
  33. can_switch = 2; //Le damos la oportunidad de elegir entre la puerta 0 y la puerta 2
  34. }
  35. else { //Caso contrario
  36. can_switch = 1; //Le damos la opotunidad de elegir entre la puerta 0 y la puerta 1
  37. }
  38. break;
  39. case 1: //Repetimos en caso de que seleccione la puerta 1
  40. if(doors[2] == GOAT) {
  41. can_switch = 0;
  42. }
  43. else {
  44. can_switch = 2;
  45. }
  46. break;
  47. case 2: //Repetimos en caso de que seleccione la puerta 2
  48. if(doors[0] == GOAT) {
  49. can_switch = 1;
  50. }
  51. else {
  52. can_switch = 0;
  53. }
  54. break;
  55. }
  56. if(doors[can_switch] == PRIZE) { //Evaluamos si la puerta elejida tiene el premio
  57. count_win++; //Si es asi incrementamos el contador de premios
  58. }
  59. doors[position] = GOAT; //0 //Restablecemos la puerta con premio nuevamente a Cabra
  60. simulations++; //Incrementamos el contador de Simulaciones
  61. }
  62.  
  63. //Imprimimos totales
  64. printf("Total simulations with change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));
  65.  
  66. count_win = 0; //Restablecemos contador de premios a 0
  67. simulations = 0; //Restablecemos contador de simulaciones a 0
  68.  
  69. //Como en la siguiente similacion el jugador no cambiara de puerta no es necesario evaluar las otras puertas
  70. while(simulations < MAX_SIMULATIONS) {
  71. position = rand() % 3;
  72. doors[position] = PRIZE;
  73. selected = rand() % 3;
  74. if(doors[selected] == PRIZE) {
  75. count_win++;
  76. }
  77. doors[position] = GOAT; //0
  78. simulations++;
  79. }
  80. printf("Total simulations without change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));
  81. return(0);
  82. }
  83.  

Descripción del problema:

https://en.m.wikipedia.org/wiki/Monty_Hall_problem


Salida del codigo arriba mostrado:

Código:
Total simulations with change 10000000, win: 6665613 rate: 0.666561
Total simulations without change 10000000, win: 3335076 rate: 0.333508
Saludos!
82  Programación / Programación C/C++ / La memoria no se inicializa en cero de Forma Automatica en: 8 Agosto 2016, 04:24 am
Repitan despues de mi...

La memoria no se inicializa en 0 de forma automatica.
Los arreglos no se inicializan en 0 de forma automatica.
Las variables no se inicializan en 0 de forma automatica.

Se que es un tema tanto repetitivo y es el causante de muchos errores de programacion.

No existe ninguna garantia de que la memoria este inicializada en 0 todas las veces, hay ocasiones en la que si lo esta y hay ocasiones en la que no esta veamos este ejemplo, el cual muestra de un arreglo de 20 elementos los que su valor inicial no sea 0,

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. int i;
  5. int arreglo[20];
  6. i = 0;
  7. while(i < 20) {
  8. if(arreglo[i] != 0) {
  9. printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
  10. }
  11. i++;
  12. }
  13. return 0;
  14. }
  15.  
  16.  

La salida de ese codigo compilado con GCC para windows es:

Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160
La posicion 2 del arreglo no esta inicializada su valor actual es 21
La posicion 4 del arreglo no esta inicializada su valor actual es 9966448
La posicion 6 del arreglo no esta inicializada su valor actual es 1
La posicion 8 del arreglo no esta inicializada su valor actual es -1
La posicion 9 del arreglo no esta inicializada su valor actual es -1
La posicion 10 del arreglo no esta inicializada su valor actual es 4200261
La posicion 12 del arreglo no esta inicializada su valor actual es 1
La posicion 14 del arreglo no esta inicializada su valor actual es 4200137
La posicion 16 del arreglo no esta inicializada su valor actual es 3
La posicion 18 del arreglo no esta inicializada su valor actual es 21

Y la segunda vez que lo ejecute fue

Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160
La posicion 2 del arreglo no esta inicializada su valor actual es 21
La posicion 4 del arreglo no esta inicializada su valor actual es 12063600
La posicion 6 del arreglo no esta inicializada su valor actual es 1
La posicion 8 del arreglo no esta inicializada su valor actual es -1
La posicion 9 del arreglo no esta inicializada su valor actual es -1
La posicion 10 del arreglo no esta inicializada su valor actual es 4200261
La posicion 12 del arreglo no esta inicializada su valor actual es 1
La posicion 14 del arreglo no esta inicializada su valor actual es 4200137
La posicion 16 del arreglo no esta inicializada su valor actual es 3
La posicion 18 del arreglo no esta inicializada su valor actual es 21

Como ven algunos valores cambiaron y otros se mantiene similares..

Depende del programador inicializar la memoria correctamente, o por lo menos estar cociente de que es posible que tenga basura en la memoria.

Una forma de inicializar en 0 el arreglo mencioanado al momento de declararlo es:

Código
  1. int arreglo[20] = {0};

otra forma es utilizar las funciones para inicializar con X valor la memoria

Por ejemplo para inicializar con 0:

Código
  1. memset(arreglo,0,sizeof(int)*20);

Saludos!
83  Programación / Programación C/C++ / [Grafo] Base para el Algoritmo de Dijkstra en: 7 Agosto 2016, 02:20 am
Muy buen dia, les dejo la Base para realizar el algoritmo de dijkstra.

La imagen de ejemplo es la que esta en Wikipedia https://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra#/media/File:Dijkstra_Animation.gif

He aqui el código, el ejemplo que muestra que la ruta mas rápida de 1 a 5 tiene un peso total de 20

El código esta medianamente comentado y Imprime lo que esta haciendo en tiempo de ejecución.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. struct nodo {
  6. int id;
  7. //Dato del Nodo
  8. //struct data *datos; //En caso de apuntar a otro tipo de estrucutura
  9. //Variables auxiliar para el Grafo
  10. int peso_actual; //Contenedor del peso actual recorrido para llegar a este nodo
  11. struct nodo *mejor_ruta; //Indice de la mejor ruta para llegar al nodo de la ultima busqueda -1 para datos no inicializados
  12. int visitado; //Variable Entera de Visitado, almacena un numero Ramdon para deteminar si fue visitado o no por el proceso actual
  13. int out;
  14. int total; //Total de vetices conectados a reste Nodo
  15. int *aristas; //En caso de que existan distintos pesos para viajar al X vertice se ponen aqui
  16. struct nodo **vertices; //Distintos vertices que se pueden alcanzar desde este Nodo
  17. //int *vertices; //En caso de aplicar un nodo por indices a un arreglo de nodos
  18. };
  19.  
  20. struct grafo {
  21. int total; // Total de nodos validos en el grafo
  22. int disponible; // Total de espacios asignables en el grafo
  23. struct nodo **nodos; //tabla de acceso rapido a X nodo
  24. };
  25.  
  26.  
  27. struct grafo *add(struct grafo *grafo_actual,int origen, int peso, int destino);
  28. void add_nodo(struct grafo *grafo_actual,int origen,int peso,int destino);
  29. int dijkstra(struct nodo *nodo_a,struct nodo *nodo_b);
  30. int menor_ruta(struct grafo *grafo_actual,int A,int B);
  31.  
  32. int main() {
  33. struct grafo *grafo = NULL;
  34. /*
  35. struct grafo *add(struct grafo *grafo_actual,int origen, int peso, int destino);
  36. */
  37. grafo = add(grafo,1, 7,2);
  38. grafo = add(grafo,1, 9,3);
  39. grafo = add(grafo,1,14,6);
  40. grafo = add(grafo,6, 9,5);
  41. grafo = add(grafo,6, 2,3);
  42. grafo = add(grafo,3,11,4);
  43. grafo = add(grafo,3,10,2);
  44. grafo = add(grafo,2,15,4);
  45. grafo = add(grafo,4, 6,5);
  46. printf("Ruta %i\n",menor_ruta(grafo,1,5));
  47. return 0;
  48. }
  49.  
  50. int menor_ruta(struct grafo *grafo_actual,int A,int B) {
  51. return dijkstra(grafo_actual->nodos[A-1],grafo_actual->nodos[B-1]);
  52. }
  53.  
  54. struct grafo *add(struct grafo *grafo_actual,int origen, int peso, int destino) {
  55. /*
  56. Variables
  57. */
  58. int mayor = destino;
  59. struct nodo **temp = NULL;
  60. /*
  61. Inicializamos el grafo en caso de que no exista
  62. */
  63. if(grafo_actual == NULL) {
  64. grafo_actual = calloc(1,sizeof(struct grafo));
  65. }
  66. /*
  67. Determinamos el indice mayor
  68. */
  69. if(origen > destino) {
  70. mayor = origen;
  71. }
  72. /*
  73. Evaluamos si tenemos espacio suficiente
  74. */
  75. if(mayor > grafo_actual->disponible) {
  76. /*
  77. En caso de no tener espacio suficiente lo reasignamos
  78. */
  79. temp = calloc(mayor,sizeof(struct nodo*));
  80. if(temp) {
  81. if(grafo_actual->nodos) {
  82. memcpy(temp,grafo_actual->nodos,grafo_actual->disponible*sizeof(struct nodo*));
  83. free(grafo_actual->nodos);
  84. grafo_actual->nodos = NULL;
  85. }
  86. grafo_actual->nodos = temp;
  87. grafo_actual->disponible = mayor;
  88. }else {
  89. printf("Memory out!!\n");
  90. exit(0);
  91. }
  92. }
  93. /*
  94. Inicializamos los nodos en caso de que no existan
  95. */
  96. if(grafo_actual->nodos[origen-1] == NULL) {
  97. grafo_actual->nodos[origen-1] = calloc(1,sizeof(struct nodo));
  98. grafo_actual->nodos[origen-1]->id = origen;
  99. grafo_actual->total++;
  100. }
  101. if(grafo_actual->nodos[destino-1] == NULL) {
  102. grafo_actual->nodos[destino-1] = calloc(1,sizeof(struct nodo));
  103. grafo_actual->nodos[destino-1]->id = destino;
  104. grafo_actual->total++;
  105. }
  106.  
  107. /*
  108. Agregamos las Pesos y Aristas
  109. */
  110. add_nodo(grafo_actual,origen,peso,destino);
  111. add_nodo(grafo_actual,destino,peso,origen);
  112.  
  113. /*
  114. Retornamos el grafo_actual
  115. */
  116. return grafo_actual;
  117. }
  118.  
  119. void add_nodo(struct grafo *grafo_actual,int origen,int peso,int destino) {
  120. struct nodo *aux = grafo_actual->nodos[origen-1];
  121. aux->aristas = realloc(aux->aristas,sizeof(int)*(aux->total+1));
  122. aux->vertices = realloc(aux->vertices,sizeof(int)*(aux->total+1));
  123. aux->aristas[aux->total]  = peso;
  124. aux->vertices[aux->total] = grafo_actual->nodos[destino-1];
  125. printf("Uniendo nodos: (%i)--[%i]--(%i)\n",origen,peso,destino);
  126. aux->total++;
  127. }
  128.  
  129. int dijkstra(struct nodo *nodo_a,struct nodo *nodo_b) {
  130. struct nodo *inicio =NULL,*pivote = NULL;
  131. struct nodo **pendientes = NULL; //Arreglo de nodos no visitados a un.
  132. int i,j,total = 0;
  133. int visitado = rand(); //Variable aleatoria para determinar si un Nodo ya fue visitado por esta ocacion
  134. int peso_nuevo; //Variable temporal para evaluar cual es el menor peso al momento de visitar un nodo
  135. i = 0;
  136. pendientes = realloc(pendientes,sizeof(struct nodo*)*(total+1));
  137. pendientes[total] = nodo_a; //Nodo inicial a visitar el el nodo A que se recibio como parametr
  138. nodo_a->peso_actual = 0;
  139. total++;
  140. printf("Buscando ruta de %i a %i\n",nodo_a->id,nodo_b->id);
  141. while(i < total) {
  142. pivote = pendientes[i];
  143. printf("Procesando el nodo %i\n",pivote->id);
  144. if(pivote->out != visitado){ //Si aun no Agotamos el nodo actual
  145. printf("Visitando %i\n",pivote->id);
  146. j = 0;
  147. while(j < pivote->total ) {
  148. if(pivote->vertices[j]->out != visitado) {
  149. if(pivote->vertices[j]->visitado != visitado) {
  150. printf("El subnodo %i no a sido visitado\n",pivote->vertices[j]->id);
  151. pendientes = realloc(pendientes,sizeof(struct nodo*)*(total+1));
  152. pendientes[total] = pivote->vertices[j];
  153. total++;
  154. pivote->vertices[j]->peso_actual = pivote->peso_actual + pivote->aristas[j];
  155. pivote->vertices[j]->mejor_ruta = pivote;
  156. //printf("Ruta de %i a %i vale %i\n",nodo_a->id,pivote->vertices[j]->id,pivote->vertices[j]->peso_actual);
  157. }
  158. else { //Aqui ya lo visitamos, solo validaremos si la ruta pesa menos por este camino que por que se visito previamente
  159. printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
  160. //printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
  161. peso_nuevo =  pivote->peso_actual + pivote->aristas[j];
  162. printf("%i > %i ? %s\n",pivote->vertices[j]->peso_actual,peso_nuevo,(pivote->vertices[j]->peso_actual > peso_nuevo) ? "si":"no");
  163. if(pivote->vertices[j]->peso_actual > peso_nuevo) { // Si esta condicion se cumple es mas rapido llegar al nodo pivote->vertices[j] mediante el nodo pivote
  164. printf("Nueva mejor ruta a %i con peso de %i\n",pivote->vertices[j]->id,peso_nuevo);
  165. pivote->vertices[j]->peso_actual = peso_nuevo;
  166. pivote->vertices[j]->mejor_ruta = pivote;
  167. }
  168. printf("Ruta de %i a %i vale %i\n",nodo_a->id,pivote->vertices[j]->id,pivote->vertices[j]->peso_actual);
  169. //En caso de que el if no se cumpla es mas rapido llegar al nodo pivote->vertices[j] de la manera en la ya habia sido visitado previamente
  170. }
  171. }
  172. else {
  173. //printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
  174. printf("El subnodo %i ya a sido visitado\n",pivote->vertices[j]->id);
  175. peso_nuevo =  pivote->peso_actual + pivote->aristas[j];
  176. printf("%i > %i ? %s\n",pivote->vertices[j]->peso_actual,peso_nuevo,(pivote->vertices[j]->peso_actual > peso_nuevo) ? "si":"no");
  177. if(pivote->vertices[j]->peso_actual > peso_nuevo) { // Si esta condicion se cumple es mas rapido llegar al nodo pivote->vertices[j] mediante el nodo pivote
  178. printf("Nueva mejor ruta a %i con peso de %i\n",pivote->vertices[j]->id,peso_nuevo);
  179. pivote->vertices[j]->peso_actual
  180. = peso_nuevo;
  181. pivote->vertices[j]->mejor_ruta = pivote;
  182. }
  183. printf("Ruta de %i a %i vale %i\n",nodo_a->id,pivote->vertices[j]->id,pivote->vertices[j]->peso_actual);
  184. //En caso de que el if no se cumpla es mas rapido llegar al nodo pivote->vertices[j] de la manera en la ya habia sido visitado previamente
  185. }
  186. pivote->vertices[j]->visitado = visitado;
  187. j++;
  188. }
  189. pivote->out = visitado;
  190. printf("Nodo %i fuera!\n",pivote->id);
  191. }
  192. else {
  193. printf("El nodo %i ya esta fuera\n",pivote->id);
  194. }
  195. i++;
  196. }
  197. free(pendientes);
  198. return nodo_b->peso_actual;
  199. }
  200.  
84  Programación / Programación C/C++ / Optimizar tamaño de estructura de Datos en: 22 Julio 2016, 19:03 pm
Muy buen dia estoy buscando optimizar el tamaño de una estructura dada.

Habia visto que es posible especificar el tamaño de una variable a nivel de bits.

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x,y;
  5. struct nodo *aristas[4];
  6. };
  7.  

Quiero optimizar las variables tabla, x é y

Las variables solo tiene valores del 0 al 15, con lo cual 4 bits serian suficientes.

Habia visto que se puede especificar el tamaño de la variable ejemplo:

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x:4;
  5. unsigned char y:4;
  6. struct nodo *aristas[4];
  7. };
  8.  

Pero no se hacerlo para la variable tabla.

Saludos!
85  Programación / Programación C/C++ / ¿Existe algo mas eficiente que un arbol binario? en: 22 Julio 2016, 14:52 pm
El punto es en eficiencia de busqueda.

Estaba haciendo el grafo que propuse en

¿Imposible? Juego de Rompecabezas imposible

Casi todo marcha bien con el grafo a excepcion de la parte donde valido si un valor ya existe en el grafo. En el ultimo intento que hice llevaba maa de 140 mil nodos en el grafo y con  cada posible nodo nuevo tenia que validar la existencia de su valor en el grafo (Muy lento)

Posteriormente use arreglo de los nodos existentes (Igualmente lento).

Entonces voy a usar un Arbol Binario.

Y la pregunta es esa ¿Hay algo mas eficiente que un arbol binario?

Lo pregunto por que no me he actualizado en mas de 5 años en estructuras de datos, estaba contemplando una tabla hash pero nunca la estudie y dudo que sea mas eficiente que un arbol binario en lo que se refiere a insercion y busqueda de nodos.

Saludos
86  Programación / Programación C/C++ / ¿Imposible? Juego de Rompecabezas imposible en: 21 Julio 2016, 16:57 pm
Bueno les dejo aquí el código del Juego del imposible...

Se juega usando las teclas w,a,s,d como si fueran las flechas del teclado, esta seguida de un enter.

El reto "imposible" es definir dada la matriz inicial llegar a su forma inversa:

Código:
[ 1][ 2][ 3][ 4]
[ 5][ 6][ 7][ 8]
[ 9][10][11][12]
[13][14][15][  ]

Código:
[15][14][13][12]
[11][10][ 9][ 8]
[ 7][ 6][ 5][ 4]
[ 3][ 2][ 1][  ]


Y si, es IMPOSIBLE

Código
  1. /*
  2. Juego del Imposible | Programación en C
  3.  
  4. [ 1][ 2][ 3][ 4]
  5. [ 5][ 6][ 7][ 8]
  6. [ 9][10][11][12]
  7. [13][14][15][  ]
  8.  
  9. w
  10. asd
  11.  
  12. Contacto
  13. Twitter: @albertobsd
  14. Email: alberto.bsd@gmail.com
  15. */
  16. #include<stdio.h>
  17.  
  18. void imprimir_tablero();
  19.  
  20. int tabla[4][4];
  21. int x= 3,y =3;
  22.  
  23. int main() {
  24. int i = 0,j =0,contador = 1;
  25. char caracter,enter;
  26. //Inicializar la tabla o matriz de juego
  27. while(i < 4) {
  28. j = 0;
  29. while(j < 4) {
  30. tabla[i][j] = contador;
  31. //printf("[%2i]",tabla[i][j]);
  32. j++;
  33. contador++;
  34. }
  35. printf("\n");
  36. i++;
  37. }
  38. tabla[y][x] = 0;
  39. imprimir_tablero();
  40. do {
  41. caracter = getchar();
  42. enter = getchar();
  43. switch(caracter) {
  44. case 'w': //arriba
  45. if(y <= 2) {
  46. //Movimiento de ficha
  47. tabla[y][x] = tabla[y+1][x];
  48. tabla[y+1][x] = 0;
  49. imprimir_tablero();
  50. y++;
  51. }
  52. else {
  53. printf("Fuera de los limites\n");
  54. }
  55. break;
  56. case 's': //abajo
  57. if(y >= 1) {
  58. //Movimiento de ficha
  59. tabla[y][x] = tabla[y-1][x];
  60. tabla[y-1][x] = 0;
  61. imprimir_tablero();
  62. y--;
  63. }
  64. else {
  65. printf("Fuera de los limites\n");
  66. }
  67. break;
  68. case 'a': //izquierda
  69. if(x <= 2) {
  70. //Movimiento de ficha
  71. tabla[y][x] = tabla[y][x+1];
  72. tabla[y][x+1] = 0;
  73. imprimir_tablero();
  74. x++;
  75. }
  76. else {
  77. printf("Fuera de los limites\n");
  78. }
  79.  
  80. break;
  81. case 'd': //derecha
  82. if(x >= 1) {
  83. tabla[y][x] = tabla[y][x-1];
  84. tabla[y][x-1] = 0;
  85. imprimir_tablero();
  86. x--;
  87. }
  88. else {
  89. printf("Fuera de los limites\n");
  90. }
  91. break;
  92. case '0': //Salida
  93. break;
  94. default:
  95. printf("Caracter Incorrecto");
  96. break;
  97. }
  98. printf("Caracter : %c\n",caracter);
  99. }while(caracter != '0');
  100. return 0;
  101. }
  102.  
  103. void imprimir_tablero() {
  104. int i = 0,j;
  105. while(i < 4) {
  106. j = 0;
  107. while(j < 4) {
  108. if(tabla[i][j] != 0) {
  109. printf("[%2i]",tabla[i][j]);
  110. }
  111. else {
  112. printf("[  ]");
  113. }
  114. j++;
  115. }
  116. printf("\n");
  117. i++;
  118. }
  119. }


Video:



Dejo también un Documento donde se explica de forma matemática por que es imposible el acomodo invertido dada una posición inicial.

http://miscelaneamatematica.org/Misc40/Campos_r.pdf

Aclaro que ese documento no es mio, lo realizaron los autores ahí señalados en el mismo.

Saludos!
87  Foros Generales / Foro Libre / Logran engañar a Pokemon Go por falta de validacion de certificado en: 10 Julio 2016, 04:48 am
En la cuenta de Twitter de Den Delimarsky se puede leer que la aplicación por falta de validacion de certificado es vulnerable a ser engañada mediante un proxy y con llamadas a la API es posible navegar en el mundo de pokemon go desde la comodidad del hogar y sin los peligros de ser atropellado en la calle.

@DennisCode

https://twitter.com/DennisCode/status/751592223330881536

Citar
Pokemon Go... get yourself whatever you want because I can hook directly into the APIs with mitmproxy. No cert check

Saludos!
88  Foros Generales / Sugerencias y dudas sobre el Foro / Respuestas "Re :" por app Tapatalk en: 8 Julio 2016, 15:27 pm
Aunque no he usado Tapatalk

He visto que siempre deja titulos "Re:" sin el titulo original del tema.

Deberian de solucionar eso xD.

Saludos
89  Foros Generales / Foro Libre / Juego: Premios y Castigos en: 8 Julio 2016, 14:56 pm
Muy buen dia.

Estoy haciendo un pequeño juego en la casa (No tiene nada que ver con computadoras) y necesitaba algunas ideas frescas para los premios y/o castigos.

El detalle de esto es que estoy haciendo una estadística y quiero que en base a los premios y/o catigos los jugadores esten muy motivados para ganar.

Estaba desempolvado la vieja mesa de tortura medieval que consegui en la deepweb  :rolleyes:  :rolleyes:  :xD pero creo que no aplica para el juego xD

La primera opcion que pense es dinero como premio o que lo paguen como castigo pero no se ustedes que sugieren?

Tambien pense en los siguientes castigos
  • mini descargas electricas
  • Poner hielo en alguna parte del cuerpo

Espero sus comentarios

Saludos
90  Programación / Programación C/C++ / [Aporte] Piedra Pape y Tijera - Mini-Autómata + Ejercicio en: 7 Julio 2016, 15:47 pm
Muy buen dia como saben en mi canal de youtube tengo tutoriales de programación en C el ultimo que hice es el juego de Piedra Pepel y Tijera algo sencillo pero usando una Tabla de Estados simulando la forma mas básica de un autómata.

Dejo el codigo no sin antes proponerles un reto y es el siguiente: Dado el código siguiente modificarlo para que el programa sea capaz de "aprender" del histórico de jugadas del usuario y asi sea capas de predecir la próxima jugada.

Este aprendizaje no debe de perderse (Por lo tanto se debe de poder guardar para ser cargados en Futuros juegos)

Código
  1. /*
  2. Realizado por Luis Alberto
  3.  
  4. Contacto
  5. Twitter: @albertobsd
  6.  
  7. */
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. #include<time.h>
  11. #include<stdbool.h>
  12.  
  13. //Constantes para las jugadas
  14. #define PIEDRA 0
  15. #define PAPEL 1
  16. #define TIJERA 2
  17.  
  18.  
  19. int main() {
  20. int jugador = 0, computadora = 0; // Variables para la seleccion de los Jugadores (Usuario - Computadora)
  21. char *jugadas[3] = {"Piedra","Papel","Tijera"}; //Cadenas para imprimir segun lo seleccionado por las variables Anteriores
  22.  
  23. /*
  24. Exclusivamente para el resultado (Matriz bidimencional)
  25.  
  26. Columnas para la Computadora
  27. Filas para el Jugador
  28.  
  29. Valores:
  30. - 1 si el jugador Gana
  31. - 0 si el jugador Empata
  32. - 2 si el jugador Pierde
  33. [0][P][G]
  34. [G][0][P]
  35. [P][G][0]
  36.  
  37. */
  38. int resultados[3][3] = {{0,2,1},
  39. {1,0,2},
  40. {2,1,0}};
  41. char *resultados_str[3] = {"El jugador Empata","El Jugador Gana","El jugador Pierde"}; // Cadenas con los resultados
  42. bool entrar = true; //Variable para detener el ciclo
  43. int opcion; //Opcion seleccionada
  44. char temp[10]; //Variable temporal para guardar la entrada desde el teclado
  45. char *valor = NULL; //Puntero adicional usado por strtol
  46. srand(time(NULL)); // inicializar la semilla Pseudo-Aleatoria
  47. do {
  48. computadora = rand() % 3; //Valor seleccionado por la computadora al azar
  49. //Menu para el usuario
  50. printf("1) %s\n",jugadas[PIEDRA]);
  51. printf("2) %s\n",jugadas[PAPEL]);
  52. printf("3) %s\n",jugadas[TIJERA]);
  53. printf("S) Salir\n");
  54. printf("Ingrese su opcion: ");
  55. fgets(temp,10,stdin); // Capturamos texto
  56. opcion = strtol(temp,&valor,10); //Convertimos el texto a Entero
  57. if(valor[0] == '\0' || valor[0] == 0x0a) { //Si es un valor valido continuas
  58. switch(opcion) { //switch para las opciones pero se pudo usar un IF
  59. case 1:
  60. case 2:
  61. case 3:
  62. jugador = opcion - 1; //Seleccion del Jugador
  63. //resultados:
  64. printf("La computadora elijio %s\n",jugadas[computadora]);
  65. printf("El jugador elijio %s\n",jugadas[jugador]);
  66. printf("Resultado: %s\n",resultados_str[resultados[jugador][computadora]]);
  67. break;
  68. default:
  69. printf("Aprende a leer solo valores del 1 al 3 o la letra S mayuscula\n");
  70. break;
  71. }
  72. }
  73. else { //Si no es valor valido posiblemente sea una S
  74. //printf("Elijio %.2x\n",valor[0]);
  75. if(temp[0] == 'S') { //Si es S establecemos la variable para salir del ciclo
  76. entrar = false;
  77. }
  78. }
  79. }while(entrar);
  80. return 0;
  81. }

Aqui les dejo el vídeo mencionado:



Saludos!


He creado una estructura para guardar los resultados y posteriormente guardar la estructura en un archivo

De hecho son 2 estrucuturas:

Código
  1. struct nodo_ppt {
  2. int count;
  3. int respuesta[3];
  4. };

La estrucutura anterior guarda un contador para indicar cuantas veces se a entrado a ese nodo y posteriormente cual fue la respuesta a esto.

Por ejemplo tenemos un arreglo de  9 nodos
Código
  1. struct nodo_ppt nodos[9];

Y por ejemplo se juega Piedra(Jugador) vs Tijera(Computadora) entonces al igual que en la matriz de resultados:

Código
  1. int resultados[3][3] = {{0,2,1},{1,0,2},{2,1,0}};

Entonces guardamos como nodos "previo" la posicion de nodos [(Jugador*3) +computadora]  y en el proximo juego incrementamos la seleccion del jugador en el nodo previo y nuevamente ajustamos el nodo previo a la seleccion actual y repetimos.

Con esto tendremos un histórico de (Si en el juego anterior se juego X entonces en el juego siguiente Jugara Y (con mas probabilidad)) donde Y es el mayor numero seleccionado en el contador de respuesta
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines