#!/usr/bin/perl -w # Wrapper around trace_moves to collect stats around all solutions in # a single file. use strict; use constant TRACE_MOVES => "./trace_moves"; sub output_stats(@) { my (@values) = @_; my $count = scalar @values; my $sum = 0; $sum += $_ foreach @values; print "min = $values[0]\n", "first quartile = ", $values[int($count / 4)], "\n", "median = ", $values[int($count / 2)], "\n", "last quartile = ", $values[int(3 * $count / 4)], "\n", "max = $values[$#values]\n", "average = ", $sum / $count, "\n"; } if( $#ARGV != 0 ) { die "$0 \n"; } # Collect data open my $input, "<$ARGV[0]" or die $!; my @scores = (); my @chains = (); my $premature_deaths = 0; while( my $solution = <$input> ) { next unless $solution =~ /^ruby \S+\.rb (\d+) ([hjkl]+)/; my ($seed, $moves) = ($1, $2); my $cmd = TRACE_MOVES . " $seed $moves"; open my $pipe, "$cmd|" or die $!; while( my $trace = <$pipe> ) { if( $trace =~ /Final score = (\d+)/ ) { push @scores, $1; } elsif( $trace =~ /\((\d+) chain\)/ ) { push @chains, $1; } elsif( $trace =~ /Game over/ ) { $premature_deaths++; } } close $pipe; } close $input; # Output stats print "Scores (", (scalar @scores), "):\n"; output_stats(sort {$a <=> $b} @scores); print "\nChains (", (scalar @chains), "):\n"; output_stats(sort {$a <=> $b} @chains); print "\nPremature deaths = $premature_deaths\n";