• Publicidad

Mayor que un múltiplo de tres

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

Mayor que un múltiplo de tres

Notapor colorado » 2011-04-17 05:01 @250

Tengo las siguientes líneas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i ( 1 .. 9 ) {
  2.  
  3.     $p = ( 0 + $i - 1 );
  4.     if ( $i > 3 ) {
  5.         $p = ( ++$p - 3 );
  6.     }
  7.     if ( $i > 6 ) {
  8.         $p = ( ++$p - 3 );
  9.     }
  10.     if ( $i > 9 ) {
  11.         $p = ( ++$p - 3 );
  12.     }
  13.  
  14.     print $p, " ";
  15.  
  16. }
  17.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


salida:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0 1 2 1 2 3 2 3 4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Bien, funciona como quiero, pero si el bucle es mucho más largo (for my $i ( 1 .. 200 )), tendría que incluir cientos de líneas.

Como 3,6,9... son múltiplos de tres, me figuro que hay una solución sencilla.

0 == $i % 3 esta línea me definiría los múltiplos de tres.

Así que intenté esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i ( 1 .. 9 ) {
  2.  
  3.     $p = ( 0 + $i - 1 );
  4.     if ( $i > ( 0 == $i % 3 ) ) {
  5.         $p = ( ++$p - 3 );
  6.     }
  7.  
  8.     print $p, " ";
  9.  
  10. }
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero me da esta salida:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-2 -1 0 1 2 3 4 5 6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Cómo puedo realizarlo?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Publicidad

Re: Mayor que un múltiplo de tres

Notapor explorer » 2011-04-17 08:32 @397

Para evitar que salgan negativos, te vale con comprobar si $i > 3.

Y en el

if ( $i > ( 0 == $i % 3 ) )

fíjate que estás comparando si $i es mayor que una comprobación (que siempre valdrá 0 o 1). En realidad, esa comprobación la puedes reducir a

if ( 0 == $i % 3 )

Es decir, es verdadero si $i es múltiplo de 3.

Juntando las dos condiciones, tenemos

if ( $i > 3 and 0 == $i % 3 )
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Mayor que un múltiplo de tres

Notapor colorado » 2011-04-17 09:06 @421

Gracias explorer, pero sigue sin funcionar.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i ( 1 .. 9 ) {
  2.  
  3.     $p = ( 0 + $i - 1 );
  4.     if ( $i > 3 and 0 == $i % 3 ){
  5.         $p = ( ++$p - 3 );
  6.     }
  7.  
  8.     print $p, " ";
  9.  
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

la salida que me da es:

0 1 2 3 4 3 6 7 6

y necesito que me dé:

0 1 2 1 2 3 2 3 4
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Mayor que un múltiplo de tres

Notapor explorer » 2011-04-17 09:32 @439

Por lo que veo, se trata de recorrer una secuencia de tres números consecutivos, incrementándose en uno cada vez.

Quizás la solución sea tan sencilla como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for(my $i = 0; $i < 200; $i++) {
  2.     print $i  , " ";
  3.     print $i+1, " ";
  4.     print $i+2, " ";
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Mayor que un múltiplo de tres

Notapor colorado » 2011-04-17 10:15 @468

Por lo que veo, se trata de recorrer una secuencia de tres números consecutivos, incrementándose en uno cada vez.


Sí, así es, pero hasta un máximo total al del bucle.

Por ejemplo si la línea for my $i ( 1 .. 9 )

La salida de tu script es:
0 1 2 1 2 3 2 3 4 3 4 5 4 5 6 5 6 7 6 7 8 7 8 9 8 9 10

y necesito que me dé:

0 1 2 1 2 3 2 3 4

No quería cambiar esto:

for my $i ( 1 .. 9 )

ya que ese bucle, en mi código final ejecuta otras cosas.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Mayor que un múltiplo de tres

Notapor explorer » 2011-04-17 17:31 @771

Puedes generar la secuencia antes, guardarla en un array, y luego recuperarla en un bucle, en la longitud que quieras.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @secuencia;
  2.  
  3. for my $i (0 .. 200) {
  4.     push @secuencia, $i, $i+1, $i+2;
  5. }
  6.  
  7. for my $i (0 .. 8) {
  8.     print "$secuencia[$i] ";
  9. }
  10.  
  11. print;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Mayor que un múltiplo de tres

Notapor colorado » 2011-04-18 15:56 @705

Me gusta la solución que le diste, pero...
¿se puede hacer si los números están guardados en un archivo?

Es que me estoy liando al intentar aplicarlo.

Me explico: imaginemos que tenemos un archivo con los números del 1 al 200, y que el archivo se llama numeros.txt.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (NUMEROS, 'numeros.txt');
  2. my @NUMEROS = <NUMEROS>;
  3. chomp @NUMEROS;
  4. close(NUMEROS);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Cómo puedo aplicarlo si los números son leídos y no generados?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Mayor que un múltiplo de tres

Notapor explorer » 2011-04-18 16:25 @726

En aquella parte del programa donde necesites acceder a estos números, sustituyes el código que tenías para calcularle, por un simple $p = shift(@NUMEROS);, y así obtendrás, cada vez, un valor distinto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Mayor que un múltiplo de tres

Notapor colorado » 2011-04-18 17:20 @764

¡bufff!, perdona mi torpeza, pero ahora sí me perdí totalmente :oops: .
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Mayor que un múltiplo de tres

Notapor explorer » 2011-04-18 18:19 @805

Pues que primero lees los números desde el fichero tal y como has mostrado antes, metiéndolos en el array.

Ahora solo queda irlos sacando a medida de que los vayas necesitando. Una forma de hacerlo es con la función shift(), que extrae el primer elemento de un array.

Eso también quiere decir que el array es modificado (se va reduciendo en un elemento cada vez). Si vas a necesitar usar el array más de una vez, guarda el array de los números en otro temporal, del que sacarás copia cada vez que necesites reiniciar la lista de números.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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