Ver Mensaje Individual
  #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