Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/07/2010, 12:03
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
[Desafío PHP] Función reduce()

Descripción:

En este reto se debe implementar una función que comprima una cadena string dada, reconociendo y conservando el orden alfabético en una forma de pseudo rango.

Sintaxis:
reduce(string $text)
$text = <a-z caracteres a comprimir>

Entrada:
  • $text debe contener solo caracteres en minúsculas de la a-z
  • No es necesaria validar, se asume que los argumentos siempre son pasados de forma correcta


Salida:
  • El resultado debe indicar donde hay 3 o mas caracteres en orden alfabético, y convertirlos en un rango, ej. abc = a-c
  • El orden de los caracteres puede ir incluso de reversa, produciendo lo siguiente: cba = c-a
  • Si la secuencia tiene repeticiones, estas deben conservarse: abcddddcba = a-dddd-a
  • Debe funcionar para mas de un solo rango, abcba = a-c-a

Como aclaración: al final debería ser posible aplicar ingeniería inversa al resultado de la función... ;)


Ejemplos:
Código PHP:
// sencillos
echo reduce('abcd'); // a-d
echo reduce('hijlbcd'); // h-jlb-d
echo reduce('ihdlkioabcihgfe'); // ihdlkioa-ci-e

 // de reversa
echo reduce('cba'); // c-a
echo reduce('zyx'); // z-x

// mas de un rango
echo reduce('abcdcba'); // a-d-a
echo reduce('abcddcba'); // a-dd-a
echo reduce('abcba'); // a-c-a
echo reduce('abcbabcdefgfec'); // a-c-a-g-ec

// ejemplos avanzados
echo reduce('cba'); // c-a
echo reduce('abcddcba'); // a-dd-a
echo reduce('abcd'); // a-d
echo reduce('hijlbcd'); // h-jlb-d
echo reduce('abcdefghijklmnopqrstuvwxyz'); // a-z
echo reduce('abhijklmnopqrstucdefgvwxyz'); // abh-uc-gv-z
echo reduce('ihdlkioabcihgfe'); // ihdlkioa-ci-e
echo reduce('aaabcd'); // aaa-d
echo reduce('zzzyxqrstuv'); // zzz-xq-v
echo reduce('abcdcba'); // a-d-a
echo reduce('abcbabcdefgfec'); // a-c-a-g-ec 
Reglas:
  1. El nombre de la función debe ser reduce()
  2. Pueden participar todos los usuarios de este foro, sin excepción alguna
  3. Una sola participación por usuario, una ves publicado no se puede editar el tema
  4. Sin OOP, sin extensiones adicionales, solo se admiten funciones del núcleo de PHP
  5. La función debe funcionar con el reporte de errores activado, y como E_ALL ~E_STRICT (y sin ocultar con @)
  6. La función debe dar los resultados correctos siempre, hacer pruebas es obligatorio
  7. Si algo no coincide con alguna regla, el participante sera descalificado

Condiciones de prueba:
  • Debe seguir alguna convención de estilo: PEAR, Zend, CI (puede ser mixta incluso)
  • La función debe ejecutarse incluso en PHP >= 4.3, pero también se debe tener en cuenta la compatibilidad con PHP >= 5.x
  • No se deben crear funciones auxiliares para implementar la función
  • No se deben usar funciones obsoletas -deprecated- de cualquier versión de PHP
  • Si alguna condición no se cumple solo se restarían puntos a la participación...

Consideraciones adicionales:
  • El nivel del reto es medio-avanzado, por lo cual el tiempo de entrega es de una semana a partir de la publicación del mismo
  • La entrega del código para participar debe hacerse por MP al autor del mismo tema y usando las etiquetas de coloreado de código necesarias, ej. [php][/php] (es posible enviar hasta 3 correcciones, mas no optimizaciones)
  • El jurado estará compuesto por todo buen usuario de forosdelweb: aquel que ronde por el foro de PHP, incluyendo mods, ninjas y webmistress, etc... cero trolls y compañía por favor.. (:
  • El resultado de la evaluación consta de la suma de las calificaciones otorgadas por el jurado, cada quien puede votar solo una ves!!
  • Al final de la competencia el autor del desafío debe mostrar los resultados basados en los siguientes criterios, así como las soluciones respectivamente
    • Sin limites de longitud. el numero de lineas no importa... siempre y cuando se usen nombres de variables legibles, etc.
    • Estilo propio. indentar y usar comillas es el estándar, algunas cosas no tanto... usa el sentido común... ;)
    • Experiencia. conocimiento del core: código poco convencional, optimizaciones y otras cosas
    • Técnica. cadenas, arreglos, regex, tokens, hacks, packs, bitwise, etc. si lo tienes, no lo dejes en la casa!
  • Por favor, cualquier comentario fuera del contexto de participación en el reto debe ser a través de un MP al creador del mismo, osea yo... (:

Sin mas yerba por ahora, esperamos contar con su participación... gracias!!

PDTA: por favor, y reitero por si las dudas.... no contesten este tema si no es para colocar su código de participación!!


¡¡De ultima hora!!

Estoy planteando un ligero cambio en las reglas con respecto a la publicación de código, para evitar posibles problemas de plagio y originalidad... por favor no coloquen ningún código hasta resolver este inconveniente: seguir leyendo

--off-topic--
Considero todos los cambios y las reglas como necesarias y no tanto, como sea, si algo de inmediato resulta inadecuado o confuso haganmelo saber en el borrador de esta discusión para discutirlo ampliamente.. :)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 03/07/2010 a las 23:14 Razón: Advertencia, correciones y más