Matriz

Matriz

Intermedia

Instrucciones

Dado un string que representa una matriz de números, devuelve las filas y las columnas de esa matriz.

Así, dado un string con saltos de línea incrustados como este:

9 8 7
5 3 2
6 6 7

que representa esta matriz:

    1  2  3
  |---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7

tu código debería poder darte:

  • Un array con las filas, leyendo cada fila de izquierda a derecha mientras avanzas de arriba a abajo por las filas,
  • Un array con las columnas, leyendo cada columna de arriba a abajo mientras avanzas de izquierda a derecha.

Las filas de nuestra matriz de ejemplo:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

Y sus columnas:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

Conceptos nuevos de AWK

Este es el primer ejercicio donde la solución no es un script «main». El objetivo es escribir una biblioteca de funciones que se puedan incluir en otros programas de awk. En este ejercicio hay varios conceptos nuevos e interesantes que ver.

Las siguientes secciones marcadas con «(gawk)» son extensiones específicas de GNU awk.

Leer desde un archivo

En este ejercicio vas a leer datos de un archivo, no del flujo de entrada principal. Lee sobre getline en el manual de Gnu awk, en particular las formas Getline/File y Getline/Variable/File.

Más sobre los arrays

Un array bidimensional podría ser una forma de implementar esta solución. GNU awk tiene dos formas de representarlo:

Archivos incluidos (gawk)

Fíjate en la directiva @include del archivo de pruebas. Esto le indica a gawk que lea y evalúe el archivo nombrado.

Espacios de nombres (gawk)

Todas las variables de awk son globales (excepto los parámetros de una función, que son locales a la función). Hay una gran probabilidad de colisiones de nombres, sobre todo cuando se incluyen bibliotecas de terceros. Los espacios de nombres son una forma de delimitar dónde se almacenan las variables. Fíjate en la directiva @namespace en los archivos del ejercicio.

El espacio de nombres predeterminado se llama «awk». Tener un espacio de nombres predeterminado permite que quien programa llame a una función integrada de awk desde dentro de una función que está en otro espacio de nombres.

Cómo se pasan los parámetros de una función

Los parámetros de tipo array se pasan por referencia. Los cambios que se hagan al array dentro de la función son visibles para quien la llamó.

Los parámetros que no son arrays se pasan por valor.

Para los parámetros sin tipo, depende de lo que la función haga con ellos:

  • si la función lo inicializa como un array, entonces se convierte en un parámetro pasado por referencia,
  • si la función lo inicializa como un valor escalar (un número o un string), entonces no es una referencia.

Encontrarás todos los detalles en el manual, en Paso de argumentos de función por valor o por referencia.

Variables locales

Las variables locales (con ámbito de función) se pueden crear usando parámetros «por valor». No es un error pasar a una función menos valores que el número de parámetros listados; los parámetros sobrantes quedan «sin tipo» hasta que se usen. Están disponibles para que se les asignen valores escalares dentro de la función que no se almacenan en el espacio de nombres global.

  • Si le asignas un valor escalar a un parámetro, ese valor es local a la función.
  • Si le asignas un escalar a una variable que no aparece en la lista de parámetros, esa variable es global.

Por convención, en la firma de la función primero aparecen los parámetros esperados, luego un espacio en blanco y después los parámetros locales. Un ejemplo:

function add(a, b,    total) {
    # here, `typeof(total)` is "untyped"
    total = a + b
    # now, `typeof(total)` is "number"
    return total
}

BEGIN {
    sum = add(5, 10)
    print sum             # 15
    print typeof(total)   # untyped, meaning "total" is unused in this scope
}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
AWK Exercism

¿Todo listo para empezar Matriz?

Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.