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:
As linhas da nossa matriz de exemplo:
E as colunas dela:
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.
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.
Um array bidimensional pode ser uma forma de implementar esta solução. O GNU awk tem duas maneiras de representar um:
Repare na diretiva @include no arquivo de teste.
Ela instrui o gawk a ler e avaliar o arquivo indicado.
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.
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:
Todos os detalhes estão no manual, em Passando argumentos de função por valor ou por referência.
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.
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
}
Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.