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<!DOCTYPE html>
ChatWs = function(params) {
this.comet = this.comet.bind(this);
this.messages = params.messages;
this.form = params.form;
this.ws = params.ws;
this.stack = new FormData();
this.stack.length = 0;
this.id = 0;
this.form.addEventListener("submit", function(evt) {
evt.preventDefault();
this.stack.append('stack[' + this.stack.length + '][nick]', this.form.elements.nick.value);
this.stack.append('stack[' + this.stack.length + '][mensaje]', this.form.elements.mensaje.value);
this.stack.length++;
this.form.elements.mensaje.value = "";
}.bind(this));
this.comet();
}
ChatWs.prototype = {
"comet" : function() {
var request = new XMLHttpRequest();
request.open("POST", this.ws);
request.onreadystatechange = function(chatws) {
if(this.readyState == 4) {
if(this.status == 200) {
var response;
try {
response = JSON.parse(this.responseText);
} catch (e) {
console.error(this.responseText);
console.error(e);
} finally {
var nro;
for(nro = 0; nro<response.mensajes.length; nro++)
chatws.messages.appendChild(document.createElement("li")).innerHTML = response.mensajes[nro];
chatws.id = response.id;
}
}
setTimeout(chatws.comet, 2000);
}
}.bind(request, this);
this.stack.append("id", this.id);
request.send(this.stack);
this.stack = new FormData();
this.stack.length = 0;
}
};
<ul id="messages-list"></ul> Nick:
<input type="text" name="nick"> Mensaje:
<input type="text" name="mensaje"> <input type="submit" value="enviar"> new ChatWs({
"messages" : document.getElementById("messages-list"),
"form" : document.getElementById("chat-form"),
"ws" : "chat-ws.php"
});
y la siguiente plantilla PHP, llamado el archivo como "chat-ws.php":
Código PHP:
Ver original<?php
$archivo = "chat-ws.txt";
function chat($stack, &$id, $archivo) {
$nuevos_mensajes = [];
// Su codigo aqui...
return $nuevos_mensajes;
}
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