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

Cesar Mendoza mendoza at kitiara.org
Tue May 31 08:57:50 PDT 2005


Hola,

Yo creo que los lenguajes de programación son como herramientas en una
caja de herramientas, el que algún lenguaje sea mejor que otro depende 
del tipo de problema, mas que de la herramienta en particular. Por
ejemplo si el problema es clavar un clavo, es mas fácil hacerlo con un
martillo que con un destornillador. El problema que se planteó no es 
precisamente el mejor para demostrar las ventajas de Perl, de hecho el 
programa en Java es igualito (ver mas abajo), lo que demostró Ernesto con 
su solución es que si se escoge un buen algoritmo la solución es mas 
sencilla, el lenguaje es lo de menos. Yo esperaría a ver un problema donde 
si se puedan ver las ventajas que ofrece Perl como procesamiento de 
texto o algo por el estilo.

Bye
Cesar Mendoza
http://www.kitiara.org
--
"If I have seen further it is by standing on the shoulders of giants."
  --Isaac Newton

/*
 * Created on May 31, 2005
 * Java 5.0
 */
package org.kitiara.test;

import static java.lang.Math.abs;
import java.util.HashMap;

/**
 * @author Cesar Mendoza
 * 
 */
public class Multiplos
{

	public static void main(String[] args)
	{
		//leo los datos de la linea de comandos, ya que leer del standard 
		//input no es precisamente donde java brilla.
		int i = Integer.parseInt(args[0]);
		int f = Integer.parseInt(args[1]);
		int ts = 0;
		HashMap<String, Integer> mx = new HashMap<String, Integer>();
		for (int n = i; n <= f; n++)
		{
			System.out.print("Multiplos de " + n + " suman ");
			int nm = n, sm = 0;
			while ((nm <= f) && (n != 0))
			{
				sm += nm;
				nm += abs(n);
			}
			ts += sm;
			if (!mx.containsKey("s")
					|| (sm > mx.get("s")))
			{
				mx.put("m", n);
				mx.put("s", sm);
			}
			System.out.println(sm);
		}
		System.out.println("Total: " + ts);
		System.out.println("Promedio: " + (ts / (f - i + 1)));
		System.out.println("La suma de los multiplos de " + mx.get("m")
				+ " es " + mx.get("s") + " y es maxima");
	}
}


On Tue, May 31, 2005 at 08:11:48AM +0530, Ernesto Hernández-Novich 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