• Publicidad

Detectar espacios en blanco en una matriz

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

Detectar espacios en blanco en una matriz

Notapor jairo15 » 2016-11-10 10:27 @477

En una matriz de n × n, ¿cómo puedo detectar e imprimirlos?

Por ejemplo que quede así: 1 1 2, siendo esos números espacios NO vacíos, que es así: 1 espacio en uso, espacio vacío, espacio en blanco, luego 2 espacios en uso.

Siendo esto una variación, ya que son aleatorios los espacios usados.

Espero haberme explicado bien.
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Publicidad

Re: Detectar espacios en blanco en una matriz

Notapor explorer » 2016-11-10 10:42 @488

Pues... no queda muy claro... (¿es algún tiempo de compresión?).

Puedes encontrar los espacios vacíos haciendo comparaciones con if(), recorriendo todos los elementos.
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: Detectar espacios en blanco en una matriz

Notapor jairo15 » 2016-11-10 11:03 @502

Un ejemplo de lo que quiero hacer es este:
Matriz de 5×5:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
H X X O X   1 1
X L X X A   1 1
C O X X M   2 1
O X E S X   1 2
T A S X X   3

1 2 2 1 2
3 1   1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Siendo 'X' un espacio en blanco y los números en los costados los espacios en uso y la frase: "Hola como estas".
Última edición por jairo15 el 2016-11-10 23:15 @010, editado 1 vez en total
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Re: Detectar espacios en blanco en una matriz

Notapor explorer » 2016-11-11 06:55 @330

El siguiente programa resuelve el problema, resolviendo primera para las filas, y luego resolviendo para las columnas, previo cálculo de la transformada de la matriz (esto no siempre se puede hacer según el tamaño de la matriz en memoria).

El procesamiento de cada fila (y columna) se realiza buscando conjuntos de caracteres que no sean "X".
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.22;
  3. use experimental 'signatures';
  4.  
  5. ## PROGRAMA
  6. # Leemos la matriz
  7. my @matriz;
  8.  
  9. while (my $linea = <DATA>) {
  10.     chomp $linea;
  11.     next if not $linea;
  12.  
  13.     push @matriz, [ split " ", $linea ];
  14. }
  15.  
  16. use Data::Dump;
  17. dd @matriz;
  18.  
  19. # Cálculo de las filas
  20. # recorremos las filas, las convertimos a cadenas, y le pasamos una expresión regular que busca lo que queremos
  21. say "Resultado por filas";
  22. for my $fila_array_ref (@matriz) {
  23.     say procesa_fila(@$fila_array_ref);
  24. }
  25.  
  26. # Cálculo de la transpuesta de la matriz
  27. # recorremos toda la matriz, creando una transpuesta
  28. my @matriz_transpuesta;
  29.  
  30. for my $fila_array_ref (@matriz) {
  31.     while (my($f, $v) = each @$fila_array_ref) {
  32.         push @{ $matriz_transpuesta[$f] }, $v;
  33.     }
  34. }
  35.  
  36. dd @matriz_transpuesta;
  37.  
  38. # Cálculo de las columnas
  39. say "Resultado por columnas";
  40. for my $columna_array_ref (@matriz_transpuesta) {
  41.     say procesa_fila(@$columna_array_ref);
  42. }
  43.  
  44.  
  45.  
  46. ## SUBRUTINAS
  47. # procesa una fila de elementos
  48. sub procesa_fila(@elementos) {
  49.     my $fila = join '' => @elementos;
  50.  
  51.     my @resultado;
  52.  
  53.     while ($fila =~ /[^X]+/g) {                 # buscamos, de forma repetida, conjuntos de caracteres que no sean "X"
  54.         push @resultado, length $&;             # el resultado es la longitud de esos conjuntos
  55.     }
  56.  
  57.     return $fila, "  ", join " " => @resultado;
  58. }
  59.  
  60. ## DATOS
  61. __DATA__
  62. H X X O X
  63. X L X X A
  64. C O X X M
  65. O X E S X
  66. T A S X X
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
(
  ["H", "X", "X", "O", "X"],
  ["X", "L", "X", "X", "A"],
  ["C", "O", "X", "X", "M"],
  ["O", "X", "E", "S", "X"],
  ["T", "A", "S", "X", "X"],
)
Resultado por filas
HXXOX  1 1
XLXXA  1 1
COXXM  2 1
OXESX  1 2
TASXX  3
(
  ["H", "X", "C", "O", "T"],
  ["X", "L", "O", "X", "A"],
  ["X", "X", "X", "E", "S"],
  ["O", "X", "X", "S", "X"],
  ["X", "A", "M", "X", "X"],
)
Resultado por columnas
HXCOT  1 3
XLOXA  2 1
XXXES  2
OXXSX  1 1
XAMXX  2
Coloreado en 0.000 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron