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