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

Ernesto Hernández-Novich emhn at telcel.net.ve
Mon May 30 19:41:48 PDT 2005


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



More information about the caracas-pm mailing list