Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

looking for a module to handle 'highscore' lists

by domm (Chaplain)
on Mar 20, 2005 at 15:57 UTC ( #441021=perlquestion: print w/replies, xml ) Need Help??
domm has asked for the wisdom of the Perl Monks concerning the following question:

I'm currently planning to add a new feature to the CPANTS site: I want the list of 'top' authors to list the previous ranking of an author (like in music charts). Additionally, I want authors with the same average kwalitee listed on the same 'spot' ('ex aequo', as in results of eg downhill skiing)

Are there modules on CPAN that calculate somthing like this?

Given an input like:

[ [RUBYKAT,15.97], [SAPER,15.78], [PETDANCE,15.5], [AMBS,15.5], [BARBIE,15.45], ... ]
I would like output like this:
(where ^ and v should be up/down arrows representing a change to the previous status.)

If there isn't a module (or several doing parts of this), I'll probably roll my own. Any naming suggestions?

-- #!/usr/bin/perl for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}

Replies are listed 'Best First'.
Re: looking for a module to handle 'highscore' lists
by jbrugger (Parson) on Mar 20, 2005 at 16:25 UTC
    I think Statistics::Lite could help you, it's pure perl and easy to use.
    Else, a simple sort algorithm should help you, if you have your data stored in a hash like
    # untested... %list = ( RUBYKAT=>15.97 , SAPER=>15.78 , PETDANCE=>15.5 , AMBS=>15.5 , BARBIE=>15.45 , ); sub sortDesc { $list{$b} <=> $list{$a}; } foreach $key (sort sortDesc (keys(%list))) { print "$list{$key} \t $key \n"; }

    but i don't think there is a specific cpan module available to this.
    anyway, i would not use an array of arrays for this.
    "We all agree on the necessity of compromise. We just can't agree on when it's necessary to compromise." - Larry Wall.
Re: looking for a module to handle 'highscore' lists
by TedPride (Priest) on Mar 20, 2005 at 17:01 UTC
    EDIT: Oops, had to update code for people with identical scores, and people who weren't on previous listing.
    use strict; use warnings; my (%lrank, $c, $s, $name, $score, $lrank, $lscore); my @lrank = ('RUBYKAT','SAPER','PETDANCE','AMBS','BARBIE'); my @nrank = ( ['PETDANCE',12.4], ['SAPER',15.78], ['AMBS',15.5], ['RUBYKAT',15.97], ['BARBIE',16.06], ['NEWBIE',12.4], ); $lrank{$_} = $c++ for @lrank; $s = '%' . (length($#nrank+1)+1) . 's'; @nrank = sort {@$b[1] <=> @$a[1] || @$a[0] cmp @$b[0]} @nrank; $c = 0; $lscore = 0; for (@nrank) { ($name, $score) = @$_; if (exists $lrank{$name}) { $lrank = $lrank{$name}; print $lrank > $c ? '^' : $lrank < $c ? 'v' : ' '; } else { print ' '; } print sprintf $s, $lscore == $score ? '' : $c; print ": $name\n"; $lscore = $score; $c++; }
    Note that people of the same score are currently sorted alphabetically. Could be you'd want them sorted according to first come, first served, in which case a more complicated algorithm would be necessary.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://441021]
Approved by davidj
[Corion]: marto: Oh, I'm jealous. I'm going to see DM in Frankfurt, but it's a stadium full of people, so, rather a big thing where you mostly get to see the band on screens ;)
[marto]: yes, the last time I saw them was in Berlin a few years ago, at the old Olympic stadium
[marto]: After Sunday I don't think I'll go see them again :)
[LanX]: Corion: come on, people are people! ;)
[Corion]: Naah, I think it's still an OK show so far. Their new songs aren't exactly great, but I'm not going there for new material anyway ;)

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (14)
As of 2017-03-24 11:36 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (301 votes). Check out past polls.