Ver Mensaje Individual
  #14 (permalink)  
Antiguo 19/08/2003, 01:37
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola a todos,

Este es un problema que me ha parecido muy interesante, y con el permiso de ustedes, me gustaría compartir la solución que se me ha ocurrido inicialmente.

El método de Manoloweb es sumamente interesante, y me asombra su ingenio al haber recurrido a una sentencia eval() para encontrar la solución.

Alternativamente, pienso que la solución podría obtenerse también mediante el uso de expresiones regulares, y esta es la primera implementación que se me ha ocurrido:


Código:
<?php

// Funcion que recupera los conjuntos de cifras de una cadena y
// devuelve la suma de estos valores

function funcionquedeconozco ($cadena)
{
    preg_match_all ('/\\b[\\d\\.]+\\b/', $cadena, $coincidencias);
    
    $num_coincidencias = count ($coincidencias[0]);

    for ($i = 0, $suma = 0; $i < $num_coincidencias; $i++)
        $suma += $coincidencias[0][$i];

    return $suma;
}


$alumnos1 = array (
    'a' => "Los alumos A tienen  Pesos",
    'b' => "Los alumos B tienen [$20] Pesos",
    'c' => "Los alumos C tienen [$30] Pesos",
    'd' => "Los alumos D tienen [$40] Pesos",
    'e' => "Los alumos E tienen [$50] Pesos",
    'f' => "Los alumos F tienen [$60] Pesos");


$alumnos2 = array (
    'a' => "Los alumos A tienen poquitos Cuadernos",
    'b' => "Los alumos B tienen libros y Cuadernos",
    'c' => "Los alumos C tienen medallas y Cuadernos",
    'd' => "Los alumos D tienen algunos Cuadernos",
    'e' => "Los alumos E tienen amigos y Cuadernos",
    'f' => "Los alumos F detestan los Cuadernos");


$cadena1 = implode ('', $alumnos1);
$cadena2 = implode ('', $alumnos2);

$info1 = funcionquedeconozco ($cadena1);
$info2 = funcionquedeconozco ($cadena2);

echo "Ejemplo 1: $info1 Pesos\n";
echo "Ejemplo 2: $info2 Pesos\n";

?>

El algoritmo de la función es relativamente simple:

* Recuperar las coincidencias de una cadena dada con un patrón que representa conjuntos de cifras (0-9) o puntos (.) sucesivos. Los resultados se almacenan en la matriz $coincidencias.

* Inicializar un acumulador $suma en cero y recorrer la matriz $coincidencias, añadiendo el valor de cada elemento de la fila 0 al acumulador $suma. La fila cero de la matriz $coincidencias es en donde van a dar las secuencias de caracteres que coincidieron con la expresión regular completa.

* Devolver el valor de $suma.


Quizás sea útil al menos como material de referencia, ya que la solución de Manoloweb es estupenda.


Un cordial saludo