Recordes

Recordes

Fácil

Instruções

Gerencie a lista de maiores pontuações de um jogador.

Sua tarefa é construir um component de pontuação do clássico Frogger, um dos jogos mais vendidos e mais viciantes de todos os tempos, e um clássico da era dos fliperamas. Você vai escrever métodos que retornem a maior pontuação da lista, a última pontuação adicionada e as três maiores pontuações.

Ordenação em AWK

Este exercício exige que a saída seja ordenada de uma forma específica. Como em muitas linguagens de programação, iterar sobre um array acontece em uma ordem que depende da implementação e que parece aleatória. Normalmente, não é isso que as pessoas querem ver. O GNU awk oferece alguns recursos 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 em questão no próprio local.

    Isso é mais útil para arrays indexados numericamente. O processo que preenche o array sorted descarta os índices originais do array: o array sorted é 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" 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 em uma ordem específica.

    O array interno PROCINFO contém muitas informações sobre o processo awk em execução. Um elemento interessante desse array é sorted_in. O valor dessa chave do array é o nome de uma função que controla a ordem em que os índices do array serão processados pelos laços for (indx in array).

    A função pode ser o nome de uma função definida por você, ou você pode usar algumas funções de ordenação predefinidas bem práticas, entre elas:

    • "@ind_str_asc", "@ind_str_desc": ordenam o array pelo índice, em ordem alfabética, crescente ou decrescente.
    • "@ind_num_asc", "@ind_num_desc": ordenam o array pelo índice, em ordem numérica, crescente ou decrescente.
    • "@val_str_asc", "@val_str_desc": ordenam o array pelo valor, em ordem alfabética, crescente ou decrescente.
    • "@val_num_asc", "@val_num_desc": ordenam o array pelo valor, em ordem numérica, crescente ou decrescente.

    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
    

    Esse método permite evitar o array temporário sorted e o valor de retorno n. Simples e organizado.

Função de ordenação definida por você

A função de ordenação definida por você 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 de retorno é:

  • 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 ordem relativa entre eles é indefinida.

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

Referências


Fonte

Tributo ao jogo de arcade Frogger dos anos oitenta
Editar via GitHub O link abre em uma nova janela ou aba
AWK Exercism

Tudo pronto para começar Recordes?

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