porketero

Ensaïmada numérica - www.maduranma.com

Nov 27th, 2016
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.77 KB | None | 0 0
  1. <?php
  2. /* Hecho por Martín Durán - www.maduranma.com */
  3.  
  4. echo "Buscando soluciones...\n";
  5. $intentos = 0;
  6. while(true)
  7. {
  8. // Todos los números a 0 (para tener algo, si no ya se borrará)
  9. for($d = 1; $d <= 100; $d++)
  10.     $r[$d] = 0;
  11.  
  12. // ¿Dónde ponemos el 1?
  13. $intentos++;
  14. $rs = rand(1,100);
  15. $r[$rs] = 1;
  16. $l = $rs; // Definimos que la última posición es dónde está el uno, hasta un futuro muy cercano
  17.  
  18. $can = true; // Para que el while continue
  19.  
  20. while($can)
  21. {
  22.     // Obtenemos el número de posición horizontal
  23.     if(strlen($l) > 1)
  24.         $h = (substr($l, -1) == 0) ? 10 : substr($l, -1);
  25.     else
  26.         $h = $l;
  27.        
  28.     // Obtenemos el número según el vertical
  29.     if(strlen($l) > 1)
  30.         if($l == 100)
  31.             $v = 10;
  32.         else
  33.             $v = ($h == 10) ? substr($l, 0, 1) : substr($l, 0, 1) + 1;
  34.     else
  35.         $v = 1;
  36.        
  37.     // Ponemos que todos los valores del array $m sean true, para comprobarlos luego
  38.     for($c = 1; $c <= 8; $c++)
  39.         $m[$c] = 1;
  40.        
  41.     // --- Movimientos horizontales ---
  42.     if($h == 8 || $h == 9 || $h == 10 || (($l + 3 > 100) ? true : (($r[$l + 3] != 0) ? true : false)))
  43.         $m[1] = 0;
  44.        
  45.     if($h == 1 || $h == 2 || $h == 3 || (($l - 3 < 1) ? true : (($r[$l - 3] != 0) ? true : false)))
  46.         $m[5] = 0;
  47.        
  48.     // --- Movimientos verticales ---
  49.     if($v == 8 || $v == 9 || $v == 10 || (($l + 30 > 100) ? true : (($r[$l + 30] != 0) ? true : false)))
  50.         $m[3] = 0;
  51.            
  52.     if($v == 1 || $v == 2 || $v == 3 || (($l - 30 < 1) ? true : (($r[$l - 30] != 0) ? true : false)))
  53.         $m[7] = 0;
  54.            
  55.     // --- Movimiento arriba derecha ---
  56.     if($h == 9 || $h == 10 || $v == 1 || $v == 2 || (($l - 18 < 1) ? true : (($r[$l - 18] != 0) ? true : false)))
  57.         $m[8] = 0;
  58.            
  59.     // --- Movimiento arriba izquierda ---
  60.     if($h == 1 || $h == 2 || $v == 1 || $v == 2 || (($l - 22 < 1) ? true : (($r[$l - 22] != 0) ? true : false)))
  61.         $m[6] = 0;
  62.        
  63.     // --- Movimiento abajo derecha ---
  64.     if($h == 9 || $h == 10 || $v == 9 || $v == 10 || (($l + 22 > 100) ? true : (($r[$l + 22] != 0) ? true : false)))
  65.         $m[2] = 0;
  66.        
  67.     // --- Movimiento abajo izquierda ---
  68.     if($h == 1 || $h == 2 || $v == 9 || $v == 10 || (($l + 18 > 100) ? true : (($r[$l + 18] != 0) ? true : false)))
  69.         $m[4] = 0;
  70.        
  71.     $cm = null;
  72.     $cm = array();
  73.     foreach($m as $ia => $ib)
  74.         if($ib == 1)
  75.             $cm = array_merge($cm, array($ia));
  76.        
  77.     // Comprobamos que han salido movimientos
  78.     if(($cm != null) ? count($cm) >= 1 : false)
  79.         $fm = array_rand($cm); // Movimiento elegido
  80.     else
  81.         $can = false; // Aquí paramos
  82.        
  83.     if($can)
  84.         foreach($cm as $ba => $bb)
  85.             if($ba == $fm)
  86.                 $fm = $bb;
  87.        
  88.     // Nos movemos (si podemos)
  89.     if($can)
  90.         switch($fm)
  91.         {
  92.             case 1:
  93.                 $nl = ($l) + 3;
  94.                 $r[$nl] = $r[$l] + 1;
  95.                 $l = $nl;
  96.                 break;
  97.                    
  98.             case 2:
  99.                 $nl = ($l) + 22;
  100.                 $r[$nl] = $r[$l] + 1;
  101.                 $l = $nl;
  102.                 break;
  103.                    
  104.             case 3:
  105.                 $nl = ($l) + 30;
  106.                 $r[$nl] = $r[$l] + 1;
  107.                 $l = $nl;
  108.                 break;
  109.                    
  110.             case 4:
  111.                 $nl = ($l) + 18;
  112.                 $r[$nl] = $r[$l] + 1;
  113.                 $l = $nl;
  114.                 break;
  115.                    
  116.             case 5:
  117.                 $nl = ($l) - 3;
  118.                 $r[$nl] = $r[$l] + 1;
  119.                 $l = $nl;
  120.                 break;
  121.                    
  122.             case 6:
  123.                 $nl = ($l) - 22;
  124.                 $r[$nl] = $r[$l] + 1;
  125.                 $l = $nl;
  126.                 break;
  127.                    
  128.             case 7:
  129.                 $nl = ($l) - 30;
  130.                 $r[$nl] = $r[$l] + 1;
  131.                 $l = $nl;
  132.                 break;
  133.                    
  134.             case 8:
  135.                 $nl = ($l) - 18;
  136.                 $r[$nl] = $r[$l] + 1;
  137.                 $l = $nl;
  138.                 break;
  139.  
  140.             default:
  141.                 echo '<script>alert(\'error\');</script>';
  142.                 $can = false;
  143.                 break;
  144.         }
  145.     }
  146.  
  147.     if($r[$l]  == 100)
  148.     {
  149.         $nombre_fichero = 'soluciones/ultima.txt';
  150.         $gestor = fopen($nombre_fichero, 'r');
  151.         $contenido = fread($gestor, 11);
  152.         fclose($gestor);
  153.         $contenido = $contenido + 1;
  154.         $fp = fopen('soluciones/ultima.txt', 'w');
  155.         fwrite($fp, $contenido);
  156.         fclose($fp);
  157.            
  158.         $d = '';
  159.         $d .= '<!DOCTYPE html>
  160.     <head>
  161.         <title>Soluci&oacute;n ' . $contenido . ' del circuito Hamiltoniano - Ensaimada num&eacute;rica</title>
  162.     </head>
  163.     <body style="margin:3 0;">
  164.         <center>
  165.             <table border="1" style="font-size: 57pt;text-align: center; border: 2px solid black;" cellpadding="2" cellspacing="0">';
  166.         for($a = 1; $a <= 10; $a++)
  167.         {
  168.             $d .= "\n\t\t\t\t<tr>";
  169.             for($b = 1; $b <= 10; $b++)
  170.             {
  171.                 $d .= "\n\t\t\t\t\t<td width=\"90\" height=\"75\" style=\"height: 89px; text-align: center; border: 2px solid black;\" >";
  172.                 $d .= ($r[(($a-1)*10)+$b] == 0) ? "\n\t\t\t\t\t\t&nbsp;" : ("\n\t\t\t\t\t\t" . $r[(($a-1)*10)+$b]);
  173.                 $d .= "\n\t\t\t\t\t</td>";
  174.             }
  175.             $d .= "\n\t\t\t\t</tr>";
  176.         }
  177.         $d .= "\n\t\t\t</table>";
  178.         echo "Sol. $contenido encontrada y guardada. Intentos: $intentos";
  179.                 $intentos = 0;
  180.         echo "\nBuscando soluciones...\n";
  181.         $fp = fopen('soluciones/' . $contenido . '.html', 'w');
  182.         fwrite($fp, $d);
  183.         fclose($fp);
  184.     }
  185. }
  186. ?>
Add Comment
Please, Sign In to add comment