Städte-Ranglisten TOP 10

Moderators: Miles66, Licht & Feuer

brutha

Post by brutha »

notitz an mich selbst:
-> zwischen 8 und ) ein blank lassen
-> im forum anmelden
-> ...
User avatar
Gauss
Forum Moderator
Forum Moderator
Posts: 1685
Joined: Tue Feb 25, 2003 11:35 pm

Post by Gauss »

brutha wrote:-> zwischen 8 und ) ein blank lassen
Oder ein Häkchen vor "Disable Smilies in this post" setzen ...

Da wird sowieso viel zu selten ein Häkchen gesetzt.
User avatar
dippu
Euro-Expert
Euro-Expert
Posts: 599
Joined: Wed Dec 15, 2004 10:53 pm
Location: Berlin, Germany
Contact:

Re: Städte-Ranglisten TOP 10

Post by dippu »

Volker W wrote: Von mir große Glückwünsche an Euch, und vielen Dank an Dich dippu für Deine Mühe mit der Liste und den netten Kommentaren
Hallo Volker,
kein Problem ich mach das doch gern. So kann man sich wenigstens an der Berlin-Liste erfreuen wenn mal wieder eine Hitflaute herrscht (du waerst ja eigentlich auch schon wieder laengst ueberfaellig mit einem Treffer). Vielleicht bringen wir auch irgendwann gemeinsam Berlin in der Staedterangliste voran - hellogs kommt ja bald helfen :wink:
User avatar
Nivram
Euro-Expert in Training
Euro-Expert in Training
Posts: 330
Joined: Fri Apr 01, 2005 3:07 pm
Contact:

Perl-Skript für Ranglisten

Post by Nivram »

Hab am Wochenende mal bisschen rumgetippt. Ist folgendes dabei rausgekommen:

Ein Perl-Skript zur automatischen Erstellung der Ranglisten.
(sorry für die Länge des Beitrags)

Code: Select all

#!/usr/bin/perl -w

use strict;
use Getopt::Std;

my $town = "Stuttgart";

# insert the names of the users here
my @topnames = ( 'nessie', 'MartinR', 'redcrew', 'RaF', 'Nivram', 'Hase',
                 'Nikolai Reininger', 'Gumble', 'igelwald', 'knospe' );

# test
#&printarray( @topnames );
#print $#topnames;


# not necessary, but i like it sorted ;-)
# (case-insensitive sort)
my @topsorted = sort {uc($a) cmp uc($b)} @topnames;

# test
#&printarray( @topsorted );


# hashes which assign the old resp. new number of bills ( = integer )
# to the according name in topsorted
# so: name(topsorted) => no of bills
my %oldnobills;
my %newnobills;


# read the number of bills from STDIN
&readnobills;


# test
foreach ( keys %oldnobills )
{
    my $value = $oldnobills{$_};
    #print "$_: $value\n";
}


# hash which assigns the old rank ( = integer from 1 ...)
# to the according name in topsorted
# so: name(topsorted) => old rank
my %oldrank = %oldnobills;

# the highest number is set to 1, 2, 3...
# (assuming that the number of bills of the topnames
# is greater than the number of places)
for ( my $i=0; $i<=$#topnames; $i++)
{
    my $max  = 0;
    my $name = "";

    foreach ( keys %oldrank )
    {
        if ( $oldrank{$_} > $max )
        {
            $max  = $oldrank{$_};
            $name = $_;
        }
    }

    #print "$i+1: $name ($oldrank{$name})\n";
    $oldrank{$name} = $i+1;
}

# test
foreach ( keys %oldrank )
{
    my $value = $oldrank{$_};
    #print "$_: $value\n";
}


# print sorted topnames:
# Rank, (old rank), name, no of bills, (difference relative to last time)

print "\n$town Top 10:\n";
my $i = 1;

foreach ( sort {$newnobills{$b} <=> $newnobills{$a}} keys %newnobills )
{
    my $diff = "";
    if ( $newnobills{$_} - $oldnobills{$_} == 0 )
    {
        $diff = "inaktiv";
    }
    else
    {
        my $tmp = $newnobills{$_} - $oldnobills{$_};
        $diff = "+$tmp";
    }
    
    printf "%02d. (%02d.) %s %7d (%s)\n",
    $i, $oldrank{$_}, $_, $newnobills{$_}, $diff;
    
    $i++;
}

print "\n$town Top 10 gesamt: ";

my $newsumofbills = 0;
my $oldsumofbills = 0;

foreach ( keys %newnobills )
{
    $newsumofbills = $newsumofbills + $newnobills{$_};
    $oldsumofbills = $oldsumofbills + $oldnobills{$_};
}

my $diff = $newsumofbills - $oldsumofbills;
print "$newsumofbills (+$diff)\n";

exit;





sub printarray
{
    my @values = @_;

    foreach my $value ( @values )
    {
        print $value, ' ';
    }
    print "\n";
}





sub readnobills
{
    foreach ( @topsorted )
    {
        print "Old number of bills for user '$_' \t: ";
        my $tmp = <STDIN>;
        chomp( $tmp );
        $oldnobills{$_} = $tmp;
    }
    
    foreach ( @topsorted )
    {
        print "New number of bills for user '$_' \t: ";
        my $tmp = <STDIN>;
        chomp( $tmp );
        $newnobills{$_} = $tmp;
    }
}
Bedienungsanleitung:

1) Stadt und Benutzer für Eure Stadt anpassen.
2) Das Ganze z.B. unter "ebtTop10.pl" abspeichern.
3) Ausführbar machen "chmod u+x ebtTop10.pl" und
4) Starten "perl ebtTop10.pl" !

Die Schrift-Farben und -Größen müssen dann natürlich im Nachhinein noch eingearbeitet werden.

Mit Perl unter Windows habe ich leider keine Erfahrung. Vielleicht kann dazu noch jemand eine Anleitung schreiben. (Naja, wer Perl benutzt, wird auch wissen, wie man es unter dem jeweiligen System ausführt...)

VORSICHT!
Ich habe es noch nicht an "Realdaten" getestet.
Sehe jetzt so auf Anhieb zwar keine Inplausibilitäten mehr, aber probiert es erst mal "außer Konkurrenz" und PMt mir, wenn Euch was auffällt.

Bemerkung: Es müsste auch für Top15, Top20,... funktionieren. -> dito ausprobieren.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
User avatar
Nivram
Euro-Expert in Training
Euro-Expert in Training
Posts: 330
Joined: Fri Apr 01, 2005 3:07 pm
Contact:

Re: Perl-Skript für Ranglisten

Post by Nivram »

Nivram wrote: Ein Perl-Skript zur automatischen Erstellung der Ranglisten.
Nachschlag:

zur Generierung von BBCode, um es hier ins Forum zu setzen:

Code: Select all

sub printbbcode
{
# print sorted topnames for pasting into BBCode-abel forums
# rank, (old rank), name, no of bills, (difference relative to last time)

    print "\n[color=green][size=18]$town Top 10:[/size][/color]\n";
    my $i = 1;

    foreach my $name ( sort {$newnobills{$b} <=> $newnobills{$a}}
                    keys %newnobills )
    {
        # rank
        printf "%02d. ", $i;
        
        # old rank
        if ( $oldrank{$name} < $i )
        {
            printf "[color=green](%02d.)[/color] ", $oldrank{$name};
        }
        elsif ( $oldrank{$name} > $i )
        {
            printf "[color=red](%02d.)[/color] ", $oldrank{$name};
        }
        else
        {
            printf "(%02d.) ", $oldrank{$name};
        }

        # name
        
        # hash which assigns the user id to the name
        # so: name => user id
        # (necessary for the link to user)
        my %userid = ( 'nessie' => 10038, 'MartinR' => 9511,
                       'redcrew' => 28642, 'RaF' => 2651,
                       'Nivram' => 40342, 'Hase' => 2502,
                       'Nikolai Reininger' => 9439, 'Gumble' => 33632,
                       'igelwald' => 37410, 'knospe' => 32771 );
        
        printf "[url=http://eurobilltracker.eu/index.php?command=2048;id=%d;]%s[/url] ", $userid{$name}, $name;
        
        # no of bills, diff

        my $diff = "";

        if ( $newnobills{$name} - $oldnobills{$name} == 0 )
        {
            $diff = "inaktiv";
        }
        else
        {
            my $tmp = $newnobills{$name} - $oldnobills{$name};
            $diff = "+$tmp";
        }
        
        printf "[b]%7d[/b] (%s)\n", $newnobills{$name}, $diff;
        
        $i++;
    }
    
    # summary

    my $newsumofbills = 0;
    my $oldsumofbills = 0;
    
    foreach my $name ( keys %newnobills )
    {
        $newsumofbills = $newsumofbills + $newnobills{$name};
        $oldsumofbills = $oldsumofbills + $oldnobills{$name};
    }
    
    my $diff = $newsumofbills - $oldsumofbills;
    my $nousers = $#topnames+1;

    print "\n[b]$town Top $nousers\[/b] gesamt: ";
    print "$newsumofbills (+$diff)\n";
}
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
joergb30
Euro-Master
Euro-Master
Posts: 3924
Joined: Thu Oct 30, 2003 1:59 am
Location: Kassel, Germany

Post by joergb30 »

Das wäre ja genial, es würde einem eine Unmenge stupider Rechnerei ersparen. :D

Wenn die Sache allgemein bekannt ist wird vielleicht die Motivation bei einigen wieder steigen, ihre eigenen Statistiken auf Vordermann zu bringen, weil sie dazu viel weniger Zeit benötigen werden.
(die internationalen Top 50 z.B. sind schon seit 2 Wochen überfällig :roll: )

Wie ist dieser Punkt gemeint?
3) Ausführbar machen "chmod u+x ebtTop10.pl
Hangman
Euro-Regular
Euro-Regular
Posts: 162
Joined: Sat Jan 22, 2005 6:22 pm
Location: Kleve / Germany
Contact:

Post by Hangman »

das is n befehl in linux. damit wird die berechtigung für die datei gesetzt, so dass jeder user die ausfürhen kann, wenn ich das jetzt richtig hab^^
das muss sein, damit das script überhaupt richtig laufen kann^^
Raurakgan
Euro-Expert in Training
Euro-Expert in Training
Posts: 359
Joined: Fri Jun 17, 2005 9:03 pm
Location: Köln , Cologne , Bangkok

Post by Raurakgan »

Hi,

hab zwar selber keine Ahnung vom programmieren deswegen nur die Frage ob das Programm auch die 11te Seite lesen kann ? Denn soweit ich weiss lassen sich die Mitglieder einer Stadt, wenn sie mehr als 300 hat, nicht mehr anzeigen.

Gruss aus Köln

Raurakgan
User avatar
Nivram
Euro-Expert in Training
Euro-Expert in Training
Posts: 330
Joined: Fri Apr 01, 2005 3:07 pm
Contact:

Post by Nivram »

Raurakgan wrote:... nur die Frage ob das Programm auch die 11te Seite lesen kann ?
Sorry, lesen kann das Skript gar nix. Es rechnet nur.
Es fragt Dich nach der Anzahl der (damals und heute) eingegebenen Scheine der Benutzer, die Du bestimmst (in den ersten paar Zeilen).

Aber wenn Du die Benutzer einmal gefunden hast, kannst Du sie ja in der Rangliste (mit Hilfe ihrer ID) verlinken. Dann musst Du nicht jedes mal aufs Neue suchen, sondern kannst dann immer nur draufklicken um nachzuschauen, wieviele Scheine er nun hat. (Siehe Bspe. auf Seite 1.)

Wie ich das sehe, bleibt nur zu hoffen, dass sich die Top 10 auf den dargestellten Seiten befinden, sonst kann da vielleicht höchstens noch der Admin was machen. (Oder man gibt die IDs der Benutzer ein, aber bei >60.000 Leuten... eher nicht)

PS: Ich habe das Skript inzwischen so weit gebracht, dass es die neuen Werte abspeichert und das nächste mal als default-Eingabe für die alten vorschlägt.
Last edited by Nivram on Tue Jul 19, 2005 3:15 pm, edited 1 time in total.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
User avatar
Nivram
Euro-Expert in Training
Euro-Expert in Training
Posts: 330
Joined: Fri Apr 01, 2005 3:07 pm
Contact:

source

Post by Nivram »

So, hab die aktuelle Version jetzt mal zum Herunterladen bereitgestellt.

Wie gesagt, Anregung, Kritik,... willkommen.
Last edited by Nivram on Fri Jul 22, 2005 4:14 pm, edited 3 times in total.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
User avatar
Licht & Feuer
Euro-Master
Euro-Master
Posts: 1749
Joined: Tue May 10, 2005 5:44 pm
Location: Im Osten des Westens der auch als Süden des Nordens betrachtet wird
Contact:

Post by Licht & Feuer »

Also ich muß jetzt mal was ganz blödes fragen :oops: da ich leider 0 Ahnung von Informatik habe...

Ich kriege jetzt das Skript im Explorer angezeigt, wie starte ich es bzw. bringe es mit der EBT-Datenbank zusammen?
Hangman
Euro-Regular
Euro-Regular
Posts: 162
Joined: Sat Jan 22, 2005 6:22 pm
Location: Kleve / Germany
Contact:

Post by Hangman »

ich befürchte, dass das mit windows ziemlich kompliziert wird :(
um das script zu nutzen, braucht man perl, was normalerweise (so weit ich weiss) unter linux nicht installiert ist...

man könnte allerdings überlegen, das ganze auf webspace hochzuladen, der perl hat und dann mit einem ftp-programm, dass auch konsolen-eingabe unterstützt die abfrage machen... oder seh ichd as jetzt falsch Nivram?

dazu könnte man dann ja mal ein tutorial schreiben....

/EDIT: bzw wie wäre es, wenn man das ganze so weiter bearbeitet, dass man ne html eingabe machen kann und dann auch ne ausgabe bekommt... ich glaub das werd ich mal probieren und dann das script hochladen, so dass jeder der will drauf zugreifen kann^^ sollte doch net so schwer sein...
User avatar
Nivram
Euro-Expert in Training
Euro-Expert in Training
Posts: 330
Joined: Fri Apr 01, 2005 3:07 pm
Contact:

Post by Nivram »

Hangman wrote:ich befürchte, dass das mit windows ziemlich kompliziert wird :(
um das script zu nutzen, braucht man perl, was normalerweise (so weit ich weiss) unter linux nicht installiert ist...
Doch, ich denke schon. Unter Linux ist, glaube ich, perl standardmäßig installiert.
Nur für Windows muss man es sich runterladen.

edit:
auf http://www.perl.org/get.html zu lesen
"If you are running a Linux (or most UNIX) system, you probably already have a perl that was packaged with it. Type perl -v at the command line to find out which version."
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Hangman
Euro-Regular
Euro-Regular
Posts: 162
Joined: Sat Jan 22, 2005 6:22 pm
Location: Kleve / Germany
Contact:

Post by Hangman »

na toll.... hab ich wieder alles verdreht^^

ich meinte, dass das bei windows nicht standardmässig installiert ist -.-

hab aber leichte probleme mit perl^^ kann ich an sich net und versteh es auch ent so auf anhieb^^ ich könnte wenn dann mein glück an nem php script versuchen^^
joergb30
Euro-Master
Euro-Master
Posts: 3924
Joined: Thu Oct 30, 2003 1:59 am
Location: Kassel, Germany

Re: source

Post by joergb30 »

Nivram wrote:So, hab die aktuelle Version jetzt mal zum Herunterladen bereitgestellt:
http://www.kybs.de/~marvin/ebtTop10.pl

Wie gesagt, Anregung, Kritik,... willkommen.
Ich habe deine neue Version gerade getestet, das Resultat sieht für den Anfang sehr gut aus.
Wäre es denn machbar, das komplette Resultat, so wie es im Dos-Fenster angezeigt wird, als Datei auszugeben?
Bisher steht ja in der Ausgabedatei nur der neue Stand der eingegebenen Scheine.

Diese Meldung kommt jedes Mal bei der Anforderung der "old number of bills":
"Use of unitialized value in concatenation <.> or string at ebtTop10.pl line 301.
Post Reply

Return to “Statistiken & Spiele”