Foros del Web » Programando para Internet » PHP »

[-CONCURSO-] PHP Maraton script #1 - Desafios

Estas en el tema de [-CONCURSO-] PHP Maraton script #1 - Desafios en el foro de PHP en Foros del Web. NIVEL 1 Este primer nivel es para calentamiento, la dificultad de estos desafíos es la mínima de la maratón. ¡ En marcha ! A.- En ...
  #1 (permalink)  
Antiguo 14/06/2015, 10:27
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Pregunta [-CONCURSO-] PHP Maraton script #1 - Desafios



NIVEL 1


Este primer nivel es para calentamiento, la dificultad de estos desafíos es la mínima de la maratón. ¡En marcha!

A.- En este desafió, se deberá mostrar la frase "Hola mundo"... ¡Pero con algunas restricciones!
- Script: php_maraton_v1_level_1A.php

- El script no puede decir "Hola mundo" de forma explicita en ningún lado, es decir, no se pueden hacer cosas como:
Código PHP:
Ver original
  1. <?php
  2.         $saludo = "Hola mundo";
  3.         $saludo = implode(" ", ["Hola", "mundo"]);
  4.         // Etc..
Dicho de otra forma, al mirar el código fuente no se deben poder leer directamente ninguna de las dos palabras, ya sea juntas o separadas, por lo que hay que pensar una forma de ocultarlas.

CONDICIÓN DE MERITO:
- No se pueden utilizar ninguna de las funciones de manejo de string que figuran en esta lista del manual.

B.- En este desafió, la tarea a realizar sera identificar y saludar al visitante... ¡Pero con algunas restricciones!
- Script: php_maraton_v1_level_1B.php
- El script deberá ser capaz de realizar una interaccion en 3 pasos con el usuario, para ello agregue al inicio de su script la definicion del siguiente array que contiene el codigo html de cada pantalla:
Código PHP:
Ver original
  1. <?php
  2.         $pantallas = [
  3.             '<!DOCTYPE html>
  4.                 <html>
  5.                     <head>
  6.                         <title>PHP MARATON SCRIPT V1 - NIVEL 1 B</title>
  7.                     </head>
  8.                     <body>
  9.                         <form action="php_maraton_v1_level_1B.php">
  10.                             <input type="text" name="nombre">
  11.                             <input type="submit" value="IDENTIFICARME">
  12.                         </form>
  13.                     </body>
  14.                 </html>',
  15.             '<!DOCTYPE html>
  16.                 <html>
  17.                     <head>
  18.                         <title>PHP MARATON SCRIPT V1 - NIVEL 1 B</title>
  19.                         <meta http-equiv="Refresh" content="1;URL=php_maraton_v1_level_1B.php">
  20.                     </head>
  21.                     <body>
  22.                         ¡Has sido identificado correctamente! <a href="php_maraton_v1_level_1B.php">Hay click aqui si el navegador no te redirige automaticamente</a>
  23.                     </body>
  24.                 </html>',
  25.             '<!DOCTYPE html>
  26.                 <html>
  27.                     <head>
  28.                         <title>PHP MARATON SCRIPT V1 - NIVEL 1 B</title>
  29.                     </head>
  30.                     <body>
  31.                         ¡Hola -NOMBRE-! ¡Te tengo identificado!
  32.                     </body>
  33.                 </html>'
  34.         ];

1) Si el usuario esta cargando el script "php_maraton_v1_level_1B.php" y no esta identificado, mostrar la pantalla $pantallas[0] para solicitar un nombre.

2) Si el usuario se acaba de identificar (osea que acaba de enviar el formulario del paso 1, debe mostrar la pantalla $pantallas[1] que lo llevara a su pagina de bienvenida.

3) Cuando el usuario es redireccionado a su pagina de bienvenida luego de identificarse, deberá ver un saludo cordial, puesto ya se ha identificado previamente, dicho saludo es la pantalla $pantallas[2] pero reemplazando a "-NOMBRE-" por el nombre que ingreso en el paso 1.

CONDICIÓN DE MERITO:
No utilizar para resolver a este desafió ninguna de las siguientes opciones:
  • Sesiones ($_SESSION, session_*, etc).
  • Cookies.
  • Archivos (file_put_contents, file_get_contents, fopen, etc).
  • Bases de datos.
  • Memcache.

IMPORTANTE:
Para simplificar la lectura del código a la hora de publicar la solución de este desafió, no publique el array con las definiciones de las pantallas, puesto que ya esta en este mensaje y es el mismo para todos los concursantes.

NIVEL 2


Este es el segundo nivel de la maratón, ambos desafíos propuestos están relacionados con un juego de poker. ¡En marcha!

NOTA: Para que no halla disputas, la siguiente tabla muestra las combinaciones en orden ganador de un juego de poker y las probabilidades de obtener cada combinación, los desafios se evaluaran en base a esta tabla:



Para ambos desafíos se usara la siguiente clase:
Código PHP:
Ver original
  1. <?php
  2.   class Poker {
  3.      
  4.       public function jugada($cartas) {
  5.           /*...*/
  6.           return /*... Ej: "Escalera real" ...*/;
  7.       }
  8.      
  9.       public function partida($cartas1, $cartas2) {
  10.           /*...*/
  11.           return /*... Ej: -1, 0, 1 ...*/;
  12.       }
  13.      
  14.       public function probabilidades($cartas) {
  15.           /*...*/
  16.           return [ "win" : /*...*/, "lost" : /*...*/, "tied" : /*...*/ ];
  17.       }
  18.      
  19.       public function apuesta($cartas, $maximo = 100) {
  20.           /*...*/
  21.           return /*... Ej: 50 ...*/;
  22.       }          
  23.      
  24.   }

Considere ademas, que en todos los casos $cartas es un array de 5 string de dos caracteres cada uno, donde el primer carácter indica el numero de la carta:
Ej: 1,2,3,4,5,6,7,8,9,0,J,Q,K
NOTA: El 0 representa al 10
y el segundo el color:
Ej: P,C,D,T
las letras pueden estar en mayusculas o minusculas o ambas ¡Ojo con eso!.

Ej: $cartas = ["1P", "2T", "JC", "KD", "5D"];


A.- En este desafió, se deberá programar el método jugada($cartas), que deberá retornar el nombre de la jugada (primer columna de la tabla) de acuerdo a la mano obtenida.
No esta permitido hacer uso de los métodos del punto B.

CONDICIÓN DE MERITO:
Desarrollar el método partida($cartas1, $cartas2) que determine quien es el ganador de una partida, en caso de empate debe retornar 0, si la jugada de $cartas1 es mejor que la de $cartas2 debe retornar 1, y si la jugada de $cartas2 es mejor que la de $cartas1 debe retornar -1.
Recuerde que en caso de que la jugada de ambos sea "Carta alta" ganara el que tenga la carta mas alta.
Esta permitido llamar al método creado previamente.


B.- En este desafió, se deberá programar el método probabilidades($cartas), que deberá retornar la probabilidad de ganar, perder y empatar que tiene una mano de cartas determinada basándose en los datos de la ultima columna del cuadro.
Esta permitido llamar al método creado en el punto A.
NOTA MATEMÁTICA: Tenga en cuenta que la suma de estas 3 probabilidades debe ser 1 si o si.

CONDICIÓN DE MERITO:
Desarrollar el método apuesta($cartas, $maximo = 100) que determine en base a las probabilidades de ganar, perder y empatar de la jugada, cuando deberia ser la apuesta del jugador en términos económicos, teniendo en cuenta que la mesa solo permite hasta un tope de apuestas, este tope esta definido en el parámetro $maximo, por lo tanto el mono a sugerir nunca puede exceder ese techo.
Esta permitido llamar al método creado previamente.
Para realizar el calculo deben aplicarse las siguientes consideraciones:
- Se sugiere apostar una parte directamente proporcional a la probabilidad de ganar.
- Se sugiere apostar la mitad de la parte directamente proporcional a probabilidad de empatar.
- Se sugiere no apostar nada de la parte directamente proporcional a la probabilidad de perder.
Cita:
Ej:
$maximo = 100
$prob_ganar = 0.5
$prob_empatar = 0.4
$prob_perder = 0.1
$apuesta_sugerida = 70
CONDICIÓN DE MERITO EXTRA:
En el metodo probabilidades($cartas) debe considerar que si la jugada es carta alta, la probabilidad varia segun el valor de la carta mas alta.

IMPORTANTE: Recuerde publicar las soluciones en 2 mensajes diferentes, si bien pertenecen a la misma clase, se evalúan por separado de forma independiente.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 29/06/2015 a las 15:53 Razón: Nivel 2
  #2 (permalink)  
Antiguo 14/06/2015, 17:05
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 - A

Código PHP:
Ver original
  1. <?php
  2. abstract class Char
  3. {
  4.     private $charMap;
  5.     private $map;
  6.  
  7.     public function __construct($map)
  8.     {
  9.         $this->map = $map;
  10.         $this->charMap = array(
  11.             0 => ' ',
  12.             1 => '_',
  13.             2 => '|',
  14.             3 => "'",
  15.             4 => '"',
  16.             5 => '/',
  17.             6 => '\\',
  18.             7 => 'U',
  19.             8 => '(',
  20.             9 => ')',
  21.             10 => '>',
  22.             11 => '<',
  23.             12 => '.',
  24.             13 => '-',
  25.             14 => ','
  26.         );
  27.     }
  28.  
  29.     final protected function getChar($index)
  30.     {
  31.         return $this->charMap[$index];
  32.     }
  33.  
  34.     final public function getTotalLines()
  35.     {
  36.         return count($this->map);
  37.     }
  38.  
  39.     final public function getLine($index)
  40.     {
  41.         $str = '';
  42.         foreach ($this->map[$index] as $character) {
  43.             $str .= $this->getChar($character);
  44.         }
  45.         return $str;
  46.     }
  47. }
  48.  
  49. class CharSpace extends Char
  50. {
  51.     public function __construct()
  52.     {
  53.         parent::__construct(array(
  54.             array( 0, 0, 0, 0, 0, 0, 0),
  55.             array( 0, 0, 0, 0, 0, 0, 0),
  56.             array( 0, 0, 0, 0, 0, 0, 0),
  57.             array( 0, 0, 0, 0, 0, 0, 0),
  58.             array( 0, 0, 0, 0, 0, 0, 0),
  59.             array( 0, 0, 0, 0, 0, 0, 0),
  60.             array( 0, 0, 0, 0, 0, 0, 0)
  61.         ));
  62.     }
  63. }
  64.  
  65. class CharH extends Char
  66. {
  67.     public function __construct()
  68.     {
  69.         parent::__construct(array(
  70.             array( 0, 0, 1, 0, 0, 0, 1, 0, 0),
  71.             array( 0, 2, 3, 2, 0, 2, 3, 2, 0),
  72.             array( 5, 2, 0, 2, 1, 2, 0, 2, 6),
  73.             array( 7, 2, 0, 0, 1, 0, 0, 2, 7),
  74.             array( 0, 2, 1, 2, 0, 2, 1, 2, 0),
  75.             array( 0, 5, 5, 0, 0, 0, 6, 6, 0),
  76.             array( 8, 1, 4, 9, 0, 8, 4, 1, 9)
  77.         ));
  78.     }
  79. }
  80.  
  81. class CharO extends Char
  82. {
  83.     public function __construct()
  84.     {
  85.         parent::__construct(array(
  86.             array( 0, 0, 0, 7, 0, 0, 1, 1, 1, 0, 7),
  87.             array( 0, 0, 0, 0, 6, 5, 4, 0, 0, 6, 5),
  88.             array( 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2),
  89.             array(12,13,14, 1, 2, 0, 2, 1, 2, 0, 2),
  90.             array( 0, 6, 1, 9,13, 6, 1, 1, 1, 5, 0),
  91.             array( 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0),
  92.             array( 0, 0, 0, 0, 0, 8, 4, 1, 9, 0, 0)
  93.         ));
  94.     }
  95. }
  96.  
  97. class CharL extends Char
  98. {
  99.     public function __construct()
  100.     {
  101.         parent::__construct(array(
  102.             array( 0, 0, 0, 1, 0, 0, 0, 0, 0),
  103.             array( 0, 0, 2, 4, 2, 0, 0, 0, 0),
  104.             array( 7, 0, 2, 0, 2, 0, 7, 0, 0),
  105.             array( 0, 6, 2, 0, 2, 5, 1, 1, 0),
  106.             array( 0, 0, 2, 1, 1, 1, 1, 1, 2),
  107.             array( 0, 0, 5, 5, 0, 0, 6, 6, 0),
  108.             array( 0, 8, 1, 4, 9, 8, 4, 1, 9)
  109.         ));
  110.     }
  111. }
  112.  
  113. class CharA extends Char
  114. {
  115.     public function __construct()
  116.     {
  117.         parent::__construct(array(
  118.             array( 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
  119.             array( 7, 0, 0, 5, 4, 6, 0, 0, 7, 0),
  120.             array( 0, 6, 5, 0, 1, 0, 6, 5, 0, 0),
  121.             array( 0, 5, 0, 1, 1, 1, 0, 6, 0, 0),
  122.             array( 5, 1, 5, 0, 0, 0, 6, 1, 6, 0),
  123.             array( 0, 6, 6, 0, 0, 0, 0, 6, 6, 0),
  124.             array( 8, 4, 1, 9, 0, 0, 8, 4, 1, 9)
  125.         ));
  126.     }
  127. }
  128.  
  129. class CharM extends Char
  130. {
  131.     public function __construct()
  132.     {
  133.         parent::__construct(array(
  134.             array( 0, 0, 1, 1, 0, 0, 1, 1, 0, 0),
  135.             array( 7, 2, 3, 0, 6, 5, 0, 3, 2, 7),
  136.             array( 6, 2, 0, 2, 6, 5, 2, 0, 2, 5),
  137.             array( 0, 2, 0, 2, 0, 0, 2, 0, 2, 0),
  138.             array( 0, 2, 1, 2, 0, 0, 2, 2, 2, 0),
  139.             array( 0,11,11, 0, 0, 0, 0,10,10, 0),
  140.             array( 0, 8,12, 5, 0, 0, 6,12, 9, 0)
  141.         ));
  142.     }
  143. }
  144.  
  145. class CharU extends Char
  146. {
  147.     public function __construct()
  148.     {
  149.         parent::__construct(array(
  150.             array( 0, 0, 0, 1, 0, 0, 0, 1, 0),
  151.             array( 7, 0, 2, 4, 2, 7, 2, 0, 2),
  152.             array( 0, 6, 2, 0, 2, 6, 2, 0, 2),
  153.             array( 0, 0, 2, 0, 2, 1, 2, 0, 2),
  154.             array( 0,11,11, 6, 1, 1, 1, 5, 0),
  155.             array( 0, 8, 1, 1, 9, 2, 2, 0, 0),
  156.             array( 0, 0, 0, 0, 8, 1, 1, 9, 0)
  157.         ));
  158.     }
  159. }
  160.  
  161. class CharN extends Char
  162. {
  163.     public function __construct()
  164.     {
  165.         parent::__construct(array(
  166.             array( 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0),
  167.             array( 0, 2, 0, 6, 0, 2, 4, 2, 0, 0, 0),
  168.             array(11, 2, 0, 0, 6, 2, 0, 2,10, 0, 0),
  169.             array( 7, 2, 0, 2, 6, 0, 0, 2, 7, 0, 0),
  170.             array( 0, 2, 1, 2, 0, 6, 1, 2, 0, 0, 0),
  171.             array( 0, 2, 2, 0, 0, 0, 6, 6,14,13,12),
  172.             array( 0, 8, 1, 4, 9, 0, 0, 8, 1, 5, 0)
  173.         ));
  174.     }
  175. }
  176.  
  177. class CharD extends Char
  178. {
  179.     public function __construct()
  180.     {
  181.         parent::__construct(array(
  182.             array( 0, 0, 1, 1, 1, 1, 0, 0, 0),
  183.             array( 0, 2, 0, 0, 1, 4, 6, 0, 0),
  184.             array( 5, 2, 0, 2, 0, 2, 0, 2, 0),
  185.             array( 7, 2, 0, 2, 1, 2, 0, 2, 6),
  186.             array( 0, 2, 1, 1, 1, 1, 5, 0, 7),
  187.             array( 0, 0, 2, 2, 2, 1, 0, 0, 0),
  188.             array( 0, 8, 1, 1, 9, 1, 9, 0, 0)
  189.         ));
  190.     }
  191. }
  192.  
  193. class CharCollection
  194. {
  195.     private $list;
  196.  
  197.     public function __construct()
  198.     {
  199.         $this->list = array();
  200.     }
  201.  
  202.     public function add(Char $character)
  203.     {
  204.         $this->list[] = $character;
  205.     }
  206.  
  207.     public function toArrayString()
  208.     {
  209.         if (empty($this->list)) {
  210.             return array();
  211.         }
  212.         $strArr = array();
  213.         for ($i = 0, $n = $this->list[0]->getTotalLines(); $i < $n; $i++) {
  214.             $str = '';
  215.             foreach ($this->list as $character) {
  216.                 $str .= $character->getLine($i) . '  ';
  217.             }
  218.             $strArr[] = $str;
  219.         }
  220.         return $strArr;
  221.     }
  222.  
  223.     public function toImage()
  224.     {
  225.         $arr = $this->toArrayString();
  226.         $w = 1050;
  227.         $h = 140;
  228.         $img = imagecreatetruecolor($w, $h);
  229.         $white = imagecolorallocate($img, 255, 255, 255);
  230.         $black = imagecolorallocate($img, 0, 0, 0);
  231.         imagefilledrectangle($img, 0, 0, $w, $h, $white);
  232.         foreach ($arr as $i => $line) {
  233.             imagestring($img, 5, 10, $i * 15, $line, $black);
  234.         }
  235.         return $img;
  236.     }
  237. }
  238.  
  239. $hm = new CharCollection();
  240. $hm->add(new CharH());
  241. $hm->add(new CharO());
  242. $hm->add(new CharL());
  243. $hm->add(new CharA());
  244. $hm->add(new CharSpace());
  245. $hm->add(new CharM());
  246. $hm->add(new CharU());
  247. $hm->add(new CharN());
  248. $hm->add(new CharD());
  249. $hm->add(new CharO());
  250.  
  251. $img = $hm->toImage();
  252.  
  253. header('Content-Type: image/png');
  254. imagepng($img);

http://www.jlabstudio.com/webgl/ejem...dw/nivel1a.php
  #3 (permalink)  
Antiguo 14/06/2015, 17:28
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 - B

Código PHP:
Ver original
  1. <?php
  2. $pantallas = [....];
  3.  
  4. $showView = 0;
  5. if (array_key_exists('nombre', $_GET) && !empty($_GET['nombre'])) {
  6.     $showView = 1;
  7.     $_SESSION['name'] = $_GET['nombre'];
  8. } elseif (array_key_exists('name', $_SESSION)) {
  9.     $showView = 2;
  10.     $pantallas[$showView] = str_replace('-NOMBRE-', $_SESSION['name'], $pantallas[$showView]);
  11. }
  12.  
  13. echo $pantallas[$showView];
  #4 (permalink)  
Antiguo 15/06/2015, 03:53
Avatar de Apolo_13  
Fecha de Ingreso: mayo-2015
Mensajes: 40
Antigüedad: 9 años, 6 meses
Puntos: 4
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 - A

Código PHP:
Ver original
  1. <?php
  2.     /*
  3.     * @script: php_maraton_v1_level_1A.php
  4.     * @author: Apolo_13
  5.     * @date: 14/06/2015
  6.     */
  7.     $letrasMin = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
  8.     $letrasMay = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
  9.    
  10.     echo $letrasMay[7].$letrasMin[14].$letrasMin[11].$letrasMin[0]."
  11.     ".$letrasMin[12].$letrasMin[20].$letrasMin[13].$letrasMin[3].$letrasMin[14];
  12.  
  13. ?>
__________________
¿Buscas respuestas? eemmmmm.....¡Abstrae tu mente!
  #5 (permalink)  
Antiguo 15/06/2015, 03:55
Avatar de Apolo_13  
Fecha de Ingreso: mayo-2015
Mensajes: 40
Antigüedad: 9 años, 6 meses
Puntos: 4
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 - B

Código PHP:
Ver original
  1. <?php
  2. /*
  3. * @script: php_maraton_v1_level_1B.php
  4. * @author: Apolo_13
  5. * @date: 15/05/2015
  6. */
  7.  
  8. //aqui copiar el array de las pantallas.
  9.  
  10.     if(!isset($_GET['nombre'])) {
  11.         if(isset($_GET['name'])) {
  12.             $pantallas[2] = str_replace('-NOMBRE-',$_GET['name'],$pantallas[2]);
  13.             echo utf8_encode($pantallas[2]);
  14.         } else {
  15.             echo $pantallas[0];
  16.         }
  17.     } else {
  18.         $pantallas[1] = str_replace('php_maraton_v1_level_1B.php','php_maraton_v1_level_1B.php?name='.$_GET["nombre"],$pantallas[1]);
  19.         echo utf8_encode($pantallas[1]);
  20.     }
  21. ?>
__________________
¿Buscas respuestas? eemmmmm.....¡Abstrae tu mente!
  #6 (permalink)  
Antiguo 17/06/2015, 21:26
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 A , Gané!

Código PHP:
Ver original
  1. echo base64_decode('SG9sYSBtdW5kbw==');
  #7 (permalink)  
Antiguo 17/06/2015, 21:50
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

Nivel 1 A:

Código PHP:
Ver original
  1. echo strrev('odnum aloH');

Técnicamente, las palabras no se muestran tal cual las leeríamos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 17/06/2015, 22:46
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 1 - B
Código PHP:
Ver original
  1. if (isset($_GET['nombre']) && $_GET['nombre'] != ''){
  2.   echo str_replace(".php",".php?r=".$_GET['nombre'],$pantallas[1]);
  3. }else if (isset($_GET['r']) && $_GET['r'] != ''){
  4.   echo str_replace("-NOMBRE-", $_GET['r'], $pantallas[2]);
  5. }else{
  6.   echo $pantallas[0];
  7. }
  #9 (permalink)  
Antiguo 18/06/2015, 00:54
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

Nivel 1 B:

Código PHP:
Ver original
  1. echo !isset($_GET['nombre']) ?
  2.         (isset($_GET['nuevoNombre']) ?
  3.             str_replace('-NOMBRE-', $_GET['nuevoNombre'], $pantallas[2]) :
  4.             $pantallas[0]) :
  5.         (!isset($_GET['nuevoNombre']) ? str_replace('.php', ".php?nuevoNombre={$_GET['nombre']}", $pantallas[1]) : $pantallas[0]);
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #10 (permalink)  
Antiguo 26/06/2015, 05:46
Avatar de Apolo_13  
Fecha de Ingreso: mayo-2015
Mensajes: 40
Antigüedad: 9 años, 6 meses
Puntos: 4
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 2 - A (mensaje 1)

Este Script es el manejador, el que lanza todo. Este es el que se puede tocar para hacer las pruebas.

Código PHP:

<?php

    
require_once 'Baraja.php';
    require_once 
'Carta.php';
    require_once 
'Algoritmo.php';
    require_once 
'ManoJugador.php';
    require_once 
'Poker.php';

    
header('Content-Type: text/html; charset=UTF-8');


    
/* * *************************
     * MODO REAL (CARTAS DE MANERA ALEATORIA (2 PLAYERS))
     * ************************* */
    
$baraja = new Baraja();
    
$mazo $baraja->getBaraja();

    
$poker1 = new Poker();

    
$player1 = array($mazo[0], $mazo[2], $mazo[4], $mazo[6], $mazo[8]);
    
$player2 = array($mazo[1], $mazo[3], $mazo[5], $mazo[7], $mazo[9]);

    
$jugadaPlayer1 $poker1->jugada($player1);
    print 
"<br>MODO REAL(player 1) --> {$jugadaPlayer1}";
    
$ganador $poker1->partida($player1$player2);
    print 
"<br>MODO REAL(ganador): {$ganador}";

    
    print 
"<br><br>--------------------------<br><br>";


    
/* * *************************
     * MODO DEBUG (CARTAS ELEGIDAS POR EL USER (2 PLAYERS))
     * ************************* */
    
$poker2 = new Poker();

    
$barajaDebug1 = array(new Carta("4""c"), new Carta("4""p"), new Carta("3""c"), new Carta("3""c"), new Carta("a""c"));
    
$barajaDebug2 = array(new Carta("4""p"), new Carta("4""c"), new Carta("3""p"), new Carta("3""p"), new Carta("5""p"));

    
$jugadaDebug $poker2->jugada($barajaDebug1);
    print 
"MODO DEBUG(player 1) --> {$jugadaDebug}";
    
$ganadorDebug $poker2->partida($barajaDebug1$barajaDebug2);
    print 
"<br>MODO DEBUG(ganador player1): {$ganadorDebug}";
?>

La clase Poker:

Código PHP:
<?php

class Poker {

    public function 
Poker() {
        
    }

    public function 
jugada($cartas) {
        
$mano = new ManoJugador($cartas);
        if (
$mano->getBoolEscaleraReal()) {
            
$result "Escalera real";
        } elseif (
$mano->getBoolEscaleraColor()) {
            
$result "Escalera de color";
        } elseif (
$mano->getBoolPoker()) {
            
$result "Póker";
        } elseif (
$mano->getBoolFull()) {
            
$result "Full";
        } elseif (
$mano->getBoolColor()) {
            
$result "Color";
        } elseif (
$mano->getBoolEscalera()) {
            
$result "Escalera";
        } elseif (
$mano->getBoolTrio()) {
            
$result "Trío";
        } elseif (
$mano->getBoolDoblesParejas()) {
            
$result "Dobles parejas";
        } elseif (
$mano->getBoolPareja()) {
            
$result "Pareja";
        } else {
            
$result "Carta alta";
        }

        return 
$result;
    }

    public function 
partida($cartas1$cartas2) {
        
$ordenJugadas = array("Carta alta" => 0"Pareja" => 1"Dobles parejas" => 2"Trío" => 3"Escalera" => 4,
            
"Color" => 5"Full" => 6"Póker" => 7"Escalera de color" => 8"Escalera real" => 9);
        
$manoPlayer1 = new ManoJugador($cartas1);
        
$manoPlayer2 = new ManoJugador($cartas2);



        if (
$this->jugada($cartas1) == $this->jugada($cartas2)) {
            
//si es la misma jugada ver quien tiene la carta mas alta
            
if ($this->jugada($cartas1) != "Escalera real") {
                switch (
$this->jugada($cartas1)) {
                    case 
"Escalera de color":
                        
$player1 $manoPlayer1->getEscaleraColor();
                        
$player2 $manoPlayer2->getEscaleraColor();
                        
$key "max";
                        break;
                    case 
"Póker":
                        
$player1 $manoPlayer1->getPoker();
                        
$player2 $manoPlayer2->getPoker();
                        
$key "val";
                        break;
                    case 
"Full":
                        
$player1 $manoPlayer1->getFull();
                        
$player2 $manoPlayer2->getFull();
                        
$key "val";
                        break;
                    case 
"Color":
                        
$player1 $manoPlayer1->getColor();
                        
$player2 $manoPlayer2->getColor();
                        
$key "val";
                        break;
                    case 
"Escalera":
                        
$player1 $manoPlayer1->getEscalera();
                        
$player2 $manoPlayer2->getEscalera();
                        
$key "max";
                        break;
                    case 
"Trío":
                        
$player1 $manoPlayer1->getTrio();
                        
$player2 $manoPlayer2->getTrio();
                        
$key "val";
                        break;
                    case 
"Dobles parejas":
                        
$player1 $manoPlayer1->getParejasODobles();
                        
$player2 $manoPlayer2->getParejasODobles();
                        
$key "val";
                        break;
                    case 
"Pareja":
                        
$player1 $manoPlayer1->getParejasODobles();
                        
$player2 $manoPlayer2->getParejasODobles();
                        
$key "val";
                        
$jugada "pareja";
                        break;
                    case 
"Carta alta":
                        
$player1 $manoPlayer1->getCartaAlta();
                        
$player2 $manoPlayer2->getCartaAlta();
                        
$key "val";
                        
$jugada "cartAlta";
                        break;
                    default:
                        return 
0;
                }

                if (!
is_array($player1[$key])) {
                    if (
$player1[$key] > $player2[$key]) {
                        return 
1;
                    } elseif (
$player1[$key] < $player2[$key]) {
                        return -
1;
                    } else {
                        if (isset(
$jugada) && $jugada == "pareja") {
                            
$max 3;
                            
$cont 0;
                            
$excp = array(array($player1[$key]), array($player2[$key]));
                            do {
                                
$alta1 $manoPlayer1->getCartaAlta($excp[0]);
                                
$alta2 $manoPlayer2->getCartaAlta($excp[1]);
                                
$excp[0][] = $alta1['val'];
                                
$excp[1][] = $alta2['val'];
                                
$cont += 1;
                            } while ((
$alta1 == $alta2) && ($cont != $max));
                            if (
$alta1 == $alta2) {
                                return 
0;
                            } elseif (
$alta1 $alta2) {
                                return 
1;
                            } else {
                                return -
1;
                            }
                        } elseif (isset(
$jugada) && $jugada == "cartAlta") {
                            
$max 5;
                            
$cont 1;
                            
$excp = array(array($player1[$key]), array($player2[$key]));
                            do {
                                
$alta1 $manoPlayer1->getCartaAlta($excp[0]);
                                
$alta2 $manoPlayer2->getCartaAlta($excp[1]);
                                
$excp[0][] = $alta1['val'];
                                
$excp[1][] = $alta2['val'];
                                
$cont += 1;
                            } while ((
$alta1 == $alta2) && ($cont != $max));
                            if (
$alta1 == $alta2) {
                                return 
0;
                            } elseif (
$alta1 $alta2) {
                                return 
1;
                            } else {
                                return -
1;
                            }
                        } else {
                            return 
0;
                        }
                    }
                } else {
                    
$play1 0;
                    
$play2 0;
                    if (
$player1[$key][0] > $player2[$key][0]) {
                        
$play1 += 1;
                    } elseif (
$player1[$key][0] < $player2[$key][0]) {
                        
$play2 += 1;
                    }
                    if (
$player1[$key][1] > $player2[$key][1]) {
                        
$play1 += 1;
                    } elseif (
$player1[$key][1] < $player2[$key][1]) {
                        
$play2 += 1;
                    }
                    if (
$play1 $play2) {
                        return 
1;
                    } elseif (
$play1 $play2) {
                        return -
1;
                    } else {
                        
$excp = array(array($player1[$key][0], $player1[$key][1]), array($player2[$key][0], $player2[$key][1]));
                        
$alta1 $manoPlayer1->getCartaAlta($excp[0]);
                        
$alta2 $manoPlayer2->getCartaAlta($excp[1]);
                        if (
$alta1 == $alta2) {
                            return 
0;
                        } elseif (
$alta1 $alta2) {
                            return 
1;
                        } else {
                            return -
1;
                        }
                    }
                }
            } else {
                return 
0;
            }
        } elseif (
$ordenJugadas[$this->jugada($cartas1)] > $ordenJugadas[$this->jugada($cartas2)]) {
            return 
1;
        } else {
            return -
1;
        }
    }

}

?>
__________________
¿Buscas respuestas? eemmmmm.....¡Abstrae tu mente!
  #11 (permalink)  
Antiguo 26/06/2015, 05:49
Avatar de Apolo_13  
Fecha de Ingreso: mayo-2015
Mensajes: 40
Antigüedad: 9 años, 6 meses
Puntos: 4
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 2 - A (mensaje 2)

La clase Baraja:

Código PHP:
<?php

class Baraja {

    private 
$baraja;
    private 
$palos;
    private 
$valores;

    public function 
Baraja() {
        
$this->baraja = array();
        
$this->palos = array("p""c""d""t");
        
$this->valores = array("2""3""4""5""6""7""8""9""10""j""q""k""a");
        
$this->llenarBaraja();
        
$this->barajarBaraja();
    }

    private function 
llenarBaraja() {
        foreach (
$this->palos as $palo) {
            for (
$i 0$i 13$i++) {
                
$this->baraja[] = new Carta($this->valores[$i], $palo);
            }
        }
    }

    private function 
barajarBaraja() {
        
shuffle($this->baraja);
    }

    public function 
getBaraja() {
        return 
$this->baraja;
    }

}

?>

La clase Carta:

Código PHP:
<?php

class Carta {

    private 
$valor;
    private 
$palo;

    public function 
Carta($val$pal) {
        
$this->valor $val;
        
$this->palo strtolower($pal);
    }

    public function 
getValor() {
        return 
$this->valor;
    }

    public function 
getPalo() {
        return 
$this->palo;
    }

}
?>

La clase ManoJugador:

Código PHP:
<?php

class ManoJugador {

    private 
$analizadorMano;
    private 
$cartasOrd;
    

    public function 
getBoolEscaleraReal() {
        
$aux $this->escaleraReal;
        return 
$aux['bool'];
    }

    public function 
getBoolEscaleraColor() {
        
$aux $this->escaleraColor;
        return 
$aux['bool'];
    }

    public function 
getBoolPoker() {
        
$aux $this->poker;
        return 
$aux['bool'];
    }

    public function 
getBoolFull() {
        
$aux $this->full;
        return 
$aux['bool'];
    }

    public function 
getBoolColor() {
        
$aux $this->color;
        return 
$aux['bool'];
    }

    public function 
getBoolEscalera() {
        
$aux $this->escalera;
        return 
$aux['bool'];
    }

    public function 
getBoolTrio() {
        
$aux $this->trio;
        return 
$aux['bool'];
    }

    public function 
getBoolDoblesParejas() {
        
$aux $this->parejasODobles;
        if (
$aux['modo'] == "dobles") {
            return 
$aux['bool'];
        } else {
            return 
false;
        }
    }

    public function 
getBoolPareja() {
        
$aux $this->parejasODobles;
        if (
$aux['modo'] == "normal") {
            return 
$aux['bool'];
        } else {
            return 
false;
        }
    }

    public function 
getBoolCartaAlta() {
        
$aux $this->cartaAlta;
        return 
$aux['bool'];
    }

    public function 
getEscaleraReal() {
        return 
$this->escaleraReal;
    }

    public function 
getEscaleraColor() {
        return 
$this->escaleraColor;
    }

    public function 
getPoker() {
        return 
$this->poker;
    }

    public function 
getFull() {
        return 
$this->full;
    }

    public function 
getColor() {
        return 
$this->color;
    }

    public function 
getEscalera() {
        return 
$this->escalera;
    }

    public function 
getTrio() {
        return 
$this->trio;
    }

    public function 
getParejasODobles() {
        return 
$this->parejasODobles;
    }

    public function 
getCartaAlta($excluir null) {
        if(
$excluir == null) {
            return 
$this->cartaAlta;
        } else {
            return  
$this->analizadorMano->cartaAlta($this->cartasOrd$excluir);
        }
    }
    

    public function 
ManoJugador($cartas) {
        
$this->analizadorMano = new Algoritmo();
        
$this->cartasOrd $this->analizadorMano->ordenarCartas($cartas);
        
$this->escaleraReal $this->analizadorMano->isEscaleraReal($this->cartasOrd);
        
$this->escaleraColor $this->analizadorMano->isEscaleraColor($this->cartasOrd);
        
$this->poker $this->analizadorMano->isPoker($this->cartasOrd);
        
$this->full $this->analizadorMano->isFull($this->cartasOrd);
        
$this->color $this->analizadorMano->isColor($this->cartasOrd);
        
$this->escalera $this->analizadorMano->isEscalera($this->cartasOrd);
        
$this->trio $this->analizadorMano->isTrio($this->cartasOrd);
        
$this->parejasODobles $this->analizadorMano->isParejaODoble($this->cartasOrd);
        
$this->cartaAlta $this->analizadorMano->cartaAlta($this->cartasOrd);
    }

}

?>
__________________
¿Buscas respuestas? eemmmmm.....¡Abstrae tu mente!
  #12 (permalink)  
Antiguo 26/06/2015, 05:51
Avatar de Apolo_13  
Fecha de Ingreso: mayo-2015
Mensajes: 40
Antigüedad: 9 años, 6 meses
Puntos: 4
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 2 - A (mensaje 3)

La clase Algoritmo:

Código PHP:
<?php

class Algoritmo {

    private 
$arrOrd;

    public function 
Algoritmo() {
        
$this->arrOrd = array("2" => 2"3" => 3"4" => 4"5" => 5"6" => 6"7" => 7"8" => 8"9" => 9"10" => 10"j" => 11"q" => 12"k" => 13"a" => 14);
    }

    public function 
isEscaleraReal($carts) {
        
$result = array();
        
$isEscaleraColor $this->isEscaleraColor($carts);

        if (
$isEscaleraColor['bool']) {
            
$result['color'] = $isEscaleraColor['color'];
            if (
$isEscaleraColor['min'] == 10 && $isEscaleraColor['max'] == 14) {
                
$result['bool'] = true;
            } else {
                
$result['bool'] = false;
            }
        } else {
            
$result['bool'] = false;
        }
        return 
$result;
    }

    public function 
isEscaleraColor($carts) {
        
$result = array();

        
$isEscalera $this->isEscalera($carts);
        
$isColor $this->isColor($carts);

        
$result['min'] = $isEscalera['min'];
        
$result['max'] = $isEscalera['max'];

        if (
$isEscalera['bool'] && $isColor['bool']) {
            
$result['color'] = $isColor['color'];
            
$result['bool'] = true;
        } else {
            
$result['bool'] = false;
        }
        return 
$result;
    }

    public function 
isPoker($carts) {
        
$result = array();
        
$cartsAgrupadas $this->agruparCartas($carts);

        
//$exist = array_search('2', $cartsAgrupadas);
        
$exist array_keys($cartsAgrupadas'4');
        if (
count($exist) == 0) {
            
$result['bool'] = false;
        } else {
            
$result['bool'] = true;
            
$result['val'] = $this->arrOrd[$exist[0]];
        }
        return 
$result;
    }

    public function 
isFull($carts) { 
        
$result = array();

        
$exist1 $this->isTrio($carts);
        
$exist2 $this->isParejaODoble($carts);
        if (
$exist2['bool'] == true && $exist2['modo'] == "normal" && $exist1['bool']) {
            
$result['bool'] = true;
            
$result['val'] = array(array("trio"$exist1['val']), array("pareja"$exist2['val']));
        } else {
            
$result['bool'] = false;
        }
        return 
$result;
    }

    public function 
isColor($carts) {
        
$result = array();
        
$color true;
        for (
$i 0$i < (count($carts) - 1) && $color$i++) {
            if (
$carts[$i]->getPalo() != $carts[$i 1]->getPalo()) {
                
$color false;
            }
        }
        if (
$color) {
            
$result['color'] = $carts[0]->getPalo();
            
$result['val'] = $this->arrOrd[$carts[count($carts) - 1]->getValor()];
            
$result['bool'] = true;
        } else {
            
$result['bool'] = false;
        }
        return 
$result;
    }

    public function 
isEscalera($carts) {
        
$result = array();
        
$result['max'] = $this->arrOrd[$carts[count($carts) - 1]->getValor()];
        
$result['min'] = $this->arrOrd[$carts[0]->getValor()]; //para calcular si es escalera real
        
$escalera true;
        for (
$i 0$i < (count($carts) - 1) && $escalera$i++) {
            if ((
$this->arrOrd[$carts[$i]->getValor()] + 1) != $this->arrOrd[$carts[$i 1]->getValor()]) {
                if ((
$this->arrOrd[$carts[$i 1]->getValor()] == 14) && ($this->arrOrd[$carts[$i]->getValor()] == 5)) {
                    
$escalera true;
                } else {
                    
$escalera false;
                }
            }
        }
        if (
$escalera) {
            
$result['bool'] = true;
            if (
$result['max'] == 14 && $result['min'] == 2) {
                
$result['min'] = $result['max'];
                
$result['max'] = 5;
            }
        } else {
            if (
$result['max'] == && $result['min'] == 14) {
                
$result['bool'] = true;
            } else {
                
$result['bool'] = false;
            }
        }
        return 
$result;
    }

    public function 
isTrio($carts) {
        
$result = array();
        
$cartsAgrupadas $this->agruparCartas($carts);

        
//$exist = array_search('2', $cartsAgrupadas);
        
$exist array_keys($cartsAgrupadas'3');
        if (
count($exist) == 0) {
            
$result['bool'] = false;
        } else {
            
$result['bool'] = true;
            
$result['val'] = $this->arrOrd[$exist[0]];
        }
        return 
$result;
    }

    public function 
isParejaODoble($carts) {
        
$result = array();
        
$cartsAgrupadas $this->agruparCartas($carts);

        
$exist array_keys($cartsAgrupadas'2');
        if (
count($exist) == 2) {
            
$result['bool'] = true;
            
$result['val'] = array($this->arrOrd[$exist[0]], $this->arrOrd[$exist[1]]);
            
$result['modo'] = "dobles";
            
$aux $this->cartaAlta($carts$result['val']);
            
$result['max'] = $aux['val'];
        } elseif (
count($exist) == 1) {
            
$result['bool'] = true;
            
$result['val'] = $this->arrOrd[$exist[0]];
            
$result['modo'] = "normal";
            
$aux $this->cartaAlta($carts$result['val']);
            
$result['max'] = $aux['val'];
        } else {
            
$result['bool'] = false;
        }
        return 
$result;
    }

    public function 
cartaAlta($carts$excluir null) {
        
$result = array();
        
$masAlta null;
        foreach (
$carts as $val) {
            if (
$excluir != null) {
                if (
is_array($excluir)) {
                    if (
$this->arrOrd[$val->getValor()] != $excluir[0] && $this->arrOrd[$val->getValor()] != $excluir[1]) {
                        if (
$masAlta == null) {
                            
$masAlta $val->getValor();
                        } else {
                            if (
$this->arrOrd[$val->getValor()] > $this->arrOrd[$masAlta]) {
                                
$poner true;
                                foreach(
$excluir as $exc) {
                                    if(
$val->getValor() == $exc) {
                                        
$poner false;
                                    }
                                }
                                if(
$poner) {
                                    
$masAlta $val->getValor();
                                }
                            }
                        }
                    }
                } else {
                    if (
$this->arrOrd[$val->getValor()] != $excluir) {
                        if (
$masAlta == null) {
                            
$masAlta $val->getValor();
                        } else {
                            if (
$this->arrOrd[$val->getValor()] > $this->arrOrd[$masAlta]) {
                                
$masAlta $val->getValor();
                            }
                        }
                    }
                }
            } else {
                if (
$masAlta == null) {
                    
$masAlta $val->getValor();
                } else {
                    if (
$this->arrOrd[$val->getValor()] > $this->arrOrd[$masAlta]) {
                        
$masAlta $val->getValor();
                    }
                }
            }
        }
        
$result['val'] = $masAlta;
        return 
$result;
    }

    private function 
agruparCartas($carts) {
        
$result = array();
        
$result['2'] = 0;
        
$result['3'] = 0;
        
$result['4'] = 0;
        
$result['5'] = 0;
        
$result['6'] = 0;
        
$result['7'] = 0;
        
$result['8'] = 0;
        
$result['9'] = 0;
        
$result['10'] = 0;
        
$result['j'] = 0;
        
$result['q'] = 0;
        
$result['k'] = 0;
        
$result['a'] = 0;
        for (
$i 0$i count($carts); $i++) {
            switch (
$carts[$i]->getValor()) {
                case 
"2":
                    
$result['2'] += 1;
                    break;
                case 
"3":
                    
$result['3'] += 1;
                    break;
                case 
"4":
                    
$result['4'] += 1;
                    break;
                case 
"5":
                    
$result['5'] += 1;
                    break;
                case 
"6":
                    
$result['6'] += 1;
                    break;
                case 
"7":
                    
$result['7'] += 1;
                    break;
                case 
"8":
                    
$result['8'] += 1;
                    break;
                case 
"9":
                    
$result['9'] += 1;
                    break;
                case 
"10":
                    
$result['10'] += 1;
                    break;
                case 
"j":
                    
$result['j'] += 1;
                    break;
                case 
"q":
                    
$result['q'] += 1;
                    break;
                case 
"k":
                    
$result['k'] += 1;
                    break;
                case 
"a":
                    
$result['a'] += 1;
                    break;
                default:
                    break;
            }
        }
        return 
$result;
    }

    public function 
ordenarCartas($cartas) {
        
$cards = array();
        
$resultado = array();
        foreach (
$cartas as $key => $value) {
            
$cards[$key] = $this->arrOrd[$value->getValor()];
        }
        
asort($cards);
        foreach (
$cards as $cla => $val) {
            
$resultado[] = $cartas[$cla];
        }
        return 
$resultado;
    }

}

?>
__________________
¿Buscas respuestas? eemmmmm.....¡Abstrae tu mente!

Última edición por Apolo_13; 26/06/2015 a las 06:09
  #13 (permalink)  
Antiguo 28/06/2015, 11:33
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 3


Este es el tercer nivel de la maratón. ¡En marcha!

A.- En este nivel se deberá recrear el clásico juego "Piedra-Papel-Tijera", el usuario elegirá su jugada y el servidor elegirá la suya aleatoriamente, luego informara quien es el ganador o si hubo empate.
Para superar este desafió, solo es necesario resolver el "Modo clásico".
A continuación, se muestra la pantalla visual y el lugar donde deberá estar ubicado el código PHP, recuerde publicar solo el código PHP no toda la plantilla visual ya que esta es la misma para todos los concursantes.

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.  <html>
  3.      <head>
  4.          <title>PHP MARATON SCRIPT V1 - NIVEL 3 A</title>
  5.      </head>
  6.      <body>
  7.          <?php
  8.             // Su código aqui...
  9.          ?>
  10.          
  11.          <h3>Modo Clasico</h3>
  12.          <form method="post">
  13.              <ul>
  14.                 <li><input type="radio" name="jugada" value="0"> Piedra</li>
  15.                 <li><input type="radio" name="jugada" value="1"> Papel</li>
  16.                 <li><input type="radio" name="jugada" value="2"> Tijera</li>
  17.              </ul>
  18.              <input type="hidden" name="modo" value="0">
  19.              <input type="submit" value="¡JUGAR!">
  20.          </form>
  21.          
  22.          <h3>Modo Experto</h3>
  23.          <form method="post">
  24.              <ul>
  25.                 <li><input type="radio" name="jugada" value="0"> Piedra</li>
  26.                 <li><input type="radio" name="jugada" value="1"> Papel</li>
  27.                 <li><input type="radio" name="jugada" value="2"> Tijera</li>
  28.                 <li><input type="radio" name="jugada" value="3"> Demonio</li>
  29.                 <li><input type="radio" name="jugada" value="4"> Dragon</li>
  30.                 <li><input type="radio" name="jugada" value="5"> Agua</li>
  31.                 <li><input type="radio" name="jugada" value="6"> Aire</li>
  32.                 <li><input type="radio" name="jugada" value="7"> Linterna</li>
  33.                 <li><input type="radio" name="jugada" value="8"> Esponja</li>
  34.                 <li><input type="radio" name="jugada" value="9"> Lobo</li>
  35.                 <li><input type="radio" name="jugada" value="10"> Arbol</li>
  36.                 <li><input type="radio" name="jugada" value="11"> Humano</li>
  37.                 <li><input type="radio" name="jugada" value="12"> Serpiente</li>
  38.                 <li><input type="radio" name="jugada" value="13"> Revolver</li>
  39.                 <li><input type="radio" name="jugada" value="14"> Fuego</li>
  40.              </ul>
  41.              <input type="hidden" name="modo" value="1">
  42.              <input type="submit" value="¡JUGAR!">
  43.          </form>
  44.      </body>
  45.  </html>

CONDICIÓN DE MERITO:
El algoritmo debe ser genérico, es decir, debe servir para resolver tanto el "Modo clásico" como el "Modo experto".
Considere para el "Modo experto" el siguiente gráfico:



LINEAS DE CODIGO ESTIMADAS: <40

B.- En este desafió, se deberá programar un algoritmo que genere una tabla de enfrentamientos, recibiendo un array con una cantidad impar de valores de tipo string, y que devuelva otro array donde las claves sean los valores del array ingresados y el valor de cada una sea otro array que contenga a los string a los cuales derrota (determinados aleatoriamente), recuerde que cada elemento debe derrotar a la mitad de los demas elementos y ser derrotado por la otra mitad.

Un ejemplo de todas las soluciones posibles para 3 elementos:
Código PHP:
Ver original
  1. enfrentamientos(["Piedra", "Papel", "Tijera"]);
  2. // Posibles respuestas:
  3. // ["Piedra" => ["Tijera"], "Tijera" => ["Papel"], "Papel" => ["Piedra"]]
  4. // ["Piedra" => ["Papel"], "Tijera" => ["Piedra"], "Papel" => ["Tijera"]]

CONDICIÓN DE MERITO:
Permitir que el algoritmo reciba un segundo parámetro opcional, que defina algunas pre-condiciones de las soluciones, es decir, algunos elementos que se deben cumplir si o si.
Ej:

Código PHP:
Ver original
  1. enfrentamientos(["Piedra", "Papel", "Tijera"], ["Piedra" => ["Tijera"]]);
  2. // Siempre retorna esta combinación, ya que es la única posible que cumple los requisitos:
  3. // ["Piedra" => ["Tijera"], "Tijera" => ["Papel"], "Papel" => ["Piedra"]]

NOTA: Asuma que los pre-requisitos son validos y que existe al menos una combinación que los satisface. También asuma que el numero de elementos del primer array es impar.

LINEAS DE CODIGO ESTIMADAS: <30 (<60 CON MERITO)

NIVEL 4


Este es el cuarto nivel de la maratón. ¡En marcha!

A.- Cuando un grupo de amigos se reune a jugar al futbol, es comun definir los equipos mediante eleccion directa por turnos, los dos directores hacen el clasico "Pan y Queso" para ver quien elije primero y luego cada uno elije un jugador, no obstante, el ganador del "Pan y Queso" puede en un turno dado permitir al otro que elija primero, esto se conoce como "Galantear". Como sabemos, en el futbol siempre gana el equipo que tiene los jugadores con mayor habilidad () por lo tanto, la tarea a realizar en este desafio, consiste en determinar cuantas veces el ganador del "Pan y Queso" puede "Galantear" a su adversario asegurandose la victoria del encuentro.
- Programe una funcion llamada "galantear" que reciba un array con las puntuaciones de cada jugador.
- Considere que siempre hay una cantidad par de jugadores.
- Considere que ambos directores siempre elijen primero a los de mayor habilidad.
- Debe retornar la cantidad de veces que el ganador puede "Galantear" a su adversario sin riesgo de perder el partido.
- Si no es posible ganar el partido, debe retornar -1


CONDICIÓN DE MERITO:
La funcion debe aceptar un segundo array opcional (inicialmente vacio), recibido por referencia, donde almacenara las puntuaciones de los jugadores que conformaran al equipo del ganador de "Pan y Queso".

Algunos tests:
Código PHP:
Ver original
  1. galantear([10,10,10,10]) // -1
  2. galantear([7,8,2,10,1,4]) // 1
  3. galantear([7,8,2,10,1,3]) // 2
  4. galantear([60,95,100,65]) // 0
  5.  
  6. // Siendo $equipo = [];
  7. galantear([10,10,10,10], $equipo) // -1, $equipo = [10,10]
  8. galantear([7,8,2,10,1,4], $equipo) // 1, $equipo = [10,7,1]
  9. galantear([7,8,2,10,1,3], $equipo) // 2, $equipo = [8,7,1]
  10. galantear([60,95,100,65], $equipo) // 0, $equipo = [100,65]

LINEAS DE CODIGO ESTIMADAS: <25

B.- En una determinada ciudad, hay muchas lineas de trenes que se entrecruzan. En un momento del dia dado, sale un tren de cada una de estas lineas, pero claro, si todos salen al mismo tiempo y las vías se cruzan ¡Chocarian!, por lo tanto se implemento un sistema de salida de trenes por turnos, su tarea para este desafio consiste en determinar la menor cantidad de turnos necesarios para que no se produzca ningun choque.
- Programe una funcion llamada trenes, que reciba un array ordenado con el numero de anden al que se dirige cada tren.
- La cantidad de trenes es variable.
- Deber retornar el numero minimo de turnos de salida.
- Considere que hay 1 anden por tren.
- Considere que no hay dos trenes que se dirijan al mismo anden.
- Las vias de tren tienen la topologia que se muestra en la imagen siguiente, el array que recibira la funcion como parametro es la serie de numeros de la derecha, en el caso particular de esta imagen de ejemplo seria: [5,3,4,1,2], los andenes a la izquierda estan numerados de forma consecutiva creciente.



CONDICIÓN DE MERITO:
La funcion debe aceptar un segundo array opcional (inicialmente vacio), recibido por referencia, donde almacenara para cada turno, que trenes deben salir.
En caso de haber mas de una combinacion posible, se puede mostrar cualquiera de ellas.

Algunos tests:
Código PHP:
Ver original
  1. trenes([4,5,2,3,1]) // 3
  2. trenes([1,2,3]) // 1
  3.  
  4. // Siendo $turnos = [];
  5. trenes([4,5,2,3,1], $turnos) // 3, $turnos = [[4,5],[2,3],[1]]
  6. trenes([1,2,3], $turnos) // 1, $turnos = [[1,2,3]]
LINEAS DE CODIGO ESTIMADAS: <35
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 05/07/2015 a las 12:26
  #14 (permalink)  
Antiguo 07/07/2015, 09:38
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

Nivel 1-A
Código PHP:
Ver original
  1. <?php
  2. $letters = array("a", "o", "u", "H", "l", "m", "n", "d");
  3.  
  4. $output = fopen('php://output', 'w');
  5. fwrite($output, $letters[3].$letters[1].$letters[4].$letters[0]." ".$letters[5].$letters[2].$letters[6].$letters[7].$letters[1]."\n");
  6. fclose($output);
  7. ?>
__________________
>> Eleazan's Source
>> @Eleazan
  #15 (permalink)  
Antiguo 07/07/2015, 14:52
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

Nivel 1-B
Código PHP:
<?php
$pagina 
= isset($_GET['pagina']) ? $_GET['pagina'] : 0;
$nombre = isset($_GET['nombre']) ? $_GET['nombre'] : '';

if(
$nombre == ''$pagina 0;

$pantallas str_replace(
                array(
".php"'<input type="text"'"-NOMBRE-"),
                array( 
".php?nombre=".$nombre."&pagina=".($pagina+1), '<input type="hidden" name="pagina" value="'.($pagina+1).'"><input type="text"'$nombre),
                
$pantallas
                
);


echo 
$pantallas[$pagina];

?>
__________________
>> Eleazan's Source
>> @Eleazan
  #16 (permalink)  
Antiguo 12/07/2015, 12:38
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

NIVEL 5


Este es el quinto nivel de la maratón. ¡En marcha!

A.- En este nivel se deberá crear un algoritmo de encriptado.
El algoritmo que se les pide desarrollar, recibira 3 parametros:
- Un string, compuesto solo por letras minusculas, de la "a" a la "z" inclusive, de al menos 2 caracteres, que es el string original que se quiere encriptar.
- Un array compuesto por 4 numeros diferentes, ordenados de forma creciente, todos distintos y menores o iguales que la longitud del string del primer parametro.
- Un numero opcional, mayor que 0, por defecto 1, que indica el nivel de encriptacion.

El algoritmo funciona asi:
0) Tantas veces como indique el parametro "nivel de encriptacion" repetir los siguientes pasos:
1) Se obtienen 2 substring del string original, basandose en las posiciones indicadas en el array del segundo parametro.
2) A cada uno de esos substring, se los "da vuelta", es decir, se hace la reversa de la cadena.
3) A cada caracter de cada uno de esos substring se le resta 1 a su valor ascii, considere un alfabeto circular, donde la "a" se convierte en la "z".
4) Se intercambian los dos substring dentro del string original.

Un ejemplo:
encriptar("estedesafioesincreible", [2,6,8,18], 2);
1) Obtener los dos substring: "tede" y "fioesincre"
2) Darlos vuelta: "edet" y "ercniseoif"
3) Restar 1 al valor ascii: "dcds" y "dqbmhrdthe"
4) Intercambiar en el string original: "esdqbmhrdthesadcdsible"
5) Repetir el paso 1 al 4 otra vez, tomando ahora como string de entrada a: "esdqbmhrdthesadcdsible"

CONDICIÓN DE MERITO:
Programar otro algoritmo, llamado desencriptar que reciba los mismos tipos de parametros que "encriptar" pero que realice el proceso inverso.

LINEAS DE CODIGO ESTIMADAS: <50

B.- En este nivel se deberá crear un webservice para una sala de chat publica.
Considere la siguiente pantalla visual:
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <head>
  3.         <meta charset="utf-8">
  4.         <title>Chat Webservice</title>
  5.         <script>
  6.             ChatWs = function(params) {
  7.                 this.comet = this.comet.bind(this);
  8.  
  9.                 this.messages = params.messages;
  10.                 this.form = params.form;
  11.                 this.ws = params.ws;
  12.                 this.stack = new FormData();
  13.                 this.stack.length = 0;
  14.                 this.id = 0;
  15.  
  16.                 this.form.addEventListener("submit", function(evt) {
  17.                     evt.preventDefault();
  18.                     this.stack.append('stack[' + this.stack.length + '][nick]', this.form.elements.nick.value);
  19.                     this.stack.append('stack[' + this.stack.length + '][mensaje]', this.form.elements.mensaje.value);
  20.                     this.stack.length++;
  21.                     this.form.elements.mensaje.value = "";
  22.                 }.bind(this));
  23.  
  24.                 this.comet();
  25.             }
  26.  
  27.             ChatWs.prototype = {
  28.                 "comet" : function() {
  29.                     var request = new XMLHttpRequest();
  30.                     request.open("POST", this.ws);
  31.                     request.onreadystatechange = function(chatws) {
  32.                         if(this.readyState == 4) {
  33.                             if(this.status == 200) {
  34.                                 var response;
  35.                                 try {
  36.                                     response = JSON.parse(this.responseText);
  37.                                 } catch (e) {
  38.                                     console.error(this.responseText);
  39.                                     console.error(e);
  40.                                 } finally {
  41.                                     var nro;
  42.                                     for(nro = 0; nro<response.mensajes.length; nro++)
  43.                                         chatws.messages.appendChild(document.createElement("li")).innerHTML = response.mensajes[nro];
  44.                                     chatws.id = response.id;
  45.                                 }
  46.                             }
  47.                            
  48.                             setTimeout(chatws.comet, 2000);
  49.                         }
  50.                    }.bind(request, this);
  51.                    
  52.                     this.stack.append("id", this.id);
  53.                    request.send(this.stack);
  54.                     this.stack = new FormData();
  55.                     this.stack.length = 0;
  56.                }
  57.            };
  58.        </script>
  59.     </head>
  60.     <body>
  61.         <h1>Chat Ws</h1>
  62.         <ul id="messages-list"></ul>
  63.         <form id="chat-form">
  64.             <label>
  65.                 Nick:
  66.                 <input type="text" name="nick">
  67.             </label>
  68.             <label>
  69.                 Mensaje:
  70.                 <input type="text" name="mensaje">
  71.             </label>
  72.             <input type="submit" value="enviar">
  73.         </form>
  74.         <script>
  75.             new ChatWs({
  76.                 "messages" : document.getElementById("messages-list"),
  77.                 "form" : document.getElementById("chat-form"),
  78.                 "ws" : "chat-ws.php"
  79.             });
  80.         </script>
  81.     </body>
  82. </html>

y la siguiente plantilla PHP, llamado el archivo como "chat-ws.php":

Código PHP:
Ver original
  1. <?php
  2.     $archivo = "chat-ws.txt";
  3.  
  4.     function chat($stack, &$id, $archivo) {
  5.         $nuevos_mensajes = [];
  6.  
  7.         // Su codigo aqui...
  8.        
  9.         return $nuevos_mensajes;
  10.     }
  11.  
  12.     echo json_encode(["mensajes" => chat($_POST["stack"], $_POST["id"], $archivo), "id" => $_POST["id"]]);

su tarea sera programar el contenido de la funcion "chat" teniendo en cuenta las siguientes condiciones:
- El parametro $stack, es un array bidimencional, donde cada cada elemento tiene las propiedades "nick" y "mensaje".
- El parametro $id, recibido por referencia, es el ultimo mensaje que el cliente conoce.
- El parametro $archivo contiene el nombre de un archivo txt donde se almacenan los mensajes.
- En el archivo txt donde se guardan los mensajes, solo puede haber un mensaje por linea, el numero de linea se comportara entonces como "Clave Primaria autoincrementada".
- Al invocarse la funcion, se deben agregar al archivo tantas lineas como mensajes alla en $stack.
- La funcion debe retornar un array, con todos los mensajes no leidos por el cliente, es decir, todos aquellos mensajes cuyo numero de linea sea mayor al valor del parametro $id.
- La funcion debe de actualizar el valor de $id con la cantidad de lineas final del archivo.
- El chat debe funcionar de forma fluida y correctamente (sin repetir mensajes ni saltearse alguno) sin importar la cantidad de personas conectadas al chat.
- Cada mensaje nuevo devuelto, debe contener el nick del usuario en negrita (usar la etiqueta strong de html5) y el texto del mensaje en letra normal.

CONDICIÓN DE MERITO:
El algoritmo debe ser robusto y eficiente, al punto tal que pueda manejar millones de lineas de mensajes y decenas de usuarios simultáneos sin saturar los recursos del servidor.
Considere en este caso, que la longitud maxima para $nuevos_mensajes es de 50.

LINEAS DE CODIGO ESTIMADAS: <50
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #17 (permalink)  
Antiguo 31/12/2015, 21:15
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años, 7 meses
Puntos: 468
Respuesta: [-CONCURSO-] PHP Maraton script #1 - Desafios

Nivel 1 - A

Intentando no repetir las ideas de los otros foreros, aunque lo complique mucho cumple! XD

Código PHP:
Ver original
  1. //declaramos letras
  2. $let = "abcdefghijklmnopqrstuvwxyz";
  3. $let .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  4.  
  5. //declaramos arrays de las posiciones
  6. $word1 = array(33,14,11,0,);
  7. $word2 = array(12,20,13,3,14);
  8.  
  9. //imprimimos 1º palabra
  10. for($i=0; $i<count($word1);$i++) {
  11. echo $let[$word1[$i]];
  12. }
  13.  
  14. //imprimimos separacion
  15. echo " ";
  16.  
  17. //imprimimos 2º palabra
  18. for($j=0; $j<count($word2);$j++) {
  19. echo $let[$word2[$j]];
  20. }
__________________
No te olvides de dar +1 a quien te echa un cable ;)

Etiquetas: formulario, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 8 personas




La zona horaria es GMT -6. Ahora son las 04:44.