• Publicidad

Cómo separar los números de una cifra

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cómo separar los números de una cifra

Notapor BigBear » 2009-08-29 17:46 @782

Hola estoy tratando de separar de manera par los números de una cifra pero no sé cómo hacerlo.

Lo que pretendo hacer es esto

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Cifra = 480102304

Resultado = 4
            0
            0
            3
            4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Agradecería cualquier ayuda.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Cómo separar los números de una cifra

Notapor explorer » 2009-08-29 20:38 @901

Bueno, yo veo que en realidad estás sacando las cifras de las posiciones impares (siempre y cuando las cifras se numeren desde la derecha).

Con un poco de matemáticas, la solución es muy sencilla:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cifra = '480102304';
  7.  
  8. $cifra = reverse $cifra;
  9.  
  10. my @cifras;
  11.  
  12. for (my $i = 0; $i <= length $cifra; $i += 2) {
  13.     unshift @cifras, substr($cifra, $i, 1);
  14. }
  15.  
  16. print "@cifras";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

A la cifra le damos la vuelta (reverse()) para que el dígito que está en la primera posición accedamos a él como si estuviera en la posición 0 (la primera), con la función substr(). Sin esto, habría que hacer otra cuenta dentro de substr() para saber a qué dígito nos referimos.

Luego recorremos las cifras, de dos en dos.

Y para cada cifra, la extraemos y la guardamos en el arreglo, en orden inverso (deshacemos de alguna manera el efecto del reverse() anterior). Con unshift() estamos metiendo las cifras por la parte 'izquierda' del arreglo.

Ya solo queda pintarlo.

Y esta es una de la media docena de formas de hacerlo... ¿Alguien más se anima? :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo separar los números de una cifra

Notapor netsoul » 2009-08-30 01:33 @106

También usé un poco de matemáticas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my @cifra = split //, "480102304"; #Almacenamos cada dígito en cada lugar de @cifra
  6.  
  7. print map {$cifra[$_] if !($_ % 2)} 0..$#cifra; #Imprimimos si la posición es (im)par
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No sé si el código es bueno, pero espero que pueda valer. :)
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo separar los números de una cifra

Notapor explorer » 2009-08-30 09:29 @437

Esta es la solución con expresiones regulares

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cifra = '480102304';
  7.  
  8. $cifra = reverse $cifra;
  9.  
  10. my @cifras;
  11.  
  12. while ($cifra =~ /(\d)\d?/g) {
  13.  
  14.     unshift @cifras, $1;
  15. }
  16.  
  17. print "@cifras";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


que puede quedar reducida a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $cifra  = reverse '480102304';          # Le damos la vuelta para contar desde la derecha
  3. my @cifras = reverse $cifra =~ /(\d)\d?/g; # De cada grupo de dos dígitos, nos quedamos con el primero
  4.                                            # A todos ellos, les invertimos de orden (reverse)
  5.                                            # por exigencias del formato de salida,
  6.                                            # y los guardamos en @cifras
  7. print "@cifras";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

(Sí, es algo "enrevesada" :) )

¡Ánimo, quedan más formas de resolverlo!

¿Alguien más se anima?

P.D. La solución de netsoul no vale porque empieza a contar los dígitos desde el lado izquierdo :twisted: Le falta un reverse() :wink:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo separar los números de una cifra

Notapor netsoul » 2009-08-30 10:31 @480

Este explorer es un cabrón. Si él fuera mi jefe en una empresa, ya me hubiera despedido antes de pestañear dos veces. :twisted:

Aquí va otro:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $cifra = reverse "480102304";
  6. print reverse map {substr $cifra, $_, 1 if !($_ % 2)} 0..length $cifra;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo separar los números de una cifra

Notapor explorer » 2009-08-30 13:26 @601

He encontrado un patrón de búsqueda de los dígitos que se buscan.

Se trata de pensar en ir de dos en dos dígitos, de izquierda a derecha, mostrando el segundo de ellos. Hay una excepción a la regla, que es el primer dígito de la cifra, el que está a la izquierda. Podría estar ocupando una posición par o no. Para saberlo, debemos asegurarnos que los dígitos que quedan detrás de él forman pares de dígitos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cifra = '480102304';
  7.  
  8. print $1 while $cifra =~ /(\d)(?=(?:\d\d)*$)/gx;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Un poco mejor explicado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $cifra = '480102304';
  7.  
  8. while (
  9.     $cifra =~ /
  10.                 (\d)                # Solo nos quedamos con el primer dígito
  11.                 (?=                 # que esté seguido
  12.                     (?:\d\d)*       #   por pares de dígitos
  13.                     $               #   hasta el final
  14.                 )
  15.               /gx                   # (la opción /x nos permite hacer este ascii-art)
  16. ) {
  17.     print $1;
  18. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ya no es necesario usar los reverse() :)
Última edición por explorer el 2009-08-30 13:35 @608, editado 2 veces en total
Razón: Reducido y mejor explicado
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo separar los números de una cifra

Notapor netsoul » 2009-08-30 15:59 @707

Aquí va más uno. Presento la versión 3.0. Los anteriores tenían algunas fallas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my @cifra = split '', reverse "480102304";
  6.  
  7. print reverse map {$cifra[$_] if /[02648]$/} 0..$#cifra;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo separar los números de una cifra

Notapor BigBear » 2009-08-30 19:34 @857

Ok, teniendo cualquiera de sus diversos códigos competitivos, ¿cómo haría para separarlos y multiplicarlos de a dos? Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
4x5
4x6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Y tener el resultado guardado con un my() para poder ver si éstos son mayor que 9?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Cómo separar los números de una cifra

Notapor netsoul » 2009-08-30 22:21 @972

¿Un código?
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo separar los números de una cifra

Notapor BigBear » 2009-08-31 17:46 @782

Pues en realidad un pequeño script. Disculpen si les estoy pidiendo demasiado, pero es lo único que me falta para terminar un extenso proyecto en el que estoy.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron