Mar Ago 16, 2005 7:36 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
| Desafio Perl |
|
|
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!
SALUDOS |
|
|
|

Mar Ago 16, 2005 8:56 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
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
Saludos, |
|

Mar Ago 16, 2005 9:53 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
Hola Marco:
Mira, aquí va el de 35 :
| 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 |
|
Mar Ago 16, 2005 11:52 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| kidd escribió: | Hola Marco:
Mira, aquí va el de 35 :
| 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, |
|

Mie Ago 17, 2005 9:41 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
| 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. |
Ah, que costumbre la mia con el slice, no hace mucho me corregiste con algo así .
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 |
|
Mie Ago 17, 2005 11:48 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|