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