[caracas-pm] Sugerencias sobre uso de arrays y hashes

Manuel Sanguino manuel.sanguino at gmail.com
Tue May 31 06:02:21 PDT 2005


que bueno esta este script ...jeje de panas preguntale al profe silo
hace con nuemro negativos... = )

On 5/30/05, Ernesto Hernández-Novich <emhn at telcel.net.ve> wrote:
> On Thu, 2005-05-26 at 10:12 -0400, Christian Sánchez wrote:
> > En la universidad nos estan dando clases de java y lo que es
> > programación orientada a objetos, el Prof. conoce poco o casi nada de
> > Perl, y la verdad Java no me ha gustado mucho, es por eso que me
> > gustaria llevarle al Prof. algunos ejemplos de como usar Perl para
> > resolver algunos ejercicios de una manera más rápida y sencilla
> 
> No sólo eso. Si tu profesor realmente ha sufrido el lavado cerebral de
> Java, hablará constantemente de los "patrones" y como son
> importantísimos y que la programación no puede existir sin ellos, y que
> gracias a OO todos los patrones se implementan, etc.
> 
> Perl tiene todos los patrones. Muchos de ellos los tiene "in core" (y no
> como Java en los cuales los tienes que _programar_), y no es obligatorio
> que sean orientados a objetos. Esto es, no hay que _simular_ sino que se
> tiene disponible automáticamente.
> 
> > Se tiene que indicar un valor inicial y un valor final, luego examinar
> > los números que sean múltiplos de cada uno de los números que estan en
> > el rango comprendido entre el valor inicial y el final, sumar cada uno
> > de los múltiplos y luego hacer la suma total de todos los múltiplos que
> > se consiguieron. Además se ha de conseguir cual de los resultados de la
> > suma de los múltiplos de cada número tiene el mayor valor, y obtener el
> > promedio de la suma total de los múltiplos.
> > Yo lo resolvi usando un array y un hash, estoy seguro que hay mas
> > maneras de hacerlo, les envio lo que escribi para ver que cosas sugieren
> > que se le puede cambiar, no estoy muy ducho en Perl, asi que cualquier
> > sugerencia sera bien recibida.
> > Otra cosa, seria mucho pedir algún ejemplo de como se resolvería esto
> > haciendo uso de la POO con Perl?, eso si seria interesante.
> 
> No, no sería interesante. Es el típico problema donde tendrías que
> construir una clase con un iterador y mutadores, y eso es una pérdida
> total de tiempo cuando el lenguaje ya tiene eso "in core".
> 
> Mi solución (como para maratón de programación):
> 
> . Si N es un número N+N, N+N+N, N+N+N+N, ... son sus múltiplos.
> . Se asume que el inicial es menor que el final, para ahorrar la
> validación.
> 
> - Imperativa simple (óptima para éste problema). No hacen falta
> estructuras de datos complejas, sólo un entero para la suma total ($ts)
> y un par <M(aximo),S(uma)> (representado en un hash); internamente se
> usan dos enteros, uno para generar los múltiplos de la base de cada
> iteración y otro para ir acumulando su suma. El principio es simple,
> dada una base B, entonces NM = k * B será un múltiplo (se calcula NM <-
> NM + B en cada iteración) y SM <- SM + NM. Por supuesto, todo el
> algoritmo es derivado según las propiedades de los números, más aún de
> las secuencias ordenadas de números (aquí es donde Matemáticas Discretas
> uno ahorra tiempo de programación y de espacio en memoria).
> 
> #!/usr/bin/perl
> print "Inicial? "; $i = <STDIN>; chomp($i);
> print "Final?   "; $f = <STDIN>; chomp($f);
> my $ts = 0;
> my $mx = { m => undef, s => undef };
> for ($i..$f) {
>   print "Multiplos de ",$_," suman ";
>   my ($nm,$sm) = ($_,0);
>   $sm += $nm, $nm += abs($_) while $nm <= $f && $_;    (**)
>   $ts += $sm;
>   $mx = { m => $_, s => $sm } if !defined($mx->{s}) || $sm > $mx->{s};
>   print $sm,"\n";
> }
> print "Total: ",$ts,"\n";
> print "Promedio: ",$ts / ($f - $i + 1), "\n";
> print "La suma de multiplos de ",$mx->{m}," es ",$mx->{s}," y es maxima
> \n";
> 
> Este programa funciona con números negativos (pregúntale al profesor si
> su solución lo hace :-). En ese sentido, la línea clave es la marcada
> con (**).
> --
> Ernesto Hernández-Novich - On Linux 2.6.11 i686 - Unix: Live free or die!
> Geek by nature, Linux by choice, Debian of course.
> If you can't apt-get it, it isn't useful or doesn't exist.
> GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
> 
> _______________________________________________
> caracas-pm mailing list
> caracas-pm at pm.org
> http://mail.pm.org/mailman/listinfo/caracas-pm
>


More information about the caracas-pm mailing list