Percursos
/
AWK
AWK
/
Exercícios
/
Melhores pontuações
Melhores pontuações

Melhores pontuações

Fácil

Instruções

Gere a lista de pontuações altas de um jogador.

A tua tarefa é criar o component de pontuação alta do clássico jogo Frogger, um dos jogos mais vendidos e mais viciantes de todos os tempos e um clássico da era dos jogos de arcada. A tua tarefa é escrever métodos que devolvem a pontuação mais alta da lista, a última pontuação adicionada e as três pontuações mais altas.

Ordenação em AWK

Este exercício exige que o resultado seja ordenado de uma forma específica. Tal como em muitas linguagens de programação, iterar sobre um array segue uma ordem que depende da implementação e que parece aleatória. Normalmente, não é isto que queremos ver. O GNU awk disponibiliza algumas funcionalidades de ordenação.

  1. asort: ordena um array indexado numericamente com base nos valores do array.

    #!gawk 
    BEGIN {
        for (i = 1; i <= 5; i++)
            nums[i] = int(100 * rand())
    
        # returns the array size
        n = asort(nums, sorted)
    
        for (i = 1; i <= n; i++)
            print i, nums[i], sorted[i]
    }
    

    que produz

    1 92 30
    2 59 57
    3 30 59
    4 57 74
    5 74 92
    

    A forma n = asort(array) ordena o array indicado no próprio local.

    Isto é especialmente útil para arrays indexados numericamente. O processo que preenche o array sorted descarta os índices originais do array: o array sorted fica indexado de 1 a n.

  2. asorti: ordena um array com base nos índices do array.

    A função asorti preenche um array de "destino" com os índices do array de "origem", já ordenados.

    #!gawk
    BEGIN {
        nums["foo"] = int(100 * rand())
        nums["bar"] = int(100 * rand())
        nums["qux"] = int(100 * rand())
    
        print "unordered"
        for (i in nums)
            print i, nums[i]
    
        print "ordered by index"
        n = asorti(nums, sorted)
        for (i = 1; i <= n; i++)
            print sorted[i], nums[sorted[i]]
    }
    

    que produz

    unordered
    foo 92
    qux 30
    bar 59
    ordered by index
    bar 59
    foo 92
    qux 30
    
  3. PROCINFO["sorted_in"]: percorre um array numa ordem especificada.

    O array incorporado PROCINFO contém muita informação sobre o processo awk em execução. Um elemento interessante deste array é sorted_in. O valor desta chave do array é o nome de uma função que controla a ordem pela qual os índices do array são processados pelos ciclos for (indx in array).

    A função pode ser o nome de uma função definida pelo utilizador, ou podes usar algumas funções de ordenação predefinidas bastante úteis, entre as quais:

    • "@ind_str_asc", "@ind_str_desc" - ordena o array por índice; usa ordenação alfabética; ordem ascendente ou descendente.
    • "@ind_num_asc", "@ind_num_desc" - ordena o array por índice; usa ordenação numérica; ordem ascendente ou descendente.
    • "@val_str_asc", "@val_str_desc" - ordena o array por valor; usa ordenação alfabética; ordem ascendente ou descendente.
    • "@val_num_asc", "@val_num_desc" - ordena o array por valor; usa ordenação numérica; ordem ascendente ou descendente.

    O exemplo de asort acima pode ser implementado assim:

    PROCINFO["sorted_in"] = "@val_num_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    3 30
    4 57
    2 59
    5 74
    1 92
    

    O exemplo de asorti pode ser escrito assim:

    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    bar 59
    foo 92
    qux 30
    

    Este método permite-nos evitar o array temporário sorted e o valor devolvido n. Simples e limpo.

Função de ordenação definida pelo utilizador

A função de ordenação definida pelo utilizador recebe 4 parâmetros: o índice e o valor de um elemento do array e o índice e o valor de outro elemento do array:

function compare(idx1, val1, idx2, val2) {...}

O valor devolvido é:

  • menor que zero: idx1 vem antes de idx2
  • maior que zero: idx1 vem depois de idx2
  • zero: os índices têm a mesma precedência de ordenação, mas a sua ordem relativa é indefinida.

Além de PROCINFO["sorted_in"] para controlar a ordem do ciclo for (idx in array), tanto asort como asorti podem receber o nome de uma função de comparação como terceiro parâmetro.

Referências


Fonte

Uma homenagem ao jogo de arcada Frogger, dos anos oitenta
Editar via GitHub A ligação abre numa nova janela ou separador
AWK Exercism

Estás pronto para começar Melhores pontuações?

Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.