Página 1 de 1

Detectar espacios en blanco en una matriz

NotaPublicado: 2016-11-10 10:27 @477
por jairo15
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.

Re: Detectar espacios en blanco en una matriz

NotaPublicado: 2016-11-10 10:42 @488
por explorer
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.

Re: Detectar espacios en blanco en una matriz

NotaPublicado: 2016-11-10 11:03 @502
por jairo15
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".

Re: Detectar espacios en blanco en una matriz

NotaPublicado: 2016-11-11 06:55 @330
por explorer
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.003 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