I thought it might be interesting to track how people's solutions
changed over the course of the game.  Thanks to PGAS and
Algorithm::Diff, this was easily done.  Here's the script, which
produces output suitable for either humans or gnuplot, in case you
want to take a look.

/s
#!perl

use XMLRPC::Lite;
use Algorithm::Diff qw(diff);
use Data::Dumper;
use strict;

my ($golfer, $hole) = @ARGV;
unless ($golfer && $hole) {
    die <<END;
Usage:
        $0 GOLFER HOLE
        perl -s $0 -V GOLFER HOLE
END
}

sub pgas {
    my ($func, @args) = @_;
    my $res = XMLRPC::Lite
        -> proxy('http://perlgolf.sourceforge.net/cgi-bin/PGAS/service')
            -> call("PGAS.$func", @args)
                -> result;
    $res;
}

my $data;
if (-f "solns.$golfer") {
    print STDERR "Found cached file for $golfer\n";
    $data = do "solns.$golfer";
} else {
    my $id = pgas('getGolferID', $golfer)->[0]{id};
    $data = pgas('getSolutionsByGolfer', $id);
    open(O, ">solns.$golfer");
    print O Dumper $data;
    close(O);
}
my @solns = map { [$_->{solution}, $_->{date}] } grep { $_->{hole} eq
$hole } @$data;
print STDERR @solns." solutions found in ".@{$data}." keys\n";

my $prev = shift @solns;
$prev = $prev->[0];
$prev =~ s/^#!perl[\s\r\n]*//gs;
$prev =~ s/[\r\n]+/ /gs;
if ($::V) {
    print "\t\t$prev\n";
} else {
    print "# $golfer\n";
}

$prev = [split '', $prev];
my ($cur, $t);
while ($cur = shift @solns) {
    ($cur, $t) = @$cur;
    $cur =~ s/^#!perl[\s\r\n]*//gs;
    $cur =~ s/[\r\n]+/ /gs;
    my $pretty = $cur;
    $cur = [split '', $cur];
    my @diff = diff($prev, $cur);
    my $ndiffs = 0;
    my %delta = ();
    foreach (@diff) {
        # This counts a replacement as 2 operations:
#       $ndiffs += @$_;
        foreach (@$_) {
            $delta{$_->[1]} = 1;
        }
    }
    $ndiffs = keys %delta;
    if ($::V) {
        print "Diff = $ndiffs\t$pretty\n";
    } else {
        print "$t\t$ndiffs\n";
    }
    $prev = $cur;
}

if (!$::V) {
    print "\n\n";
}


__________________________________________________
Do You Yahoo!?
LAUNCH - Your Yahoo! Music Experience
http://launch.yahoo.com

Reply via email to