Matriz

Matriz

Médio

Instruções

Dada uma string que representa uma matriz de números, retorne as linhas e as colunas dessa matriz.

Então, dada uma string com quebras de linha embutidas como:

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

seu código deve ser capaz de produzir:

  • Uma lista das linhas, lendo cada linha da esquerda para a direita enquanto percorre as linhas de cima para baixo,
  • Uma lista das colunas, lendo cada coluna de cima para baixo enquanto percorre da esquerda para a direita.

As linhas da nossa matriz de exemplo:

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

E as colunas dela:

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

Novos conceitos de AWK

Este é o primeiro exercício em que a solução não é um script "main". O objetivo é escrever uma biblioteca de funções para serem incluídas em outros programas awk. Há vários conceitos novos e interessantes para conhecer neste exercício.

As seções a seguir, marcadas com "(gawk)", são extensões específicas do GNU awk.

Ler de um arquivo

Neste exercício, você vai ler dados de um arquivo, e não do fluxo de entrada principal. Leia sobre getline no manual do Gnu awk, em particular as formas Getline/File e Getline/Variable/File.

Mais sobre arrays

Um array bidimensional pode ser uma forma de implementar esta solução. O GNU awk tem duas maneiras de representar um:

Arquivos de inclusão (gawk)

Repare na diretiva @include no arquivo de teste. Ela instrui o gawk a ler e avaliar o arquivo indicado.

Namespaces (gawk)

Todas as variáveis do awk são globais (exceto os parâmetros de função, que são locais da função). Há um grande potencial de colisões de nomes, principalmente quando bibliotecas de terceiros são incluídas. Namespaces são uma forma de particionar onde as variáveis ficam armazenadas. Repare na diretiva @namespace nos arquivos do exercício.

O namespace padrão se chama "awk". Ter um namespace padrão permite que o programador chame uma função nativa do awk de dentro de uma função em outro namespace.

Como os parâmetros de função são passados

Parâmetros do tipo array são passados por referência. As alterações feitas no array dentro da função são visíveis para quem chamou a função.

Parâmetros que não são arrays são passados por valor.

Para parâmetros untyped, tudo depende do que a função faz com eles:

  • se a função o inicializa como um array, ele se torna um parâmetro passado por referência,
  • se a função o inicializa como um valor escalar (um número ou uma string), então ele não é uma referência.

Todos os detalhes estão no manual, em Passando argumentos de função por valor ou por referência.

Variáveis locais

Variáveis locais (com escopo de função) podem ser criadas usando parâmetros passados por valor. Não é um erro passar menos valores para uma função do que o número de parâmetros listados; os parâmetros excedentes ficam "untyped" até serem usados. Eles ficam disponíveis para receber, na função, valores escalares que não são armazenados no namespace global.

  • Se você atribuir um valor escalar a um parâmetro, ele é local da função.
  • Se você atribuir um escalar a uma variável que não está na lista de parâmetros, essa variável é global.

Por convenção, na assinatura da função os parâmetros esperados aparecem primeiro, seguidos de um espaço em branco e depois dos parâmetros locais. Um exemplo:

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 via GitHub O link abre em uma nova janela ou aba
AWK Exercism

Tudo pronto para começar Matriz?

Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.