Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - explorer

#61
¿Puedes publicar un ejemplo, unas pocas líneas, de cómo son los archivos de entrada?

Falsea los datos sensibles, como los de las MAC. Solo nos interesa el formato del archivo.
#62
Si pones un ejemplo pequeño de lo que quieres hacer, te damos la solución  ;)
#63
Scripting / Re: duda ejercicio combinatoria
19 Abril 2015, 21:45 PM
¡Ah!, entiendo: hay una limitación en el número de escalones que se pueden subir, de hasta 3.

Claro... muy poca gente podría dar un salto de muchos escalones para subir  :laugh:

Entonces, mis soluciones no sirven.

Pero... con dos pequeños cambios, ya vuelve a funcionar   ;D
Código (perl) [Seleccionar]
#!/usr/bin/perl
my $escalones = 0 + shift;                                      # leemos el número de escalones

if ($escalones > 0) {                                           # si es un número positivo
    my @combinaciones = descompon($escalones);                  # sacamos todas las @combinaciones
    print "Hay ", scalar(@combinaciones), " combinaciones:\n";  # informamos del número de @combinaciones
    print join('; ' => @combinaciones), "\n";                   # y las propias combinaciones
}

sub descompon {                                                 # devuelve una lista de combinaciones
    my $escalones = shift;                                      # para un determinado número de $escalones

    my @combinaciones;                                          # aquí guardaremos las @combinaciones encontradas

    for my $salto ( 1 .. 3 ) {                                  # damos un $salto cada vez mayor
        next if $salto > $escalones;
        my $resto = $escalones - $salto;                        # después del $salto, nos queda un $resto de $escalones

        if ( not $resto ) {                                     # si hemos llegado arriba
            push @combinaciones, $salto;                        # guardamos ese $salto como nueva combinación
        }
        else {                                                  # si aún no hemos llegado
            my @resto_combinaciones = descompon($resto);        # vemos todas las combinaciones que quedan para subir

            for my $combina_resto ( @resto_combinaciones ) {   
                                                                # y las guardamos
                push @combinaciones, join "," => $salto, $combina_resto;
            }
        }
    }

    return @combinaciones;                                      # devolvemos las @combinaciones encontradas
}

#64
Scripting / Re: duda ejercicio combinatoria
18 Abril 2015, 19:52 PM
Ya se me ha quejado alguno diciendo que mi solución es muy complicada  :xD

Aquí pongo la solución usando recursión.
Código (perl) [Seleccionar]
#!/usr/bin/env perl
my $escalones = 0 + shift; # leemos el número de escalones

if ($escalones > 0) { # si es un número positivo
    my @combinaciones = descompon($escalones); # sacamos todas las @combinaciones
    print "Hay ", scalar(@combinaciones), " combinaciones:\n"; # informamos del número de @combinaciones
    print join('; ' => @combinaciones), "\n"; # y las propias combinaciones
}

sub descompon() { # devuelve una lista de combinaciones
    my $escalones = shift; # para un determinado número de $escalones

    my @combinaciones; # aquí guardaremos las @combinaciones encontradas

    for my $salto (1 .. $escalones) { # damos un $salto cada vez mayor
my $resto = $escalones - $salto; # después del $salto, nos queda un $resto de $escalones

if (not $resto) { # si hemos llegado arriba
    push @combinaciones, $salto; # guardamos ese $salto como nueva combinación
}
else { # si aún no hemos llegado
    for my $combina_resto (descompon($resto)) { # vemos todas las combinaciones que quedan para subir
# y las guardamos
push @combinaciones, join "," => $salto, $combina_resto;
    }
}
    }

    return @combinaciones; # devolvemos las @combinaciones encontradas
}

Ejemplo:
$ ./descompon2.pl 6
Hay 32 combinaciones:
1,1,1,1,1,1; 1,1,1,1,2; 1,1,1,2,1; 1,1,1,3; 1,1,2,1,1; 1,1,2,2; 1,1,3,1; 1,1,4; 1,2,1,1,1; 1,2,1,2; 1,2,2,1; 1,2,3;
1,3,1,1; 1,3,2; 1,4,1; 1,5; 2,1,1,1,1; 2,1,1,2; 2,1,2,1; 2,1,3; 2,2,1,1; 2,2,2; 2,3,1; 2,4; 3,1,1,1; 3,1,2; 3,2,1;
3,3; 4,1,1; 4,2; 5,1; 6


Naturalmente, existen más soluciones... :silbar:
#65
Scripting / Re: duda ejercicio combinatoria
18 Abril 2015, 17:53 PM
Perdón, pero para subir 4 escalones a mi me salen 8 combinaciones:

4
3,1
2,2
2,1,1
1,3
1,2,1
1,1,2
1,1,1,1


Muestro aquí mi solución, usando el motor de expresiones regulares de Perl, realizando una búsqueda exhaustiva por todas las combinaciones, al provocar un fallo premeditado que obliga a que el motor haga "backtracking" y busque una nueva solución.

Como no sé mucho de Python, lo dejo en Perl, pero es fácil pasarlo a Python (creo). Primero, la versión que se puede ejecutar desde la línea de comandos:
Código (bash) [Seleccionar]
$ perl -E '$n = shift; $rx = ("(1*?)" x ($n-1)) . "(1+)"; $rx = qr/^$rx$/; $x = "1" x $n; $x =~ m/$rx(?{$visto{ join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$n }++ })(*FAIL)/; say join "; " => sort keys %visto' 4
1,1,1,1; 1,1,2; 1,2,1; 1,3; 2,1,1; 2,2; 3,1; 4

Y ahora la versión más normal:
Código (perl) [Seleccionar]
#!/usr/bin/env perl
use feature 'say';

my %visto; # memoria de combinaciones ya vistas (evitar repeticiones)

my $escalones = shift; # leemos los escalones

my $rx = ("(1*?)" x ($escalones-1)) . "(1+)"; # creamos el patrón de búsqueda. Es de la forma (1*?)(1*?)...(1+)
$rx = qr/^$rx$/;

my $x = "1" x $escalones; # esta var. contiene tantos '1' como indiquen los $escalones

$x =~ m/
$rx # buscamos una combinación
(?{
    $visto{ # la decodificamos
join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$escalones
    }++
})
(*FAIL) # provocamos un fallo de 'backtraking'
      /x;

say join "; " => sort keys %visto; # resultado, formateado


Ejemplo:
$ descompon.pl 5
1,1,1,1,1; 1,1,1,2; 1,1,2,1; 1,1,3; 1,2,1,1; 1,2,2; 1,3,1; 1,4; 2,1,1,1; 2,1,2; 2,2,1; 2,3; 3,1,1; 3,2; 4,1; 5
#66
Scripting / Re: CPAN Linux reinstalar
10 Abril 2015, 15:30 PM
El Perl oficial es el v5.14.2, ese es el que hay que salvar.

El que sea más o menos fácil quitar el v5.18.1 depende de cómo haya sido instalado. Como veo que está en /usr/local... puede que sea muy fácil, con solo cambiar de nombre o eliminar los directorios del v5.18.1.

Una vez hecho eso, entrar en aptitude y solicitar la reinstalación de perl y perl-base.
#67
Scripting / Re: CPAN Linux reinstalar
9 Abril 2015, 17:17 PM
1- No se te ocurra ejecutar el comando cpan salvo que seas el usuario root
2- Antes de instalar algo con cpan, ejecuta el aptitude para ver si lo que quieres instalar ya estaba paquetizado (también como root, claro)

Si te dice que un usuario normal no puede acceder a feature.pm, significa que el directorio donde está ese módulo no es accesible a ese usuario, seguramente por temas de permisos.

/usr/local/lib/perl5/5.18.1/feature.pm
/usr/share/perl/5.14.2/feature.pm

Esto muestra que... ¡desastre! tienes dos Perl instalados. El v5.14.2 y el v5.18.1.

Destrucción, caos, hambre, plagas y demás serán minucias con lo que pasará en esa máquina.

Mira, mira. El propio Perl te lo dice:

root@srvsmc:/usr/local/nagios/libexec# cpan
Perl lib version (5.14.2) doesn't match executable '/usr/local/bin/cpan' version (v5.18.1) at /usr/lib/perl/5.14.2/Config.pm line 60.
root@srvsmc:/usr/local/nagios/libexec#  perl -E 'use strict; say $INC{"strict.pm"}'
/usr/local/lib/perl5/5.18.1/strict.pm

Estas líneas demuestran que el -primer- perl que se encuentra en la ruta del $PATH es el v5.14.2, pero las primeras bibliotecas que encuentra son las del v5.18.1.

Esto es algo así como tener el Java de Oracle y el OpenJDK instalados a la vez: diversión asegurada :D

Mi recomendación es... reinstalar todo el sistema.

La otra opción es... entrar con bisturí y fórceps y expulsar el Perl invasor (en tu caso, el v5.18.1). Y sin garantías de supervivencia del paciente.

Yo suelo realizar este tipo de operaciones a CPU abierta (sistemas de producción que no pueden parar), así que si necesitáis ayuda profesional, pues aquí estamos.
#68
Scripting / Re: Python mezclado con ASM
8 Abril 2015, 17:43 PM
¿Errores? ¿Qué errores?
#69
Scripting / Re: CPAN Linux reinstalar
7 Abril 2015, 14:23 PM
Para comprobar que está bien instalado, ejecuta

$ perl -E 'use strict; say $INC{"strict.pm"}'
/usr/share/perl/5.18/strict.pm


strict.pm es un módulo que viene incluido en la propia distribución de Perl, así que se instala cuando se instala Perl (que es lo mismo que decir que cuando se instala el sistema).

El error que sale es porque Perl no lo encuentra. Es decir: que en cualquiera de las rutas indicadas por el array especial @INC, no lo encuentra.

Las rutas en las que busca ese módulo son las indicadas en el error, y que se pueden ver así:

$ perl -E 'say for @INC'
/opt/oracle/instantclient_12_1/DBD-Oracle-1.74/lib/DBD/
/etc/perl
/usr/local/lib/perl/5.18.2
/usr/local/share/perl/5.18.2
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.18
/usr/share/perl/5.18
/usr/local/lib/site_perl


En el ordenador donde estoy ahora, que también tiene Perl v5.18.2, las rutas son las mismas, y puedo localizar la posición de strict.pm:

$ locate strict.pm
/home/explorer/Documentos/Desarrollo/perl/lib/strict.pm
/home/explorer/Proyectos/perlspanish/old/perlspanish.5.16.2/perl/lib/strict.pm
/home/explorer/perl5/perlbrew/build/perl-5.20.0/lib/strict.pm
/home/explorer/perl5/perlbrew/perls/perl-5.20.0/lib/5.20.0/strict.pm
/usr/share/perl/5.18.2/strict.pm


De todas ellas, la original es la última, /usr/share/perl/5.18.2/strict.pm, y esa ruta sí que está en las incluidas de @INC, así que Perl en mi sistema sí que lo localiza.

Debes ver en qué parte del disco de tu ordenador está el strict.pm.