• Publicidad

Desafio Perl

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Desafio Perl

Notapor kidd » 2005-08-16 20:36 @900

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 escribiste:
Código: Seleccionar todo
 #!/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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Publicidad

Notapor Perl user » 2005-08-16 21:56 @955

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: Seleccionar todo
#!/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: Seleccionar todo
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 :P
Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor kidd » 2005-08-16 22:53 @995

Hola Marco:

Mira, aquí va el de 35 :wink: :

Código: Seleccionar todo
#!/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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Perl user » 2005-08-17 00:52 @078

kidd escribiste:Hola Marco:


Mira, aquí va el de 35 :wink: :

Código: Seleccionar todo
#!/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,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor kidd » 2005-08-17 10:41 @487

Perl user escribiste: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.


:oops: 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: Seleccionar todo
#!/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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor kidd » 2005-08-17 12:48 @575

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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados