Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Desafio Perl

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mar Ago 16, 2005 7:36 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Desafio Perl Responder citando

Hola:

En el boletín de este mes de Cafe.pm Andrés Kievsky ha puesto un desafío de Perl, el cual me pareció interesante y aquí se los presento:

Andrés Kievsky escribió:

Código:
 #!/usr/bin/perl
 
 use strict;
 use warnings;
 
 my $suma;
 <solución>
 
 $suma->{1} = 31;
 $suma->[3] = 11;
 print $suma->()."\n";


Agregar una línea de código al programa anterior, de forma tal que el print imprima la suma de los dos números. En este caso, la salida sería 42 (es decir, 31+11) pero tiene que funcionar para cualquier número que uno ponga en $suma->{1} y $suma->[3] (incluso si uno repite las últimas 3 líneas varias veces) .

La línea tiene las siguientes restricciones:

  • no se puede utilizar bless ni tie ni puede ser un objeto
  • no se pueden usar pseudohashes
  • no puede haber más de un ; en la línea
  • la solución debe tener 35 caracteres o menos
  • no debe generar warnings ni errores, usando siempre ``use warnings'' y ``use strict''
  • no se puede agregar más código que el de esa línea.
  • no se pueden usar módulos de ningún tipo


Está probado en Perl 5.8.0 y 5.8.5.


¡Quien tenga la solución primero gana! Wink


SALUDOS
Mensaje Mar Ago 16, 2005 8:56 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

Uhm, el reto parece ser un clásico problema polimórfico, donde el uso de typeglobs ( que es lo único que se me vino a la mente ) podría tener vela en el entierro.

Aunque mi solución es de 37 caracteres ni modo:
Código:

#!/usr/bin/perl

use strict;
use warnings;

my $suma;
sub x{$suma->{1}+$suma->[3]}$suma=*x;

$suma->{1} = 31;
$suma->[3] = 11;
print $suma->() . "\n";


ahora bien, si lo que se quiere es que la línea de solución sea una sola expresión basta cambiarla por:
Código:

eval 'sub x{$suma->{1}+$suma->[3]}$suma=*x';


Pero la solución aun crece mas.


Después de aventarme un día un poco 'de hueva' creo que ya mejor me pondré a trabajar Razz
Saludos,
Mensaje Mar Ago 16, 2005 9:53 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola Marco:

Mira, aquí va el de 35 Wink :

Código:

#!/usr/bin/perl

use strict;
use warnings;

my $suma;

sub x{$$suma{1}+@$suma[3]}$suma=*x;

$suma->{1} = 31;
$suma->[3] = 11;
print $suma->() . "\n";



SALUDOS
Mensaje Mar Ago 16, 2005 11:52 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

kidd escribió:
Hola Marco:


Mira, aquí va el de 35 Wink :

Código:

#!/usr/bin/perl

use strict;
use warnings;

my $suma;

sub x{$$suma{1}+@$suma[3]}$suma=*x;

$suma->{1} = 31;
$suma->[3] = 11;
print $suma->() . "\n";



SALUDOS


Ah me parece muy bien!!! solo que necesitas cambiar @$suma[3] por $$suma[3], ya que nuevamente @$suma[3] es un slice y semanticamente no es lo que necesitamos.

Saludos,
Mensaje Mie Ago 17, 2005 9:41 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Perl user escribió:
Ah me parece muy bien!!! solo que necesitas cambiar @$suma[3] por $$suma[3], ya que nuevamente @$suma[3] es un slice y semanticamente no es lo que necesitamos.


Embarassed Ah, que costumbre la mia con el slice, no hace mucho me corregiste con algo así Wink.

Entonces, podríamos decir que la respuesta quedaría así:

Código:

#!/usr/bin/perl

use strict;
use warnings;

my $suma;

sub x{$$suma{1}+$$suma[3]}$suma=*x;

$suma->{1} = 31;
$suma->[3] = 11;
print $suma->() . "\n";



SALUDOS
Mensaje Mie Ago 17, 2005 11:48 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

Pues como ya está la solución con 35 caracteres o menos. Ahora Andrés puso el reto con el mismo problema, ahora, con una solución de menos de 30 o menos caracteres.



SALUDOS
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group