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


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Cómo simplificar este código?
0 Usuarios y 7 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo simplificar este código?  (Leído 60 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.706


Hackentifiko!


Ver Perfil
¿Cómo simplificar este código?
« en: Hoy a las 09:08 »

Este me parece bien:
Código
  1. // 3 en línea muy simplificado:
  2. // 1 jugador.
  3. // No hay tablero, hay una cadena de texto.
  4. // La acción es poner 0 o 1 en el 1er sitio disponible.
  5. // Hay victoria cuando la cadena es "11".
  6. // Hay derrota cuando son 2 caracteres pero no es "11".
  7. // No hay empate.
  8. //
  9. // Situaciones a investigar:
  10. S1 = "";
  11. S2 = "0";
  12. S3 = "1";
  13. // Investigar S3 y S2:
  14. SInvestigandose = 3;
  15. do {
  16.    BaseS = eval("S"+SInvestigandose);
  17.    trace ("Investigando la situación "+BaseS);
  18.    Action = 0;
  19.    BestAction = 0;
  20.    // Usando BestAction:
  21.    BestChanceOfWin = 0;
  22.    // Considerando todas las acciones:
  23.    Wins = 0;
  24.    Loses = 0;
  25.    do {
  26.        S = BaseS+Action;
  27.        trace ("Se realizó la acción "+Action+", el resultado es "+S);
  28.        if (S == "11") {
  29.            trace ("Victoria, anotando datos");
  30.            Wins++;
  31.            BestAction = Action;
  32.            BestChanceOfWin = 100;
  33.        } else {
  34.            trace ("Derrota");
  35.            Loses++;
  36.        }
  37.        Action++;
  38.    } while (Action<2);
  39.    trace ("No hay más acciones posibles, anotando datos");
  40.    // Guardar datos descubiertos de las situaciones:
  41.    set ("S"+BaseS+"BestAction", BestAction);
  42.    // Usando BestAction:
  43.    set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin);
  44.    // Considerando todas las acciones:
  45.    set ("S"+BaseS+"Wins", Wins);
  46.    set ("S"+BaseS+"Loses", Loses);
  47.    set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));
  48.    // Investigar la situación anterior de la lista:
  49.    SInvestigandose--;
  50. } while (SInvestigandose>1);
  51. // Investigar S1:
  52. BaseS = eval("S"+SInvestigandose);
  53. trace ("Investigando la situación "+BaseS);
  54. Action = 0;
  55. BestAction = "";
  56. // Usando BestAction:
  57. BestChanceOfWin = 0;
  58. // Considerando todas las acciones:
  59. Wins = 0;
  60. Loses = 0;
  61. do {
  62.    S = BaseS+Action;
  63.    trace ("Se realizó la acción "+Action+", el resultado es "+S);
  64.    NewS_ = "S"+S;
  65.    NextBestChanceOfWin = eval(NewS_+"BestChanceOfWin");
  66.    if (NextBestChanceOfWin>BestChanceOfWin) {
  67.        trace ("La NewS da más chance de ganar, se sustituyen datos sobre qué hacer en la investigada y por qué");
  68.        BestAction = Action;
  69.        BestChanceOfWin = NextBestChanceOfWin;
  70.    }
  71.    // Se agregan datos de la NewS:
  72.    Wins = Wins+eval(NewS_+"Wins");
  73.    Loses = Loses+eval(NewS_+"Loses");
  74.    Action++;
  75. } while (Action<2);
  76. trace ("No hay más acciones posibles, anotando datos");
  77. // Guardar datos descubiertos de la situación:
  78. set ("S"+BaseS+"BestAction", BestAction);
  79. // Usando BestAction:
  80. set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin);
  81. // Considerando todas las acciones:
  82. set ("S"+BaseS+"Wins", Wins);
  83. set ("S"+BaseS+"Loses", Loses);
  84. set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));
  85.  

El resultado en resumen es:
  Variable _level0.S1BestAction = 1
  Variable _level0.S0BestAction = 0
  Variable _level0.SBestAction = 1
Significa:
En la situación "1" conviene usar la acción 1.
En la situación "0" conviene usar la acción 0 (*).
En la situación "" conviene usar la acción 1.
(*): En realidad como no fue posible ganar nunca grabó qué acción conviene.

Pero bueno, leo sugerencias.

Intentando aprender a hacer códigos más útiles de ese estilo (fuerza bruta para un juego estilo 3 en línea) hice este ¿cómo lo simplificarían?
Código
  1. // 3 en línea muy simplificado:
  2. // 1 jugador.
  3. // No hay tablero, hay una cadena de texto.
  4. // La acción es poner 0 o 1 en una de las 2 posiciones.
  5. // Hay victoria cuando la cadena es "11".
  6. // Hay derrota cuando son 2 caracteres pero no es "11".
  7. // No hay empate.
  8. //
  9. // Situaciones a investigar:
  10. S1 = "";
  11. S2 = "0";
  12. S3 = "1";
  13. S4 = " 0";
  14. S5 = " 1";
  15. // Investigar S5~S2:
  16. SInvestigandose = 5;
  17. do {
  18.    BaseS = eval("S"+SInvestigandose);
  19.    trace ("Investigando la situación "+BaseS);
  20.    Action = 0;
  21.    BestAction = 0;
  22.    // Usando BestAction:
  23.    BestChanceOfWin = 0;
  24.    // Considerando todas las acciones:
  25.    Wins = 0;
  26.    Loses = 0;
  27.    do {
  28.        trace ("Se realizará la acción "+Action);
  29.        if (Action == 0) {
  30.            if (BaseS == "") {
  31.                S = "0";
  32.            } else if (BaseS.charat(0) == " ") {
  33.                S = "0"+BaseS.substring(1);
  34.            } else {
  35.                S = "Ninguna";
  36.            }
  37.        } else if (Action == 1) {
  38.            if (BaseS == "") {
  39.                S = "1";
  40.            } else if (BaseS.charat(0) == " ") {
  41.                S = "1"+BaseS.substring(1);
  42.            } else {
  43.                S = "Ninguna";
  44.            }
  45.        } else if (Action == 2) {
  46.            if (BaseS == "") {
  47.                S = " 0";
  48.            } else if (BaseS.length<2) {
  49.                S = BaseS+"0";
  50.            } else {
  51.                S = "Ninguna";
  52.            }
  53.        } else if (Action == 3) {
  54.            if (BaseS == "") {
  55.                S = " 1";
  56.            } else if (BaseS.length<2) {
  57.                S = BaseS+"1";
  58.            } else {
  59.                S = "Ninguna";
  60.            }
  61.        }
  62.        trace ("El resultado es "+S);
  63.        if (S == "11") {
  64.            trace ("Victoria, anotando datos");
  65.            Wins++;
  66.            BestAction = Action;
  67.            BestChanceOfWin = 100;
  68.        } else if (S != "Ninguna") {
  69.            trace ("Derrota");
  70.            Loses++;
  71.        }
  72.        Action++;
  73.    } while (Action<4);
  74.    trace ("No hay más acciones posibles, anotando datos");
  75.    // Guardar datos descubiertos de las situaciones:
  76.    set ("S"+BaseS+"BestAction", BestAction);
  77.    // Usando BestAction:
  78.    set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin);
  79.    // Considerando todas las acciones:
  80.    set ("S"+BaseS+"Wins", Wins);
  81.    set ("S"+BaseS+"Loses", Loses);
  82.    set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));
  83.    // Investigar la situación anterior de la lista:
  84.    SInvestigandose--;
  85. } while (SInvestigandose>1);
  86. // Investigar S1:
  87. BaseS = eval("S"+SInvestigandose);
  88. trace ("Investigando la situación "+BaseS);
  89. Action = 0;
  90. BestAction = "";
  91. // Usando BestAction:
  92. BestChanceOfWin = 0;
  93. // Considerando todas las acciones:
  94. Wins = 0;
  95. Loses = 0;
  96. do {
  97.    trace ("Se realizará la acción "+Action);
  98.    if (Action == 0) {
  99.        if (BaseS == "") {
  100.            S = "0";
  101.        } else if (BaseS.charat(0) == " ") {
  102.            S = "0"+BaseS.substring(1);
  103.        } else {
  104.            S = "Ninguna";
  105.        }
  106.    } else if (Action == 1) {
  107.        if (BaseS == "") {
  108.            S = "1";
  109.        } else if (BaseS.charat(0) == " ") {
  110.            S = "1"+BaseS.substring(1);
  111.        } else {
  112.            S = "Ninguna";
  113.        }
  114.    } else if (Action == 2) {
  115.        if (BaseS == "") {
  116.            S = " 0";
  117.        } else if (BaseS.length<2) {
  118.            S = BaseS+"0";
  119.        } else {
  120.            S = "Ninguna";
  121.        }
  122.    } else if (Action == 3) {
  123.        if (BaseS == "") {
  124.            S = " 1";
  125.        } else if (BaseS.length<2) {
  126.            S = BaseS+"1";
  127.        } else {
  128.            S = "Ninguna";
  129.        }
  130.    }
  131.    trace ("El resultado es "+S);
  132.    NewS_ = "S"+S;
  133.    NextBestChanceOfWin = eval(NewS_+"BestChanceOfWin");
  134.    if (NextBestChanceOfWin>BestChanceOfWin) {
  135.        trace ("La NewS da más chance de ganar, se sustituyen datos sobre qué hacer en la investigada y por qué");
  136.        BestAction = Action;
  137.        BestChanceOfWin = NextBestChanceOfWin;
  138.    }
  139.    // Se agregan datos de la NewS:
  140.    Wins = Wins+eval(NewS_+"Wins");
  141.    Loses = Loses+eval(NewS_+"Loses");
  142.    Action++;
  143. } while (Action<4);
  144. trace ("No hay más acciones posibles, anotando datos");
  145. // Guardar datos descubiertos de la situación:
  146. set ("S"+BaseS+"BestAction", BestAction);
  147. // Usando BestAction:
  148. set ("S"+BaseS+"BestChanceOfWin", BestChanceOfWin);
  149. // Considerando todas las acciones:
  150. set ("S"+BaseS+"Wins", Wins);
  151. set ("S"+BaseS+"Loses", Loses);
  152. set ("S"+BaseS+"ChanceOfWin", Wins*100/(Wins+Loses));
  153.  
Por ejemplo los ifs ¿es posible reducir la cantidad necesaria? ¿cómo?


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines